Initial commit
This commit includes the initial code provided by the CEA to the Eclipse repository.
Also by: Etienne Gandrille <etienne.gandrille@cea.fr>
Also by: Jander Botelho do Nascimento <jbotnascimento@gmail.com>
diff --git a/LICENSE.txt b/LICENSE.txt
new file mode 100644
index 0000000..7e2d6e9
--- /dev/null
+++ b/LICENSE.txt
@@ -0,0 +1,11 @@
+====
+ Copyright (c) 2017 CEA.
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+
+ Contributors:
+ CEA - initial API and implementation and/or initial documentation
+====
+
diff --git a/README b/README
new file mode 100644
index 0000000..d0179d9
--- /dev/null
+++ b/README
@@ -0,0 +1 @@
+Monitoring and service composition using sensiNact Iot Gateway.
diff --git a/distribution/studio-product/Sensinact.product b/distribution/studio-product/Sensinact.product
new file mode 100644
index 0000000..26a48b4
--- /dev/null
+++ b/distribution/studio-product/Sensinact.product
@@ -0,0 +1,500 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?pde version="3.5"?>
+
+<product name="Sensinact Studio" uid="SensinactStudio" id="org.eclipse.sensinact.studio.language.sensinact.sensinact" application="org.eclipse.ui.ide.workbench" version="1.0.0.qualifier" useFeatures="false" includeLaunchers="true">
+
+ <aboutInfo>
+ <image path="/org.eclipse.sensinact.studio.ui.common/images/icons/icon128.png"/>
+ <text>
+ Sensinact Studio
+ </text>
+ </aboutInfo>
+
+ <configIni use="default">
+ </configIni>
+
+ <launcherArgs>
+ <programArgs>-consoleLog
+ </programArgs>
+ <vmArgs>-Dosgi.requiredJavaVersion=1.6 -XX:MaxPermSize=256m -Xms128m -Xmx1024m
+ </vmArgs>
+ <vmArgsMac>-XstartOnFirstThread -Dorg.eclipse.swt.internal.carbon.smallFonts
+ </vmArgsMac>
+ </launcherArgs>
+
+ <windowImages i16="/org.eclipse.sensinact.studio.ui.common/images/icons/icon16.png" i32="/org.eclipse.sensinact.studio.ui.common/images/icons/icon32.png" i48="/org.eclipse.sensinact.studio.ui.common/images/icons/icon48.png" i64="/org.eclipse.sensinact.studio.ui.common/images/icons/icon64.png" i128="/org.eclipse.sensinact.studio.ui.common/images/icons/icon128.png" i256="/org.eclipse.sensinact.studio.ui.common/images/icons/icon256.png"/>
+
+ <splash
+ location="org.eclipse.sensinact.studio.language.sensinact" />
+ <launcher>
+ <solaris/>
+ <win useIco="false">
+ <bmp/>
+ </win>
+ </launcher>
+
+ <vm>
+ <linux include="false">org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7</linux>
+ </vm>
+
+ <license>
+ <url>https://www.eclipse.org/org/documents/epl-v10.php</url>
+ <text>
+ Eclipse Public License - v 1.0
+
+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.
+
+1. DEFINITIONS
+
+"Contribution" means:
+
+a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and
+
+b) in the case of each subsequent Contributor:
+
+i) changes to the Program, and
+
+ii) additions to the Program;
+
+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.
+
+"Contributor" means any person or entity that distributes the Program.
+
+"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.
+
+"Program" means the Contributions distributed in accordance with this Agreement.
+
+"Recipient" means anyone who receives the Program under this Agreement, including all Contributors.
+
+2. GRANT OF RIGHTS
+
+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.
+
+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.
+
+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.
+
+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.
+
+3. REQUIREMENTS
+
+A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that:
+
+a) it complies with the terms and conditions of this Agreement; and
+
+b) its license agreement:
+
+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;
+
+ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits;
+
+iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and
+
+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.
+
+When the Program is made available in source code form:
+
+a) it must be made available under this Agreement; and
+
+b) a copy of this Agreement must be included with each copy of the Program.
+
+Contributors may not remove or alter any copyright notices contained within the Program.
+
+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.
+
+4. COMMERCIAL DISTRIBUTION
+
+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.
+
+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.
+
+5. NO WARRANTY
+
+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.
+
+6. DISCLAIMER OF LIABILITY
+
+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.
+
+7. GENERAL
+
+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.
+
+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.
+
+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.
+
+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.
+
+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.
+ </text>
+ </license>
+
+ <plugins>
+ <plugin id="com.google.guava"/>
+ <plugin id="com.google.inject"/>
+ <plugin id="com.ibm.icu"/>
+ <plugin id="javax.annotation"/>
+ <plugin id="javax.inject"/>
+ <plugin id="javax.xml"/>
+ <plugin id="org.antlr.runtime"/>
+ <plugin id="org.apache.ant"/>
+ <plugin id="org.apache.batik.css"/>
+ <plugin id="org.apache.batik.util"/>
+ <plugin id="org.apache.batik.util.gui"/>
+ <plugin id="org.apache.commons.cli"/>
+ <plugin id="org.apache.commons.codec"/>
+ <plugin id="org.apache.commons.jxpath"/>
+ <plugin id="org.apache.commons.lang"/>
+ <plugin id="org.apache.commons.logging"/>
+ <plugin id="org.apache.felix.gogo.command"/>
+ <plugin id="org.apache.felix.gogo.runtime"/>
+ <plugin id="org.apache.felix.gogo.shell"/>
+ <plugin id="org.apache.httpcomponents.httpclient"/>
+ <plugin id="org.apache.httpcomponents.httpcore"/>
+ <plugin id="org.apache.log4j"/>
+ <plugin id="org.eclipse.ant.core"/>
+ <plugin id="org.eclipse.ant.launching"/>
+ <plugin id="org.eclipse.ant.ui"/>
+ <plugin id="org.eclipse.compare"/>
+ <plugin id="org.eclipse.compare.core"/>
+ <plugin id="org.eclipse.core.commands"/>
+ <plugin id="org.eclipse.core.contenttype"/>
+ <plugin id="org.eclipse.core.databinding"/>
+ <plugin id="org.eclipse.core.databinding.beans"/>
+ <plugin id="org.eclipse.core.databinding.observable"/>
+ <plugin id="org.eclipse.core.databinding.property"/>
+ <plugin id="org.eclipse.core.expressions"/>
+ <plugin id="org.eclipse.core.externaltools"/>
+ <plugin id="org.eclipse.core.filebuffers"/>
+ <plugin id="org.eclipse.core.filesystem"/>
+ <plugin id="org.eclipse.core.filesystem.java7" fragment="true"/>
+ <plugin id="org.eclipse.core.filesystem.linux.x86_64" fragment="true"/>
+ <plugin id="org.eclipse.core.jobs"/>
+ <plugin id="org.eclipse.core.net"/>
+ <plugin id="org.eclipse.core.net.linux.x86_64" fragment="true"/>
+ <plugin id="org.eclipse.core.resources"/>
+ <plugin id="org.eclipse.core.runtime"/>
+ <plugin id="org.eclipse.core.runtime.compatibility.registry" fragment="true"/>
+ <plugin id="org.eclipse.core.variables"/>
+ <plugin id="org.eclipse.debug.core"/>
+ <plugin id="org.eclipse.debug.ui"/>
+ <plugin id="org.eclipse.draw2d"/>
+ <plugin id="org.eclipse.e4.core.commands"/>
+ <plugin id="org.eclipse.e4.core.contexts"/>
+ <plugin id="org.eclipse.e4.core.di"/>
+ <plugin id="org.eclipse.e4.core.di.annotations"/>
+ <plugin id="org.eclipse.e4.core.di.extensions"/>
+ <plugin id="org.eclipse.e4.core.services"/>
+ <plugin id="org.eclipse.e4.emf.xpath"/>
+ <plugin id="org.eclipse.e4.ui.bindings"/>
+ <plugin id="org.eclipse.e4.ui.css.core"/>
+ <plugin id="org.eclipse.e4.ui.css.swt"/>
+ <plugin id="org.eclipse.e4.ui.css.swt.theme"/>
+ <plugin id="org.eclipse.e4.ui.di"/>
+ <plugin id="org.eclipse.e4.ui.dialogs"/>
+ <plugin id="org.eclipse.e4.ui.model.workbench"/>
+ <plugin id="org.eclipse.e4.ui.services"/>
+ <plugin id="org.eclipse.e4.ui.swt.gtk" fragment="true"/>
+ <plugin id="org.eclipse.e4.ui.widgets"/>
+ <plugin id="org.eclipse.e4.ui.workbench"/>
+ <plugin id="org.eclipse.e4.ui.workbench.addons.swt"/>
+ <plugin id="org.eclipse.e4.ui.workbench.renderers.swt"/>
+ <plugin id="org.eclipse.e4.ui.workbench.swt"/>
+ <plugin id="org.eclipse.e4.ui.workbench3"/>
+ <plugin id="org.eclipse.ecf"/>
+ <plugin id="org.eclipse.ecf.filetransfer"/>
+ <plugin id="org.eclipse.ecf.identity"/>
+ <plugin id="org.eclipse.ecf.provider.filetransfer"/>
+ <plugin id="org.eclipse.ecf.provider.filetransfer.ssl" fragment="true"/>
+ <plugin id="org.eclipse.ecf.ssl" fragment="true"/>
+ <plugin id="org.eclipse.emf"/>
+ <plugin id="org.eclipse.emf.ant"/>
+ <plugin id="org.eclipse.emf.cheatsheets"/>
+ <plugin id="org.eclipse.emf.codegen"/>
+ <plugin id="org.eclipse.emf.codegen.ecore"/>
+ <plugin id="org.eclipse.emf.codegen.ecore.ui"/>
+ <plugin id="org.eclipse.emf.codegen.ecore.xtext"/>
+ <plugin id="org.eclipse.emf.codegen.ecore.xtext.ui"/>
+ <plugin id="org.eclipse.emf.codegen.ui"/>
+ <plugin id="org.eclipse.emf.common"/>
+ <plugin id="org.eclipse.emf.common.source"/>
+ <plugin id="org.eclipse.emf.common.ui"/>
+ <plugin id="org.eclipse.emf.converter"/>
+ <plugin id="org.eclipse.emf.databinding"/>
+ <plugin id="org.eclipse.emf.databinding.edit"/>
+ <plugin id="org.eclipse.emf.doc"/>
+ <plugin id="org.eclipse.emf.ecore"/>
+ <plugin id="org.eclipse.emf.ecore.change"/>
+ <plugin id="org.eclipse.emf.ecore.change.edit"/>
+ <plugin id="org.eclipse.emf.ecore.edit"/>
+ <plugin id="org.eclipse.emf.ecore.editor"/>
+ <plugin id="org.eclipse.emf.ecore.source"/>
+ <plugin id="org.eclipse.emf.ecore.xcore"/>
+ <plugin id="org.eclipse.emf.ecore.xcore.edit"/>
+ <plugin id="org.eclipse.emf.ecore.xcore.exporter"/>
+ <plugin id="org.eclipse.emf.ecore.xcore.importer"/>
+ <plugin id="org.eclipse.emf.ecore.xcore.lib"/>
+ <plugin id="org.eclipse.emf.ecore.xcore.ui"/>
+ <plugin id="org.eclipse.emf.ecore.xmi"/>
+ <plugin id="org.eclipse.emf.edit"/>
+ <plugin id="org.eclipse.emf.edit.ui"/>
+ <plugin id="org.eclipse.emf.exporter"/>
+ <plugin id="org.eclipse.emf.importer"/>
+ <plugin id="org.eclipse.emf.importer.ecore"/>
+ <plugin id="org.eclipse.emf.importer.java"/>
+ <plugin id="org.eclipse.emf.importer.rose"/>
+ <plugin id="org.eclipse.emf.mapping"/>
+ <plugin id="org.eclipse.emf.mapping.ecore"/>
+ <plugin id="org.eclipse.emf.mapping.ecore.editor"/>
+ <plugin id="org.eclipse.emf.mapping.ecore2ecore"/>
+ <plugin id="org.eclipse.emf.mapping.ecore2ecore.editor"/>
+ <plugin id="org.eclipse.emf.mapping.ecore2xml"/>
+ <plugin id="org.eclipse.emf.mapping.ecore2xml.ui"/>
+ <plugin id="org.eclipse.emf.mapping.ui"/>
+ <plugin id="org.eclipse.emf.mwe.core"/>
+ <plugin id="org.eclipse.emf.mwe.utils"/>
+ <plugin id="org.eclipse.emf.mwe2.language"/>
+ <plugin id="org.eclipse.emf.mwe2.language.ui"/>
+ <plugin id="org.eclipse.emf.mwe2.launch"/>
+ <plugin id="org.eclipse.emf.mwe2.launch.ui"/>
+ <plugin id="org.eclipse.emf.mwe2.lib"/>
+ <plugin id="org.eclipse.emf.mwe2.runtime"/>
+ <plugin id="org.eclipse.emf.transaction"/>
+ <plugin id="org.eclipse.emf.validation"/>
+ <plugin id="org.eclipse.epp.package.dsl"/>
+ <plugin id="org.eclipse.equinox.app"/>
+ <plugin id="org.eclipse.equinox.bidi"/>
+ <plugin id="org.eclipse.equinox.common"/>
+ <plugin id="org.eclipse.equinox.console"/>
+ <plugin id="org.eclipse.equinox.ds"/>
+ <plugin id="org.eclipse.equinox.event"/>
+ <plugin id="org.eclipse.equinox.frameworkadmin"/>
+ <plugin id="org.eclipse.equinox.frameworkadmin.equinox"/>
+ <plugin id="org.eclipse.equinox.p2.artifact.repository"/>
+ <plugin id="org.eclipse.equinox.p2.console"/>
+ <plugin id="org.eclipse.equinox.p2.core"/>
+ <plugin id="org.eclipse.equinox.p2.director"/>
+ <plugin id="org.eclipse.equinox.p2.director.app"/>
+ <plugin id="org.eclipse.equinox.p2.directorywatcher"/>
+ <plugin id="org.eclipse.equinox.p2.discovery"/>
+ <plugin id="org.eclipse.equinox.p2.discovery.compatibility"/>
+ <plugin id="org.eclipse.equinox.p2.engine"/>
+ <plugin id="org.eclipse.equinox.p2.extensionlocation"/>
+ <plugin id="org.eclipse.equinox.p2.garbagecollector"/>
+ <plugin id="org.eclipse.equinox.p2.jarprocessor"/>
+ <plugin id="org.eclipse.equinox.p2.metadata"/>
+ <plugin id="org.eclipse.equinox.p2.metadata.repository"/>
+ <plugin id="org.eclipse.equinox.p2.operations"/>
+ <plugin id="org.eclipse.equinox.p2.publisher"/>
+ <plugin id="org.eclipse.equinox.p2.publisher.eclipse"/>
+ <plugin id="org.eclipse.equinox.p2.repository"/>
+ <plugin id="org.eclipse.equinox.p2.repository.tools"/>
+ <plugin id="org.eclipse.equinox.p2.touchpoint.eclipse"/>
+ <plugin id="org.eclipse.equinox.p2.touchpoint.natives"/>
+ <plugin id="org.eclipse.equinox.p2.transport.ecf"/>
+ <plugin id="org.eclipse.equinox.p2.ui"/>
+ <plugin id="org.eclipse.equinox.p2.ui.discovery"/>
+ <plugin id="org.eclipse.equinox.p2.ui.importexport"/>
+ <plugin id="org.eclipse.equinox.p2.ui.sdk"/>
+ <plugin id="org.eclipse.equinox.p2.updatesite"/>
+ <plugin id="org.eclipse.equinox.preferences"/>
+ <plugin id="org.eclipse.equinox.registry"/>
+ <plugin id="org.eclipse.equinox.security"/>
+ <plugin id="org.eclipse.equinox.security.ui"/>
+ <plugin id="org.eclipse.equinox.simpleconfigurator"/>
+ <plugin id="org.eclipse.equinox.simpleconfigurator.manipulator"/>
+ <plugin id="org.eclipse.equinox.util"/>
+ <plugin id="org.eclipse.help"/>
+ <plugin id="org.eclipse.jdt.compiler.apt" fragment="true"/>
+ <plugin id="org.eclipse.jdt.compiler.tool" fragment="true"/>
+ <plugin id="org.eclipse.jdt.core"/>
+ <plugin id="org.eclipse.jdt.core.manipulation"/>
+ <plugin id="org.eclipse.jdt.debug"/>
+ <plugin id="org.eclipse.jdt.debug.ui"/>
+ <plugin id="org.eclipse.jdt.junit"/>
+ <plugin id="org.eclipse.jdt.junit.core"/>
+ <plugin id="org.eclipse.jdt.junit.runtime"/>
+ <plugin id="org.eclipse.jdt.launching"/>
+ <plugin id="org.eclipse.jdt.ui"/>
+ <plugin id="org.eclipse.jem.util"/>
+ <plugin id="org.eclipse.jetty.util"/>
+ <plugin id="org.eclipse.jetty.websocket.api"/>
+ <plugin id="org.eclipse.jetty.websocket.client"/>
+ <plugin id="org.eclipse.jetty.websocket.common"/>
+ <plugin id="org.eclipse.jface"/>
+ <plugin id="org.eclipse.jface.databinding"/>
+ <plugin id="org.eclipse.jface.text"/>
+ <plugin id="org.eclipse.ltk.core.refactoring"/>
+ <plugin id="org.eclipse.ltk.ui.refactoring"/>
+ <plugin id="org.eclipse.nebula.visualization.xygraph"/>
+ <plugin id="org.eclipse.oomph.base"/>
+ <plugin id="org.eclipse.oomph.base.edit"/>
+ <plugin id="org.eclipse.oomph.p2"/>
+ <plugin id="org.eclipse.oomph.p2.core"/>
+ <plugin id="org.eclipse.oomph.p2.edit"/>
+ <plugin id="org.eclipse.oomph.p2.ui"/>
+ <plugin id="org.eclipse.oomph.preferences"/>
+ <plugin id="org.eclipse.oomph.setup"/>
+ <plugin id="org.eclipse.oomph.setup.edit"/>
+ <plugin id="org.eclipse.oomph.setup.p2"/>
+ <plugin id="org.eclipse.oomph.setup.p2.edit"/>
+ <plugin id="org.eclipse.oomph.ui"/>
+ <plugin id="org.eclipse.oomph.util"/>
+ <plugin id="org.eclipse.osgi"/>
+ <plugin id="org.eclipse.osgi.compatibility.state" fragment="true"/>
+ <plugin id="org.eclipse.osgi.services"/>
+ <plugin id="org.eclipse.osgi.util"/>
+ <plugin id="org.eclipse.pde.build"/>
+ <plugin id="org.eclipse.pde.core"/>
+ <plugin id="org.eclipse.pde.ds.core"/>
+ <plugin id="org.eclipse.pde.ds.ui"/>
+ <plugin id="org.eclipse.pde.launching"/>
+ <plugin id="org.eclipse.pde.ui"/>
+ <plugin id="org.eclipse.platform"/>
+ <plugin id="org.eclipse.search"/>
+ <plugin id="org.eclipse.sensinact.studio.http"/>
+ <plugin id="org.eclipse.sensinact.studio.language.sensinact"/>
+ <plugin id="org.eclipse.sensinact.studio.language.sensinact.ui"/>
+ <plugin id="org.eclipse.sensinact.studio.model.manager"/>
+ <plugin id="org.eclipse.sensinact.studio.model.resource"/>
+ <plugin id="org.eclipse.sensinact.studio.navigator.device"/>
+ <plugin id="org.eclipse.sensinact.studio.perspective"/>
+ <plugin id="org.eclipse.sensinact.studio.preferences"/>
+ <plugin id="org.eclipse.sensinact.studio.ui.common"/>
+ <plugin id="org.eclipse.sensinact.studio.view.outdoor"/>
+ <plugin id="org.eclipse.sensinact.studio.view.piax"/>
+ <plugin id="org.eclipse.sensinact.studio.view.projectexplorer"/>
+ <plugin id="org.eclipse.sensinact.studio.view.visualizer"/>
+ <plugin id="org.eclipse.sensinact.studio.webapp.indoor"/>
+ <plugin id="org.eclipse.sensinact.studio.webapp.outdoor"/>
+ <plugin id="org.eclipse.swt"/>
+ <plugin id="org.eclipse.swt.gtk.linux.x86_64" fragment="true"/>
+ <plugin id="org.eclipse.team.core"/>
+ <plugin id="org.eclipse.team.ui"/>
+ <plugin id="org.eclipse.text"/>
+ <plugin id="org.eclipse.ui"/>
+ <plugin id="org.eclipse.ui.browser"/>
+ <plugin id="org.eclipse.ui.cheatsheets"/>
+ <plugin id="org.eclipse.ui.console"/>
+ <plugin id="org.eclipse.ui.editors"/>
+ <plugin id="org.eclipse.ui.externaltools"/>
+ <plugin id="org.eclipse.ui.forms"/>
+ <plugin id="org.eclipse.ui.ide"/>
+ <plugin id="org.eclipse.ui.ide.application"/>
+ <plugin id="org.eclipse.ui.intro"/>
+ <plugin id="org.eclipse.ui.navigator"/>
+ <plugin id="org.eclipse.ui.navigator.resources"/>
+ <plugin id="org.eclipse.ui.themes"/>
+ <plugin id="org.eclipse.ui.trace"/>
+ <plugin id="org.eclipse.ui.views"/>
+ <plugin id="org.eclipse.ui.views.log"/>
+ <plugin id="org.eclipse.ui.views.properties.tabbed"/>
+ <plugin id="org.eclipse.ui.workbench"/>
+ <plugin id="org.eclipse.ui.workbench.source"/>
+ <plugin id="org.eclipse.ui.workbench.texteditor"/>
+ <plugin id="org.eclipse.update.configurator"/>
+ <plugin id="org.eclipse.wst.common.core"/>
+ <plugin id="org.eclipse.wst.common.emf"/>
+ <plugin id="org.eclipse.wst.common.emfworkbench.integration"/>
+ <plugin id="org.eclipse.wst.common.environment"/>
+ <plugin id="org.eclipse.wst.common.frameworks"/>
+ <plugin id="org.eclipse.wst.common.project.facet.core"/>
+ <plugin id="org.eclipse.wst.validation"/>
+ <plugin id="org.eclipse.xpand"/>
+ <plugin id="org.eclipse.xtend"/>
+ <plugin id="org.eclipse.xtend.core"/>
+ <plugin id="org.eclipse.xtend.ide"/>
+ <plugin id="org.eclipse.xtend.ide.common"/>
+ <plugin id="org.eclipse.xtend.lib"/>
+ <plugin id="org.eclipse.xtend.lib.macro"/>
+ <plugin id="org.eclipse.xtend.m2e"/>
+ <plugin id="org.eclipse.xtend.standalone"/>
+ <plugin id="org.eclipse.xtend.typesystem.emf"/>
+ <plugin id="org.eclipse.xtend2.lib"/>
+ <plugin id="org.eclipse.xtext"/>
+ <plugin id="org.eclipse.xtext.activities"/>
+ <plugin id="org.eclipse.xtext.builder"/>
+ <plugin id="org.eclipse.xtext.builder.standalone"/>
+ <plugin id="org.eclipse.xtext.common.types"/>
+ <plugin id="org.eclipse.xtext.common.types.edit"/>
+ <plugin id="org.eclipse.xtext.common.types.shared"/>
+ <plugin id="org.eclipse.xtext.common.types.shared.jdt38" fragment="true"/>
+ <plugin id="org.eclipse.xtext.common.types.ui"/>
+ <plugin id="org.eclipse.xtext.doc"/>
+ <plugin id="org.eclipse.xtext.ecore"/>
+ <plugin id="org.eclipse.xtext.generator"/>
+ <plugin id="org.eclipse.xtext.ide"/>
+ <plugin id="org.eclipse.xtext.idea.generator"/>
+ <plugin id="org.eclipse.xtext.java"/>
+ <plugin id="org.eclipse.xtext.junit4"/>
+ <plugin id="org.eclipse.xtext.logging" fragment="true"/>
+ <plugin id="org.eclipse.xtext.m2e"/>
+ <plugin id="org.eclipse.xtext.purexbase"/>
+ <plugin id="org.eclipse.xtext.purexbase.ui"/>
+ <plugin id="org.eclipse.xtext.smap"/>
+ <plugin id="org.eclipse.xtext.ui"/>
+ <plugin id="org.eclipse.xtext.ui.codetemplates"/>
+ <plugin id="org.eclipse.xtext.ui.codetemplates.ui"/>
+ <plugin id="org.eclipse.xtext.ui.ecore"/>
+ <plugin id="org.eclipse.xtext.ui.shared"/>
+ <plugin id="org.eclipse.xtext.util"/>
+ <plugin id="org.eclipse.xtext.xbase"/>
+ <plugin id="org.eclipse.xtext.xbase.ide"/>
+ <plugin id="org.eclipse.xtext.xbase.junit"/>
+ <plugin id="org.eclipse.xtext.xbase.lib"/>
+ <plugin id="org.eclipse.xtext.xbase.ui"/>
+ <plugin id="org.eclipse.xtext.xtext.generator"/>
+ <plugin id="org.eclipse.xtext.xtext.ui"/>
+ <plugin id="org.eclipse.xtext.xtext.ui.graph"/>
+ <plugin id="org.eclipse.xtext.xtext.wizard"/>
+ <plugin id="org.hamcrest.core"/>
+ <plugin id="org.json"/>
+ <plugin id="org.junit"/>
+ <plugin id="org.objectweb.asm"/>
+ <plugin id="org.restlet"/>
+ <plugin id="org.sat4j.core"/>
+ <plugin id="org.sat4j.pb"/>
+ <plugin id="org.tukaani.xz"/>
+ <plugin id="org.w3c.css.sac"/>
+ <plugin id="org.w3c.dom.events"/>
+ <plugin id="org.w3c.dom.smil"/>
+ <plugin id="org.w3c.dom.svg"/>
+ </plugins>
+
+ <configurations>
+ <plugin id="org.eclipse.equinox.ds" autoStart="true" startLevel="0" />
+ <plugin id="org.eclipse.equinox.event" autoStart="true" startLevel="0" />
+ <plugin id="org.eclipse.equinox.p2.director" autoStart="false" startLevel="0" />
+ <plugin id="org.eclipse.equinox.p2.discovery" autoStart="false" startLevel="0" />
+ <plugin id="org.eclipse.equinox.p2.engine" autoStart="false" startLevel="0" />
+ <plugin id="org.eclipse.equinox.p2.metadata" autoStart="false" startLevel="0" />
+ <plugin id="org.eclipse.equinox.p2.metadata.repository" autoStart="false" startLevel="0" />
+ <plugin id="org.eclipse.equinox.p2.reconciler.dropins" autoStart="false" startLevel="0" />
+ <plugin id="org.eclipse.equinox.p2.repository" autoStart="false" startLevel="0" />
+ <plugin id="org.eclipse.oomph.p2" autoStart="false" startLevel="0" />
+ <plugin id="org.eclipse.oomph.p2.core" autoStart="false" startLevel="0" />
+ <plugin id="org.eclipse.oomph.setup.p2" autoStart="false" startLevel="0" />
+ <property name="eclipse.p2.data.area" value="@config.dir/../p2/" />
+ <property name="eclipse.p2.profile" value="epp.package.dsl" />
+ <property name="equinox.use.ds" value="true" />
+ <property name="org.eclipse.update.install.features" value="true" />
+ <property name="org.eclipse.update.reconcile" value="false" />
+ <property name="osgi.splashPath" value="platform:/base/plugins/org.eclipse.sensinact.studio.language.sensinact" />
+ </configurations>
+
+ <repositories>
+ <repository location="http://download.eclipse.org/releases/mars" enabled="true" />
+ <repository location="http://download.eclipse.org/technology/nebula/snapshot" enabled="true" />
+ <repository location="http://p2.restlet.com/2.2/" enabled="true" />
+ <repository location="http://132.168.161.7/eclipse/" enabled="true" />
+ </repositories>
+
+ <preferencesInfo>
+ <targetfile overwrite="false"/>
+ </preferencesInfo>
+
+ <cssInfo>
+ </cssInfo>
+
+</product>
diff --git a/distribution/studio-product/debug.options b/distribution/studio-product/debug.options
new file mode 100644
index 0000000..4fb0632
--- /dev/null
+++ b/distribution/studio-product/debug.options
@@ -0,0 +1,100 @@
+#### Debugging options for org.eclipse.osgi
+
+# Turn on general debugging for org.eclipse.osgi
+org.eclipse.osgi/debug=false
+# Prints out class loading debug information
+org.eclipse.osgi/debug/loader=false
+# Prints out event (FrameworkEvent/BundleEvent/ServiceEvent) and listener debug information
+org.eclipse.osgi/debug/events=false
+# Prints out OSGi service debug information (registration/getting/ungetting etc.)
+org.eclipse.osgi/debug/services=false
+# Prints out bundle manifest parsing debug information
+org.eclipse.osgi/debug/manifest=false
+# Prints out LDAP filter debug information
+org.eclipse.osgi/debug/filter=false
+# Prints out security (PermissionAdmin service) debug information
+org.eclipse.osgi/debug/security=false
+# Prints out start level service debug information
+org.eclipse.osgi/debug/startlevel=false
+# Prints out package admin service debug information
+org.eclipse.osgi/debug/packageadmin=false
+# Prints out timing information for bundle activation
+org.eclipse.osgi/debug/bundleTime=false
+# Debug the loading of message bundles
+org.eclipse.osgi/debug/messageBundles=false
+# Debug the object pool additions
+org.eclipse.osgi/debug/objectPool/adds=false
+# Debug the object pool duplications
+org.eclipse.osgi/debug/objectPool/dups=false
+
+# Eclipse adaptor options
+org.eclipse.osgi/eclipseadaptor/debug = false
+org.eclipse.osgi/eclipseadaptor/debug/location = false
+org.eclipse.osgi/eclipseadaptor/debug/cachedmanifest = false
+org.eclipse.osgi/eclipseadaptor/debug/platformadmin=false
+org.eclipse.osgi/eclipseadaptor/debug/platformadmin/resolver=false
+org.eclipse.osgi/eclipseadaptor/converter/debug = false
+
+### OSGi resolver options
+# Turns on debugging for the resolver
+org.eclipse.osgi/resolver/debug = false
+# Prints out wiring information after the resolver has completed the resolve process
+org.eclipse.osgi/resolver/wiring = false
+# Prints out Import-Package information
+org.eclipse.osgi/resolver/imports = false
+# Prints out Require-Bundle information
+org.eclipse.osgi/resolver/requires = false
+# Prints out debug information form the "uses" clause
+org.eclipse.osgi/resolver/uses = false
+# Prints out cycle information
+org.eclipse.osgi/resolver/cycles = false
+# Prints out Eclipse-GenericRequire information
+org.eclipse.osgi/resolver/generics = false
+
+#### Profile settings
+org.eclipse.osgi/profile/startup = false
+org.eclipse.osgi/profile/benchmark = false
+org.eclipse.osgi/profile/debug = false
+
+# Override the default implemenation
+org.eclipse.osgi/profile/impl = org.eclipse.osgi.internal.profile.DefaultProfileLogger
+
+# Append all profile messages to the filename specified
+org.eclipse.osgi/defaultprofile/logfilename =
+
+# Output all profile log messages synchronously to the jvm console.
+# By default, all log messages are cached until the log buffer is
+# requested.
+org.eclipse.osgi/defaultprofile/logsynchronously = false
+
+# Specify the size of the default profile implementation log buffer.
+org.eclipse.osgi/defaultprofile/buffersize = 256
+
+#### Monitoring settings
+# monitor class loading
+org.eclipse.osgi/monitor/classes=false
+
+# monitor bundle activation
+org.eclipse.osgi/monitor/activation=false
+
+# monitor resource bundle (*.properties) loading
+org.eclipse.osgi/monitor/resources=false
+
+
+#### Trace settings
+# trace class loading - snapshot the execution stack when a class is loaded
+org.eclipse.osgi/trace/classLoading=false
+
+# trace location - file in which execution traces are written
+org.eclipse.osgi/trace/filename=runtime.traces
+
+# trace filters - Java properties file defining which classes should
+# be traced (if trace/classLoading is true)
+# File format:
+# plugins=<comma separated list of plugins whose classes to trace>
+# packages=<comma separated list of package prefixes of classes to trace>
+# Note that there may be many 'plugins' and 'packages' lines in one file.
+org.eclipse.osgi/trace/filters=trace.properties
+
+# trace bundle activation - snapshot the execution stack when a bundle is activated
+org.eclipse.osgi/trace/activation=false
diff --git a/distribution/studio-product/eclipseDebug.ini b/distribution/studio-product/eclipseDebug.ini
new file mode 100755
index 0000000..9686eac
--- /dev/null
+++ b/distribution/studio-product/eclipseDebug.ini
@@ -0,0 +1,3 @@
+-vmargs
+-Xdebug
+-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=1044
diff --git a/distribution/studio-site/site.xml b/distribution/studio-site/site.xml
new file mode 100644
index 0000000..7fd18a1
--- /dev/null
+++ b/distribution/studio-site/site.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Copyright (c) 2017 CEA.
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+
+ Contributors:
+ CEA - initial API and implementation and/or initial documentation
+
+-->
+<site>
+ <description name="Sensinact Eclipse Site" url="http://localhost/eclipse">
+ Eclipse Site
+ </description>
+ <feature url="features/org.eclipse.sensinact.studio.language.sensinact.sdk_1.0.0.201604131530.jar" id="org.eclipse.sensinact.studio.language.sensinact.sdk" version="1.0.0.201604131530">
+ <category name="sensinact"/>
+ </feature>
+ <category-def name="sensinact" label="sensinact">
+ <description>
+ Sensinact Plugins
+ </description>
+ </category-def>
+</site>
diff --git a/epl-v10.html b/epl-v10.html
new file mode 100644
index 0000000..df8dab9
--- /dev/null
+++ b/epl-v10.html
@@ -0,0 +1,259 @@
+<!--?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=UTF-8">
+<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>
\ No newline at end of file
diff --git a/notice.html b/notice.html
new file mode 100644
index 0000000..c417e6f
--- /dev/null
+++ b/notice.html
@@ -0,0 +1,163 @@
+<!--?xml version="1.0" encoding="ISO-8859-1" ?-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"><head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Eclipse Foundation Software User Agreement</title>
+</head>
+
+<body lang="EN-US">
+<h2>Eclipse Foundation Software User Agreement</h2>
+<p>April 9, 2014</p>
+
+<h3>Usage Of Content</h3>
+
+<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
+ (COLLECTIVELY "CONTENT"). USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
+ CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW. BY USING THE CONTENT, YOU AGREE THAT YOUR USE
+ OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
+ NOTICES INDICATED OR REFERENCED BELOW. IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
+ CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
+
+<h3>Applicable Licenses</h3>
+
+<p>Unless otherwise indicated, all Content made available by the Eclipse
+ Foundation is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0
+ ("EPL"). A copy of the EPL is provided with this Content and is also
+ available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+ For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>Content includes, but is not limited to, source code, object code,
+documentation and other files maintained in the Eclipse Foundation
+source code
+ repository ("Repository") in software modules ("Modules") and made
+available as downloadable archives ("Downloads").</p>
+
+<ul>
+ <li>Content may be structured and packaged into modules to
+facilitate delivering, extending, and upgrading the Content. Typical
+modules may include plug-ins ("Plug-ins"), plug-in fragments
+("Fragments"), and features ("Features").</li>
+ <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java™ ARchive) in a directory named "plugins".</li>
+ <li>A Feature is a bundle of one or more Plug-ins and/or
+Fragments and associated material. Each Feature may be packaged as a
+sub-directory in a directory named "features". Within a Feature, files
+named "feature.xml" may contain a list of the names and version numbers
+of the Plug-ins
+ and/or Fragments associated with that Feature.</li>
+ <li>Features may also include other Features ("Included
+Features"). Within a Feature, files named "feature.xml" may contain a
+list of the names and version numbers of Included Features.</li>
+</ul>
+
+<p>The terms and conditions governing Plug-ins and Fragments should be
+contained in files named "about.html" ("Abouts"). The terms and
+conditions governing Features and
+Included Features should be contained in files named "license.html"
+("Feature Licenses"). Abouts and Feature Licenses may be located in any
+ directory of a Download or Module
+including, but not limited to the following locations:</p>
+
+<ul>
+ <li>The top-level (root) directory</li>
+ <li>Plug-in and Fragment directories</li>
+ <li>Inside Plug-ins and Fragments packaged as JARs</li>
+ <li>Sub-directories of the directory named "src" of certain Plug-ins</li>
+ <li>Feature directories</li>
+</ul>
+
+<p>Note: if a Feature made available by the Eclipse Foundation is
+installed using the Provisioning Technology (as defined below), you must
+ agree to a license ("Feature Update License") during the
+installation process. If the Feature contains Included Features, the
+Feature Update License should either provide you with the terms and
+conditions governing the Included Features or
+inform you where you can locate them. Feature Update Licenses may be
+found in the "license" property of files named "feature.properties"
+found within a Feature.
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the
+terms and conditions (or references to such terms and conditions) that
+govern your use of the associated Content in
+that directory.</p>
+
+<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER
+TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.
+ SOME OF THESE
+OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
+
+<ul>
+ <li>Eclipse Distribution License Version 1.0 (available at <a href="http://www.eclipse.org/licenses/edl-v10.html">http://www.eclipse.org/licenses/edl-v1.0.html</a>)</li>
+ <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
+ <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
+ <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
+ <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
+</ul>
+
+<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND
+CONDITIONS PRIOR TO USE OF THE CONTENT. If no About, Feature License,
+or Feature Update License is provided, please
+contact the Eclipse Foundation to determine what terms and conditions
+govern that particular Content.</p>
+
+
+<h3>Use of Provisioning Technology</h3>
+
+<p>The Eclipse Foundation makes available provisioning software,
+examples of which include, but are not limited to, p2 and the Eclipse
+ Update Manager ("Provisioning Technology") for the purpose of
+allowing users to install software, documentation, information and/or
+ other materials (collectively "Installable Software"). This
+capability is provided with the intent of allowing such users to
+ install, extend and update Eclipse-based products. Information about
+packaging Installable Software is available at <a href="http://eclipse.org/equinox/p2/repository_packaging.html">http://eclipse.org/equinox/p2/repository_packaging.html</a>
+ ("Specification").</p>
+
+<p>You may use Provisioning Technology to allow other parties to install
+ Installable Software. You shall be responsible for enabling the
+ applicable license agreements relating to the Installable Software to
+ be presented to, and accepted by, the users of the Provisioning
+Technology
+ in accordance with the Specification. By using Provisioning
+Technology in such a manner and making it available in accordance with
+the
+ Specification, you further acknowledge your agreement to, and the
+acquisition of all necessary rights to permit the following:</p>
+
+<ol>
+ <li>A series of actions may occur ("Provisioning Process") in
+which a user may execute the Provisioning Technology
+ on a machine ("Target Machine") with the intent of installing,
+extending or updating the functionality of an Eclipse-based
+ product.</li>
+ <li>During the Provisioning Process, the Provisioning Technology
+may cause third party Installable Software or a portion thereof to be
+ accessed and copied to the Target Machine.</li>
+ <li>Pursuant to the Specification, you will provide to the user
+the terms and conditions that govern the use of the Installable
+ Software ("Installable Software Agreement") and such Installable
+Software Agreement shall be accessed from the Target
+ Machine in accordance with the Specification. Such Installable
+Software Agreement must inform the user of the terms and conditions that
+ govern
+ the Installable Software and must solicit acceptance by the end
+user in the manner prescribed in such Installable Software Agreement.
+Upon such
+ indication of agreement by the user, the provisioning Technology
+will complete installation of the Installable Software.</li>
+</ol>
+
+<h3>Cryptography</h3>
+
+<p>Content may contain encryption software. The country in which you are
+ currently may have restrictions on the import, possession, and use,
+and/or re-export to
+ another country, of encryption software. BEFORE using any encryption
+software, please check the country's laws, regulations and policies
+concerning the import,
+ possession, or use, and re-export of encryption software, to see if
+this is permitted.</p>
+
+<p><small>Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.</small></p>
+
+
+</body></html>
\ No newline at end of file
diff --git a/services/org.eclipse.sensinact.studio.http/META-INF/MANIFEST.MF b/services/org.eclipse.sensinact.studio.http/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..3eabf65
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.http/META-INF/MANIFEST.MF
@@ -0,0 +1,20 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Http
+Bundle-SymbolicName: org.eclipse.sensinact.studio.http
+Bundle-Version: 1.0.0.qualifier
+Bundle-Activator: org.eclipse.sensinact.studio.http.Activator
+Require-Bundle: org.eclipse.core.runtime,
+ org.json,
+ org.restlet,
+ org.eclipse.sensinact.studio.model.resource,
+ org.apache.log4j,
+ org.eclipse.sensinact.studio.preferences
+Bundle-RequiredExecutionEnvironment: JavaSE-1.7
+Bundle-ActivationPolicy: lazy
+Export-Package: org.eclipse.sensinact.studio.http.client,
+ org.eclipse.sensinact.studio.http.client.snamessage,
+ org.eclipse.sensinact.studio.http.client.snamessage.gateway,
+ org.eclipse.sensinact.studio.http.server,
+ org.eclipse.sensinact.studio.http.server.serverstarted
+Import-Package: org.apache.log4j
diff --git a/services/org.eclipse.sensinact.studio.http/about.html b/services/org.eclipse.sensinact.studio.http/about.html
new file mode 100644
index 0000000..3b39f88
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.http/about.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"><head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 5, 2006</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+
+</body></html>
\ No newline at end of file
diff --git a/services/org.eclipse.sensinact.studio.http/build.properties b/services/org.eclipse.sensinact.studio.http/build.properties
new file mode 100644
index 0000000..f489d86
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.http/build.properties
@@ -0,0 +1,15 @@
+#
+# Copyright (c) 2017 CEA.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+# CEA - initial API and implementation and/or initial documentation
+#
+
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .
diff --git a/services/org.eclipse.sensinact.studio.http/definition.target b/services/org.eclipse.sensinact.studio.http/definition.target
new file mode 100644
index 0000000..e4bdd75
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.http/definition.target
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?pde version="3.8"?><target name="Running Platform" sequenceNumber="5">
+<locations>
+<location path="${eclipse_home}" type="Profile"/>
+<location path="/home/nj246216/Images/bundlejetty" type="Directory"/>
+</locations>
+<environment>
+<os>linux</os>
+<ws>gtk</ws>
+<arch>x86_64</arch>
+<nl>fr_FR</nl>
+</environment>
+<launcherArgs>
+<vmArgs>-Dosgi.requiredJavaVersion=1.7 -XX:MaxPermSize=256m -Xms256m -Xmx1024m</vmArgs>
+</launcherArgs>
+</target>
diff --git a/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/Activator.java b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/Activator.java
new file mode 100644
index 0000000..dffecdc
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/Activator.java
@@ -0,0 +1,48 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.http;
+
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class Activator implements BundleActivator {
+
+ // The shared instance
+ private static Activator plugin;
+
+ /**
+ * The constructor
+ */
+ public Activator() {
+ }
+
+ @Override
+ public void start(BundleContext context) throws Exception {
+ plugin = this;
+ }
+
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ plugin = null;
+ }
+
+ /**
+ * Returns the shared instance
+ *
+ * @return the shared instance
+ */
+ public static Activator getDefault() {
+ return plugin;
+ }
+}
diff --git a/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/HTTP_CODE.java b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/HTTP_CODE.java
new file mode 100644
index 0000000..06d1978
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/HTTP_CODE.java
@@ -0,0 +1,142 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.http;
+
+import org.restlet.data.Status;
+
+/**
+ * @author Etienne Gandrille
+ */
+public enum HTTP_CODE {
+ CODE_100(100, "Continue"),
+ CODE_101(101, "Switching Protocols"),
+ CODE_102(102, "Processing"),
+ CODE_200(200, "OK"),
+ CODE_201(201, "Created"),
+ CODE_202(202, "Accepted"),
+ CODE_203(203, "Non-Authoritative Information"),
+ CODE_204(204, "No Content"),
+ CODE_205(205, "Reset Content"),
+ CODE_206(206, "Partial Content"),
+ CODE_207(207, "Multi-Status (WebDAV; RFC 4918)"),
+ CODE_208(208, "Already Reported (WebDAV; RFC 5842)"),
+ CODE_226(226, "IM Used (RFC 3229)"),
+ CODE_300(300, "Multiple Choices"),
+ CODE_301(301, "301 Moved Permanently"),
+ CODE_302(302, "Found"),
+ CODE_303(303, "See Other"),
+ CODE_304(304, "Not Modified"),
+ CODE_305(305, "Use Proxy (since HTTP/1.1)"),
+ CODE_306(306, "Switch Proxy"),
+ CODE_307(307, "Temporary Redirect (since HTTP/1.1)"),
+ CODE_308(308, "Permanent Redirect (RFC 7538)"),
+ CODE_400(400, "Bad Request"),
+ CODE_401(401, "Unauthorized"),
+ CODE_402(402, "Payment Required"),
+ CODE_403(403, "Forbidden"),
+ CODE_404(404, "Not Found"),
+ CODE_405(405, "Method Not Allowed"),
+ CODE_406(406, "Not Acceptable"),
+ CODE_407(407, "Proxy Authentication Required"),
+ CODE_408(408, "Request Timeout"),
+ CODE_409(409, "Conflict"),
+ CODE_410(410, "Gone"),
+ CODE_411(411, "Length Required"),
+ CODE_412(412, "Precondition Failed"),
+ CODE_413(413, "Payload Too Large"),
+ CODE_414(414, "URI Too Long"),
+ CODE_415(415, "Unsupported Media Type"),
+ CODE_416(416, "Range Not Satisfiable"),
+ CODE_417(417, "Expectation Failed"),
+ CODE_418(418, "I'm a teapot (RFC 2324)"),
+ CODE_419(419, "Authentication Timeout"),
+ CODE_420(420, "Method Failure"),
+ CODE_421(421, "Misdirected Request"),
+ CODE_422(422, "Unprocessable Entity (WebDAV; RFC 4918)"),
+ CODE_423(423, "Locked (WebDAV; RFC 4918)"),
+ CODE_424(424, "Failed Dependency (WebDAV; RFC 4918)"),
+ CODE_426(426, "Upgrade Required"),
+ CODE_428(428, "Precondition Required"),
+ CODE_429(429, "Too Many Requests"),
+ CODE_431(431, "Request Header Fields Too Large"),
+ CODE_440(440, "Login Timeout (Microsoft)"),
+ CODE_444(444, "No Response (Nginx)"),
+ CODE_449(449, "Retry With (Microsoft)"),
+ CODE_450(450, "Blocked by Windows Parental Controls (Microsoft)"),
+ CODE_451(451, "Unavailable For Legal Reasons"),
+ CODE_494(494, "Request Header Too Large (Nginx)"),
+ CODE_495(495, "Cert Error (Nginx)"),
+ CODE_496(496, "No Cert (Nginx)"),
+ CODE_497(497, "HTTP to HTTPS (Nginx)"),
+ CODE_498(498, "Token expired/invalid (Esri)"),
+ CODE_499(499, "Client Closed Request (Nginx)"),
+ CODE_500(500, "Internal Server Error"),
+ CODE_501(501, "Not Implemented"),
+ CODE_502(502, "Bad Gateway"),
+ CODE_503(503, "Service Unavailable"),
+ CODE_504(504, "Gateway Timeout"),
+ CODE_505(505, "HTTP Version Not Supported"),
+ CODE_506(506, "Variant Also Negotiates (RFC 2295)"),
+ CODE_507(507, "Insufficient Storage (WebDAV; RFC 4918)"),
+ CODE_508(508, "Loop Detected (WebDAV; RFC 5842)"),
+ CODE_509(509, "Bandwidth Limit Exceeded (Apache bw/limited extension)"),
+ CODE_510(510, "Not Extended (RFC 2774)"),
+ CODE_511(511, "Network Authentication Required"),
+ CODE_520(520, "Unknown Error"),
+ CODE_522(522, "Origin Connection Time-out"),
+ CODE_598(598, "Network read timeout error (Unknown)"),
+ CODE_599(599, "Network connect timeout error (Unknown)");
+
+ private final int code;
+ private final String message;
+
+ private HTTP_CODE(int code, String message) {
+ this.code = code;
+ this.message = message;
+ }
+
+ public String getType() {
+ if (code >= 100 && code <= 199)
+ return "Informational";
+ if (code >= 200 && code <= 299)
+ return "Success";
+ if (code >= 300 && code <= 399)
+ return "Redirection";
+ if (code >= 400 && code <= 499)
+ return "Client Error";
+ if (code >= 500 && code <= 599)
+ return "Server Error";
+ throw new IllegalArgumentException("Unknown HTTP CODE " + code);
+ }
+
+ public String toString(){
+ return "HTTP " + code + ": " + getType() + " (" + message + ")";
+ }
+
+ public int getCode() {
+ return code;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public static HTTP_CODE toCode(int code) {
+ for (HTTP_CODE hc : HTTP_CODE.values())
+ if (hc.getCode() == code)
+ return hc;
+ throw new IllegalArgumentException("Unknown HTTP CODE " + code);
+ }
+
+ public static HTTP_CODE toCode(Status status) {
+ return toCode(status.getCode());
+ }
+}
diff --git a/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/GatewayHttpClient.java b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/GatewayHttpClient.java
new file mode 100644
index 0000000..87219bf
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/GatewayHttpClient.java
@@ -0,0 +1,185 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.http.client;
+
+import java.io.IOException;
+import java.io.StringWriter;
+import java.util.Collection;
+import java.util.Map;
+
+import org.eclipse.sensinact.studio.http.client.snamessage.SnaMessage;
+import org.eclipse.sensinact.studio.http.client.snamessage.SnaMessageFactory;
+import org.eclipse.sensinact.studio.http.client.snamessage.gateway.ResponseCustom;
+import org.eclipse.sensinact.studio.model.resource.utils.JsonUtil;
+import org.eclipse.sensinact.studio.model.resource.utils.Segments;
+import org.eclipse.sensinact.studio.preferences.ConfigurationManager;
+import org.eclipse.sensinact.studio.preferences.GatewayHttpConfig;
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.restlet.Context;
+import org.restlet.Response;
+import org.restlet.data.ChallengeScheme;
+import org.restlet.data.MediaType;
+import org.restlet.data.Method;
+import org.restlet.data.Parameter;
+import org.restlet.representation.Representation;
+import org.restlet.representation.StringRepresentation;
+import org.restlet.resource.ClientResource;
+
+/**
+ * Central point for SYNCHRONUS communication with the sensinact gateway.
+ * @author Etienne Gandrille
+ */
+public class GatewayHttpClient {
+
+ private GatewayHttpClient() {
+ throw new IllegalArgumentException("Should not be instantiated!");
+ }
+
+ public static SnaMessage sendGetRequest(Segments segments) throws IOException {
+ return sendGetRequest(segments, null);
+ }
+
+ public static SnaMessage sendGetRequest(Segments segments, Map<String, String> params) throws IOException {
+ GatewayHttpConfig gwInfo = ConfigurationManager.getGateway(segments.getGateway());
+ ClientResource clientResource = new ClientResource(getContext(gwInfo), gwInfo.getURL().toString());
+ setAuthentication(clientResource, gwInfo);
+ clientResource.setRetryOnError(false);
+ segments.addToClientResource(clientResource);
+
+ if (params != null)
+ for (String param : params.keySet()){
+ System.out.println("ADDDING:"+param+"="+params.get(param));
+ clientResource.addQueryParameter(new Parameter(param, params.get(param)));
+
+ }
+ String json = null;
+ try {
+ json = clientResource.get().getText();
+ System.out.println("SENDING GET request:"+clientResource.getRequest().toString());
+ return SnaMessageFactory.build(segments.getGateway(), new JSONObject(json));
+ } catch (JSONException e) {
+ try {
+ return new ResponseCustom(json,new JSONObject("{type:'custom',uri:'custom://'}"));
+ } catch (JSONException e1) {
+ throw new RuntimeException();
+ }
+ } catch (Exception e) {
+ try {
+ return SnaMessage.build(new JSONObject(json),e, segments);
+ } catch (JSONException e1) {
+ e.printStackTrace();
+ throw new IllegalArgumentException(json);
+ }
+ }
+ }
+
+ public static SnaMessage sendPostRequest(Segments segments, Collection<Parameter> queryParameter,RequestParameter... parameters) throws IOException {
+ JSONArray jsonParameters = new JSONArray();
+ for (RequestParameter parameter : parameters) {
+ try {
+ jsonParameters.put(JsonUtil.createNameTypeValue(parameter.name, parameter.type, parameter.value));
+ } catch (JSONException e) {
+ e.printStackTrace();
+ throw new IOException(e);
+ }
+ }
+ return sendPostRequest(segments, jsonParameters,queryParameter);
+ }
+
+
+ public static SnaMessage sendPostRequest(Segments segments, JSONArray parameters,Collection<Parameter> queryParameter) throws IOException {
+ if (parameters==null || parameters.length() == 0)
+ return sendPostRequest(segments, "{}",queryParameter);
+ else
+ return sendPostRequest(segments, parameters.toString(),queryParameter);
+ }
+
+ public static SnaMessage sendPostRequest(Segments segments, JSONArray parameters) throws IOException {
+ if (parameters.length() == 0)
+ return sendPostRequest(segments, "{}",null);
+ else
+ return sendPostRequest(segments, parameters.toString(),null);
+ }
+
+ public static SnaMessage sendPostRequest(Segments segments, JSONObject parameters) throws IOException {
+ return sendPostRequest(segments, parameters.toString(),null);
+ }
+
+ /* ======== */
+ /* Internal */
+ /* ======== */
+
+ private static SnaMessage sendPostRequest(Segments segments, String jsonRequest,Collection<Parameter> queryParameter) throws IOException {
+
+ GatewayHttpConfig gwInfo = ConfigurationManager.getGateway(segments.getGateway());
+ System.out.println("SENDING POST request:"+jsonRequest+" to:"+gwInfo.getURL().toString());
+ ClientResource clientResource = new ClientResource(getContext(gwInfo), Method.POST, gwInfo.getURL().toString()) {
+ @Override
+ public Representation handleInbound(Response response) {
+ return (response == null) ? null : response.getEntity();
+ }
+ };
+ setAuthentication(clientResource, gwInfo);
+ clientResource.setRetryOnError(false);
+ clientResource.getRequestAttributes();
+ segments.addToClientResource(clientResource);
+ StringRepresentation stringRep = new StringRepresentation(jsonRequest,MediaType.APPLICATION_JSON);
+ if(queryParameter!=null){
+ clientResource.addQueryParameters(queryParameter);
+ }
+
+ Representation postResponse = clientResource.post(stringRep);
+
+ StringWriter sw = new StringWriter();
+ postResponse.write(sw);
+ String jsonResponse = sw.toString();
+
+ try {
+ System.out.println("RESPONSE -->"+jsonResponse);
+ return SnaMessageFactory.build(segments.getGateway(), new JSONObject(jsonResponse));
+ } catch (Exception e) {
+ SnaMessage message;
+ try {
+ message = new ResponseCustom(jsonResponse,new JSONObject("{type:'custom',uri:'custom://'}"));
+ return message;
+ } catch (JSONException e1) {
+ throw new RuntimeException();
+ }
+
+
+ }
+ }
+
+ private static void setAuthentication(ClientResource clientResource, GatewayHttpConfig gwInfo) {
+ clientResource.setChallengeResponse(ChallengeScheme.HTTP_BASIC, gwInfo.getUsername(), gwInfo.getPassword());
+ }
+
+ private static Context getContext(GatewayHttpConfig gwInfo) throws IOException {
+ Context context = new Context();
+ context.getParameters().add("socketTimeout", Integer.toString(gwInfo.getTimeout()));
+ context.getParameters().add("idleTimeout", Integer.toString(gwInfo.getTimeout()));
+ return context;
+ }
+
+ public static class RequestParameter {
+ public final String name;
+ public final String type;
+ public final String value;
+
+ public RequestParameter(String name, String type, String value) {
+ this.name = name;
+ this.type = type;
+ this.value = value;
+ }
+ }
+}
diff --git a/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/StudioRequest.java b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/StudioRequest.java
new file mode 100644
index 0000000..a83fce9
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/StudioRequest.java
@@ -0,0 +1,75 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.http.client;
+
+import java.io.IOException;
+import java.util.Collection;
+
+import org.eclipse.sensinact.studio.http.client.UIResult.DialogStatus;
+import org.eclipse.sensinact.studio.http.client.snamessage.SnaMessage;
+import org.eclipse.sensinact.studio.model.resource.utils.ResourceDescriptor;
+import org.eclipse.sensinact.studio.model.resource.utils.Segments;
+import org.restlet.data.Parameter;
+
+import org.eclipse.sensinact.studio.resource.AccessMethodType;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class StudioRequest {
+
+ private final ResourceDescriptor descriptor;
+ private final AccessMethodType type;
+
+ public StudioRequest(ResourceDescriptor descriptor, AccessMethodType type) {
+ this.descriptor = descriptor;
+ this.type = type;
+ }
+
+ public SnaMessage sendRequest(Collection<Parameter> queryParameter){
+ Segments segments = new Segments.Builder().resource(descriptor).method(type).build();
+ try {
+ if (type.equals(AccessMethodType.GET)) {
+ return GatewayHttpClient.sendGetRequest(segments);
+ } else if (type.equals(AccessMethodType.ACT)) {
+
+ return GatewayHttpClient.sendPostRequest(segments,null,queryParameter);
+
+ } else {
+ throw new IllegalArgumentException("BasicRequest not implemented with " + type.getName() + " method");
+ }
+ } catch (IOException e) {
+ throw new IllegalArgumentException("BasicRequest not implemented with " + type.getName() + " method");
+ }
+ }
+ public SnaMessage sendRequest() throws IOException {
+ return sendRequest(null);
+ }
+
+ public UIResult sendRequestForIU() {
+ String title;
+ String message;
+ DialogStatus dialogType;
+ SnaMessage response=null;
+ try {
+ response = sendRequest();
+ title = descriptor.getDevice();
+ message = String.format("%s: %s", descriptor.getResource(),response.getFullDescription());
+ dialogType = response.isValid() ? DialogStatus.SUCCESS : DialogStatus.ERROR;
+ } catch (Exception e) {
+ title = "Error";
+ message = response!=null?response.getJson().toString():e.getMessage();
+ dialogType = DialogStatus.ERROR;
+ }
+
+ return new UIResult(title, message, dialogType);
+ }
+}
diff --git a/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/UIResult.java b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/UIResult.java
new file mode 100644
index 0000000..6af4766
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/UIResult.java
@@ -0,0 +1,61 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.http.client;
+
+import org.apache.log4j.Logger;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class UIResult {
+
+ private final String title;
+ private final String message;
+ private final DialogStatus status;
+
+ private static final Logger logger = Logger.getLogger(UIResult.class);
+
+ public UIResult(String title, String message, DialogStatus status) {
+ this.title = title;
+ this.message = message;
+ this.status = status;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public DialogStatus getStatus() {
+ return status;
+ }
+
+ public enum DialogStatus {
+ SUCCESS, ERROR;
+ }
+
+ public JSONObject asJson() {
+ JSONObject result = new JSONObject();
+ try {
+ result.put("title", title);
+ result.put("message", message);
+ result.put("status", status.name());
+ } catch (JSONException e) {
+ logger.error(e);
+ }
+ return result;
+ }
+}
diff --git a/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/ErrorMessage.java b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/ErrorMessage.java
new file mode 100644
index 0000000..8f9de37
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/ErrorMessage.java
@@ -0,0 +1,46 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.http.client.snamessage;
+
+import org.eclipse.sensinact.studio.model.resource.utils.Segments;
+import org.json.JSONObject;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class ErrorMessage extends SnaMessage {
+
+ private final Exception e;
+ private final Segments segments;
+
+
+ ErrorMessage(JSONObject json,Exception e, Segments segments) {
+ super(json);
+ this.e = e;
+ this.segments = segments;
+ }
+
+
+ @Override
+ public String getPrettyPrintedValue() {
+ return "ERROR on " + segments.toString();
+ }
+
+ @Override
+ public String getFullDescription() {
+ return getPrettyPrintedValue() + "\n" + e.getMessage();
+ }
+
+ @Override
+ public boolean isValid() {
+ return false;
+ }
+}
diff --git a/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/LifecycleMessage.java b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/LifecycleMessage.java
new file mode 100644
index 0000000..9474390
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/LifecycleMessage.java
@@ -0,0 +1,59 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.http.client.snamessage;
+
+import java.util.Arrays;
+
+import org.json.JSONObject;
+
+/**
+ * @author Etienne Gandrille
+ */
+public abstract class LifecycleMessage extends SnaMessage {
+
+ private final String type;
+ private final String[] uri;
+
+ public LifecycleMessage(JSONObject json,String type, String[] uri, int expectedUriSegments) {
+ super(json);
+ this.type = type;
+ this.uri = uri;
+ if (expectedUriSegments != uri.length)
+ throw new IllegalArgumentException("uri has " + uri.length + " segments but should have " + expectedUriSegments);
+ }
+
+ protected String getProvider() {
+ return uri[0];
+ }
+
+ protected String getService() {
+ return uri[1];
+ }
+
+ protected String getResource() {
+ return uri[2];
+ }
+
+ @Override
+ public boolean isValid() {
+ return true;
+ }
+
+ @Override
+ public String getPrettyPrintedValue() {
+ return type + " " + Arrays.toString(uri);
+ }
+
+ @Override
+ public String getFullDescription() {
+ return getPrettyPrintedValue();
+ }
+}
diff --git a/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/ResponseDescribeResource.java b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/ResponseDescribeResource.java
new file mode 100644
index 0000000..fa68a0e
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/ResponseDescribeResource.java
@@ -0,0 +1,82 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.http.client.snamessage;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.sensinact.studio.http.client.snamessage.gateway.ResponseDescribe;
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class ResponseDescribeResource extends ResponseDescribe {
+
+ private final String name;
+ private final String type;
+ private final List<RestAM> accessMethods = new ArrayList<>();
+
+ public ResponseDescribeResource(JSONObject jsonObject, JSONObject info) throws JSONException {
+ super(jsonObject, info);
+
+ name = info.getString("name");
+
+ JSONArray jsonAms = info.getJSONArray("accessMethods");
+ for (int i=0; i< jsonAms.length(); i++) {
+ accessMethods.add(new RestAM(jsonAms.getJSONObject(i)));
+ }
+
+ type = info.getString("type");
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public String getType() {
+ return type;
+ }
+
+ public List<RestAM> getAccessMethods() {
+ return accessMethods;
+ }
+
+ public class RestAM {
+
+ public final String name;
+ public final List<RestParam> parameters = new ArrayList<>();
+
+ public RestAM(JSONObject jsonObject) throws JSONException {
+ this.name = jsonObject.getString("name");
+ JSONArray params = jsonObject.getJSONArray("parameters");
+ for (int i=0; i< params.length(); i++) {
+ parameters.add(new RestParam(params.getJSONObject(i)));
+ }
+ }
+
+ }
+
+ public class RestParam {
+
+ public final String name;
+ public final boolean fixed;
+ public final String type;
+
+ public RestParam(JSONObject jsonObject) throws JSONException {
+ this.name = jsonObject.getString("name");
+ this.fixed = jsonObject.getBoolean("fixed");
+ this.type = jsonObject.getString("type");
+ }
+ }
+}
diff --git a/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/ResponseGetError.java b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/ResponseGetError.java
new file mode 100644
index 0000000..ddef54d
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/ResponseGetError.java
@@ -0,0 +1,38 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.http.client.snamessage;
+
+import org.eclipse.sensinact.studio.http.client.snamessage.gateway.ResponseGet;
+import org.json.JSONObject;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class ResponseGetError extends ResponseGet {
+
+ private final ResponseKO ko;
+
+ //{"statusCode":520,"errors":[{"message":"A JSONObject text must begin with '{' at 1 [character 2 line 1]","trace":"org.json.JSONTokener.syntaxError(JSONTokener.java:433)"}],"type":"GET_RESPONSE","uri":"/light/admin/lifecycleStatus"}
+ public ResponseGetError(JSONObject jsonObject, ResponseKO responseKO) {
+ super(jsonObject);
+ this.ko = responseKO;
+ }
+
+ @Override
+ public String getPrettyPrintedValue() {
+ return ko.getPrettyPrintedValue();
+ }
+
+ @Override
+ public String getFullDescription() {
+ return super.getFullDescription() + ko.getFullDescription();
+ }
+}
diff --git a/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/ResponseGetOK.java b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/ResponseGetOK.java
new file mode 100644
index 0000000..d9a361b
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/ResponseGetOK.java
@@ -0,0 +1,74 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.http.client.snamessage;
+
+import org.eclipse.sensinact.studio.http.client.snamessage.gateway.ResponseGet;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class ResponseGetOK extends ResponseGet {
+
+ //private ResponseOK ok;
+ private int timestamp;
+ private String name;
+ private String value;
+ private ResponseKO ko;
+
+ //{"response":{"timestamp":1465824378119,"name":"location","value":"44.40850067:8.92329979","type":"string"},"statusCode":200,"type":"GET_RESPONSE","uri":"/tourism_2/admin/location"}
+ public ResponseGetOK(JSONObject jsonObject) {
+ super(jsonObject);
+
+ try {
+
+ if (isValid()) {
+ JSONObject triggered=super.getJson().getJSONObject("response");
+
+ timestamp = triggered.getInt("timestamp");
+ name = triggered.getString("name");
+ value = triggered.get("value").toString();
+ ko = null;
+ } else {
+ //ok = null;
+ ko = new ResponseKO(jsonObject);
+ }
+
+ } catch (JSONException e) {
+ e.printStackTrace();
+ ko = new ResponseKO(jsonObject);
+ }
+ }
+
+ @Override
+ public String getPrettyPrintedValue() {
+ try {
+ return getValue()!=null?getValue():super.getJson().toString(4);
+ } catch (JSONException e) {
+ e.printStackTrace();
+ return getValue();
+ }
+ }
+
+ @Override
+ public String getFullDescription() {
+ return value.toString();
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public String getValue() {
+ return value;
+ }
+}
diff --git a/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/ResponseKO.java b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/ResponseKO.java
new file mode 100644
index 0000000..807f3c7
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/ResponseKO.java
@@ -0,0 +1,91 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.http.client.snamessage;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class ResponseKO extends ResponseMessage{
+
+ private final List<String> messages = new ArrayList<>();
+ private final List<String> traces = new ArrayList<>();
+
+ public ResponseKO(JSONObject jsonObject) {
+ super(jsonObject);
+ System.out.println("Creating response KO from:"+jsonObject.toString());
+ try {
+ JSONArray errors = jsonObject.getJSONArray("errors");
+
+ for (int i=0; i<errors.length(); i++) {
+ JSONObject error = errors.getJSONObject(i);
+ messages.add(error.getString("message"));
+ traces.add(error.getString("trace"));
+ }
+ } catch (JSONException e) {
+ e.printStackTrace();
+ //throw new IllegalArgumentException(this.getClass().getName() + " json malformed");
+ }
+ }
+
+ public String getPrettyPrintedValue() {
+ return messages.size() + " error(s)";
+ }
+
+ public String getFullDescription() {
+ String msg = messages.size() + " error(s)";
+
+ for (int i=0; i< messages.size(); i++) {
+ msg +="\n---\n";
+ msg += "message: " + messages.get(i) + "\n";
+ msg += "trace: " + traces.get(i);
+ }
+
+ return msg;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((messages == null) ? 0 : messages.hashCode());
+ result = prime * result + ((traces == null) ? 0 : traces.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ ResponseKO other = (ResponseKO) obj;
+ if (messages == null) {
+ if (other.messages != null)
+ return false;
+ } else if (!messages.equals(other.messages))
+ return false;
+ if (traces == null) {
+ if (other.traces != null)
+ return false;
+ } else if (!traces.equals(other.traces))
+ return false;
+ return true;
+ }
+}
diff --git a/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/ResponseMessage.java b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/ResponseMessage.java
new file mode 100644
index 0000000..36ea58c
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/ResponseMessage.java
@@ -0,0 +1,48 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.http.client.snamessage;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+/**
+ * @author nj246216
+ */
+public class ResponseMessage extends SnaMessage {
+
+ private int statusCode;
+
+ public ResponseMessage(JSONObject jsonObject) {
+ super(jsonObject);
+ try {
+ statusCode = jsonObject.getInt("statusCode");
+ } catch (JSONException e) {
+ e.printStackTrace();
+ statusCode = -1;
+ //throw new IllegalArgumentException(this.getClass().getName() + " json malformed");
+ }
+ }
+
+ public int getStatusCode() {
+ return statusCode;
+ }
+
+ @Override
+ public boolean isValid() {
+ return statusCode == 200;
+ }
+
+ @Override
+ public String getPrettyPrintedValue() {
+ return getUri() + " (" + statusCode + ")";
+ }
+
+}
diff --git a/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/ResponseOK.java b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/ResponseOK.java
new file mode 100644
index 0000000..0dc76f7
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/ResponseOK.java
@@ -0,0 +1,24 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.http.client.snamessage;
+
+import org.json.JSONObject;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class ResponseOK extends ResponseGetOK {
+
+ public ResponseOK(JSONObject jsonObject) {
+ super(jsonObject);
+ }
+
+}
diff --git a/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/ResponseSNANotification.java b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/ResponseSNANotification.java
new file mode 100644
index 0000000..fe11c2f
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/ResponseSNANotification.java
@@ -0,0 +1,67 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.http.client.snamessage;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class ResponseSNANotification extends SnaMessage {
+
+ public ResponseSNANotification(JSONObject jsonObject) {
+ super(jsonObject);
+ //timestamp = triggered.getInt("timestamp");
+ try {
+ JSONObject jsonNotification=super.getJson().getJSONObject("notification");
+ //name = jsonNotification.getString("name");
+ //type = jsonNotification.getString("type");
+ //value = jsonNotification.getString("value");
+ } catch (JSONException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+
+ }
+
+ /*
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getType() {
+ return type;
+ }
+
+ public void setType(String type) {
+ this.type = type;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+ */
+ @Override
+ public boolean isValid() {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+}
diff --git a/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/ResponseSetError.java b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/ResponseSetError.java
new file mode 100644
index 0000000..ce831fc
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/ResponseSetError.java
@@ -0,0 +1,37 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.http.client.snamessage;
+
+import org.eclipse.sensinact.studio.http.client.snamessage.gateway.ResponseSet;
+import org.json.JSONObject;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class ResponseSetError extends ResponseSet {
+
+ private final ResponseKO ko;
+
+ public ResponseSetError(JSONObject jsonObject, ResponseKO responseKO) {
+ super(jsonObject);
+ this.ko = responseKO;
+ }
+
+ @Override
+ public String getPrettyPrintedValue() {
+ return ko.getPrettyPrintedValue();
+ }
+
+ @Override
+ public String getFullDescription() {
+ return super.getFullDescription() + ko.getFullDescription();
+ }
+}
diff --git a/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/ResponseSetOK.java b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/ResponseSetOK.java
new file mode 100644
index 0000000..a4afea7
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/ResponseSetOK.java
@@ -0,0 +1,49 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.http.client.snamessage;
+
+import org.eclipse.sensinact.studio.http.client.snamessage.gateway.ResponseSet;
+import org.json.JSONObject;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class ResponseSetOK extends ResponseSet {
+
+ private final ResponseOK ok;
+
+ public ResponseSetOK(JSONObject jsonObject, ResponseOK responseOK) {
+ super(jsonObject);
+ this.ok = responseOK;
+ }
+
+ @Override
+ public String getPrettyPrintedValue() {
+ return ok.getPrettyPrintedValue();
+ }
+
+ @Override
+ public String getFullDescription() {
+ return super.getFullDescription() + ok.getFullDescription();
+ }
+
+ public String getName() {
+ return ok.getName();
+ }
+
+ public String getType() {
+ return ok.getType();
+ }
+
+ public String getValue() {
+ return ok.getValue();
+ }
+}
diff --git a/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/RestMessage.java b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/RestMessage.java
new file mode 100644
index 0000000..3d311d5
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/RestMessage.java
@@ -0,0 +1,45 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.http.client.snamessage;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+/**
+ * @author Etienne Gandrille
+ */
+public abstract class RestMessage extends ResponseMessage {
+
+ protected final List<String> internalList = new ArrayList<>();
+
+
+ public RestMessage(JSONObject jsonObject, String key) throws JSONException {
+ super(jsonObject);
+
+ JSONArray array = jsonObject.getJSONArray(key);
+ for (int i=0; i<array.length(); i++)
+ internalList.add(array.getString(i));
+ }
+
+ @Override
+ public String getPrettyPrintedValue() {
+ return internalList.toString();
+ }
+
+ @Override
+ public String getFullDescription() {
+ return internalList.toString();
+ }
+}
diff --git a/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/RestProvidersList.java b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/RestProvidersList.java
new file mode 100644
index 0000000..590172f
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/RestProvidersList.java
@@ -0,0 +1,34 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+
+package org.eclipse.sensinact.studio.http.client.snamessage;
+
+import java.util.List;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class RestProvidersList extends RestMessage {
+
+ public static final Object KEY = "PROVIDERS_LIST";
+
+ // {"statusCode":200,"providers":["webcam_10","weather_11"],"type":"PROVIDERS_LIST","uri":"/"}
+ public RestProvidersList(JSONObject jsonObject) throws JSONException {
+ super(jsonObject, "providers");
+ }
+
+ public List<String> getProviders() {
+ return internalList;
+ }
+}
diff --git a/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/RestResourcesList.java b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/RestResourcesList.java
new file mode 100644
index 0000000..ea7ca32
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/RestResourcesList.java
@@ -0,0 +1,32 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.http.client.snamessage;
+
+import java.util.List;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class RestResourcesList extends RestMessage {
+
+ public static final Object KEY = "RESOURCES_LIST";
+
+ public RestResourcesList(JSONObject jsonObject) throws JSONException {
+ super(jsonObject, "resources");
+ }
+
+ public List<String> getResources() {
+ return internalList;
+ }
+}
diff --git a/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/RestServicesList.java b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/RestServicesList.java
new file mode 100644
index 0000000..090f55f
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/RestServicesList.java
@@ -0,0 +1,32 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.http.client.snamessage;
+
+import java.util.List;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class RestServicesList extends RestMessage {
+
+ public static final Object KEY = "SERVICES_LIST";
+
+ public RestServicesList(JSONObject jsonObject) throws JSONException {
+ super(jsonObject, "services");
+ }
+
+ public List<String> getServices() {
+ return internalList;
+ }
+}
diff --git a/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/SnaMessage.java b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/SnaMessage.java
new file mode 100644
index 0000000..65700ba
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/SnaMessage.java
@@ -0,0 +1,100 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.http.client.snamessage;
+
+import org.eclipse.sensinact.studio.model.resource.utils.Segments;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class SnaMessage {
+
+ private final String type;
+ private final String uri;
+ private final JSONObject json;
+
+ public SnaMessage(JSONObject json,String type,String uri){
+ this.json=json;
+ this.type=type;
+ this.uri=uri;
+ }
+
+ public SnaMessage(JSONObject json){
+ System.out.println("MESSAGE IN RESPONSE:"+json.toString());
+ try {
+ this.json=json;
+ this.type = json.getString("type");
+ this.uri = json.getString("uri");
+ } catch (JSONException e) {
+ e.printStackTrace();
+ throw new IllegalArgumentException(this.getClass().getName() + " json malformed");
+ }
+ }
+
+ public String getPrettyPrintedValue(){
+ return json.toString();
+ }
+
+ public String getFullDescription(){
+ return json.toString();
+ }
+
+ public boolean isValid(){
+ return true;
+ }
+
+ public static SnaMessage build(JSONObject json,Exception e, Segments segments) {
+ return new ErrorMessage(json,e, segments);
+ }
+
+ @Override
+ public String toString() {
+ return getFullDescription();
+ }
+
+ protected static String[] toTab(String path) {
+ path = cleanPath(path);
+ if (path == null) {
+ return new String[0];
+ }
+ return path.split("/");
+ }
+
+ private static String cleanPath(String path) {
+ if (path == null) {
+ return null;
+ }
+ path = path.trim();
+ if (path.startsWith("/")) {
+ path = path.substring(1);
+ }
+ if (path.endsWith("/")) {
+ path = path.substring(0, path.length() - 1);
+ }
+ return path;
+ }
+
+ public String getUri() {
+ return uri;
+ }
+ public String getType() {
+ return type;
+ }
+
+ public JSONObject getJson() {
+ return json;
+ }
+
+
+
+}
diff --git a/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/SnaMessageFactory.java b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/SnaMessageFactory.java
new file mode 100644
index 0000000..a3803e3
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/SnaMessageFactory.java
@@ -0,0 +1,120 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.http.client.snamessage;
+
+import org.apache.log4j.Logger;
+import org.eclipse.sensinact.studio.http.client.snamessage.gateway.LifecycleProviderAppearing;
+import org.eclipse.sensinact.studio.http.client.snamessage.gateway.LifecycleProviderDisappearing;
+import org.eclipse.sensinact.studio.http.client.snamessage.gateway.LifecycleResourceAppearing;
+import org.eclipse.sensinact.studio.http.client.snamessage.gateway.LifecycleResourceDisappearing;
+import org.eclipse.sensinact.studio.http.client.snamessage.gateway.LifecycleServiceAppearing;
+import org.eclipse.sensinact.studio.http.client.snamessage.gateway.LifecycleServiceDisappearing;
+import org.eclipse.sensinact.studio.http.client.snamessage.gateway.ResponseAct;
+import org.eclipse.sensinact.studio.http.client.snamessage.gateway.ResponseCustom;
+import org.eclipse.sensinact.studio.http.client.snamessage.gateway.ResponseDescribe;
+import org.eclipse.sensinact.studio.http.client.snamessage.gateway.ResponseGet;
+import org.eclipse.sensinact.studio.http.client.snamessage.gateway.ResponseSet;
+import org.eclipse.sensinact.studio.http.client.snamessage.gateway.ResponseSubscribe;
+import org.eclipse.sensinact.studio.http.client.snamessage.gateway.ResponseUnsubscribe;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class SnaMessageFactory {
+
+ private static final Logger logger = Logger.getLogger(SnaMessageFactory.class);
+
+ private SnaMessageFactory() {
+ throw new RuntimeException("do no instantiate");
+ }
+
+ public static SnaMessage build(String gateway, JSONObject jsonObject) {
+
+ try {
+ String type = jsonObject.optString("type", null);
+
+ if (type == null) {
+ SnaMessage message;
+ try {
+ message = new ResponseCustom(jsonObject.toString(),new JSONObject("{type:'custom',uri:'custom://'}"));
+ return message;
+ } catch (JSONException e1) {
+ throw new RuntimeException();
+ }
+ }
+
+ if (type.equals(UpdateAttribute.KEY)) {
+ // check nested message
+ try {
+ JSONObject valueObject = new JSONObject(jsonObject.getJSONObject("notification").getString("value"));
+ return build(gateway, valueObject);
+ } catch (Exception e) {
+ // do nothing
+ }
+
+ // no nested message
+ return new UpdateAttribute(gateway, jsonObject);
+ }
+
+ // ACT / GET / SET / DESCRIBE / SUBSCRIBE / UNSUBSCRIBE
+ else if (type.equals(ResponseAct.KEY))
+ return new ResponseAct(jsonObject);
+ else if (type.equals(ResponseGet.KEY))
+ return ResponseGet.build(jsonObject);
+ else if (type.equals(ResponseSet.KEY))
+ return ResponseSet.build(jsonObject);
+ else if (type.equals(ResponseDescribe.KEY))
+ return ResponseDescribe.build(jsonObject);
+ else if (type.equals(ResponseSubscribe.KEY))
+ return new ResponseSubscribe(jsonObject);
+ else if (type.equals(ResponseUnsubscribe.KEY))
+ return new ResponseUnsubscribe(jsonObject);
+
+ // lifecycle
+ else if (type.equals(LifecycleProviderAppearing.KEY))
+ return new LifecycleProviderAppearing(jsonObject);
+ else if (type.equals(LifecycleProviderDisappearing.KEY))
+ return new LifecycleProviderDisappearing(jsonObject);
+ else if (type.equals(LifecycleServiceAppearing.KEY))
+ return new LifecycleServiceAppearing(jsonObject);
+ else if (type.equals(LifecycleServiceDisappearing.KEY))
+ return new LifecycleServiceDisappearing(jsonObject);
+ else if (type.equals(LifecycleResourceAppearing.KEY))
+ return new LifecycleResourceAppearing(jsonObject);
+ else if (type.equals(LifecycleResourceDisappearing.KEY))
+ return new LifecycleResourceDisappearing(jsonObject);
+
+ // REST
+ else if (type.equals(RestProvidersList.KEY))
+ return new RestProvidersList(jsonObject);
+ else if (type.equals(RestServicesList.KEY))
+ return new RestServicesList(jsonObject);
+ else if (type.equals(RestResourcesList.KEY))
+ return new RestResourcesList(jsonObject);
+
+ else {
+ String msg = "Unknown type: " + type + " in json " + jsonObject.toString();
+ logger.error(msg);
+ throw new RuntimeException(msg);
+ }
+ } catch (JSONException e) {
+ logger.error(e);
+ }
+
+ // Unknown message
+ String msg = "Unknown message: " + jsonObject.toString();
+ logger.error(msg);
+ throw new RuntimeException(msg);
+ }
+
+}
diff --git a/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/UpdateAttribute.java b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/UpdateAttribute.java
new file mode 100644
index 0000000..4e0009a
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/UpdateAttribute.java
@@ -0,0 +1,70 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.http.client.snamessage;
+
+import org.eclipse.sensinact.studio.http.client.snamessage.gateway.AttributeValueUpdate;
+import org.eclipse.sensinact.studio.model.resource.utils.ResourceDescriptor;
+import org.json.JSONObject;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class UpdateAttribute extends UpdateMessage {
+
+ public static final String KEY = "ATTRIBUTE_VALUE_UPDATED";
+
+ private final ResourceDescriptor target;
+ private final AttributeValueUpdate value;
+
+ // {"notification":{"timestamp":1465892666461,"name":"event","value":"{\"notification\":{\"lifecycle\":\"PROVIDER_APPEARING\"},\"type\":\"PROVIDER_APPEARING\",\"uri\":\"/slider\"}","type":"string"},"type":"ATTRIBUTE_VALUE_UPDATED","uri":"/sensiNact/system/event/value"}
+ public UpdateAttribute(String gateway, JSONObject jsonObject) {
+ super(jsonObject);
+
+ System.out.println("NOTIFICATION:"+jsonObject);
+ target = new ResourceDescriptor(gateway + super.getUri());
+ value = new AttributeValueUpdate(jsonObject);
+ }
+
+ public ResourceDescriptor getTarget() {
+ return target;
+ }
+ /*
+ public int getTimestamp() {
+ return value.getTimestamp();
+ } */
+
+ public String getName() {
+ return value.getName();
+ }
+
+ public String getType() {
+ return value.getType();
+ }
+
+ public String getValue() {
+ return value.getValue();
+ }
+
+ @Override
+ public boolean isValid() {
+ return true;
+ }
+
+ @Override
+ public String getPrettyPrintedValue() {
+ return value.getPrettyPrintedValue();
+ }
+
+ @Override
+ public String getFullDescription() {
+ return String.format("%s %s", getUri(),value.getValue()!=null?value.getValue():"WAITING");
+ }
+}
diff --git a/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/UpdateMessage.java b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/UpdateMessage.java
new file mode 100644
index 0000000..7254b8c
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/UpdateMessage.java
@@ -0,0 +1,26 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.http.client.snamessage;
+
+import org.json.JSONObject;
+
+/**
+ * @author Etienne Gandrille
+ */
+public abstract class UpdateMessage extends SnaMessage {
+
+ public UpdateMessage(JSONObject json) {
+ super(json);
+ }
+
+
+
+}
diff --git a/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/UpdateMetadata.java b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/UpdateMetadata.java
new file mode 100644
index 0000000..c9d0289
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/UpdateMetadata.java
@@ -0,0 +1,34 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.http.client.snamessage;
+
+import org.json.JSONObject;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class UpdateMetadata extends UpdateMessage {
+
+ public UpdateMetadata(JSONObject json) {
+ super(json);
+ }
+
+ @Override
+ public String getPrettyPrintedValue() {
+ return null;
+ }
+
+ @Override
+ public boolean isValid() {
+ return false;
+ }
+
+}
diff --git a/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/gateway/AttributeValueUpdate.java b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/gateway/AttributeValueUpdate.java
new file mode 100644
index 0000000..c5f1839
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/gateway/AttributeValueUpdate.java
@@ -0,0 +1,56 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.http.client.snamessage.gateway;
+
+import org.eclipse.sensinact.studio.http.client.snamessage.SnaMessage;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class AttributeValueUpdate extends SnaMessage {
+
+ private String name;
+ private String value;
+ private String type;
+
+ public AttributeValueUpdate(JSONObject json) {
+ super(json);
+ JSONObject notification;
+ try {
+ notification = super.getJson().getJSONObject("notification");
+ name=notification.getString("name");
+ type=notification.getString("type");
+ value=notification.getString("value");
+ } catch (JSONException e) {
+ e.printStackTrace();
+ throw new IllegalArgumentException(this.getClass().getName() + " json malformed");
+ }
+
+
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public String getType() {
+ return type;
+ }
+
+
+
+}
diff --git a/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/gateway/LifecycleProviderAppearing.java b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/gateway/LifecycleProviderAppearing.java
new file mode 100644
index 0000000..140ca54
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/gateway/LifecycleProviderAppearing.java
@@ -0,0 +1,32 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.http.client.snamessage.gateway;
+
+import org.eclipse.sensinact.studio.http.client.snamessage.LifecycleMessage;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class LifecycleProviderAppearing extends LifecycleMessage {
+
+ public static final String KEY = "PROVIDER_APPEARING";
+
+ public LifecycleProviderAppearing(JSONObject message) throws JSONException {
+ super(message,KEY, toTab(message.getString("uri")), 1);
+ }
+
+ @Override
+ public String getProvider() {
+ return super.getProvider();
+ }
+}
diff --git a/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/gateway/LifecycleProviderDisappearing.java b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/gateway/LifecycleProviderDisappearing.java
new file mode 100644
index 0000000..cf754b4
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/gateway/LifecycleProviderDisappearing.java
@@ -0,0 +1,32 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.http.client.snamessage.gateway;
+
+import org.eclipse.sensinact.studio.http.client.snamessage.LifecycleMessage;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class LifecycleProviderDisappearing extends LifecycleMessage {
+
+ public static final String KEY = "PROVIDER_DISAPPEARING";
+
+ public LifecycleProviderDisappearing(JSONObject message) throws JSONException {
+ super(message,KEY, toTab(message.getString("uri")), 1);
+ }
+
+ @Override
+ public String getProvider() {
+ return super.getProvider();
+ }
+}
diff --git a/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/gateway/LifecycleResourceAppearing.java b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/gateway/LifecycleResourceAppearing.java
new file mode 100644
index 0000000..d43ba68
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/gateway/LifecycleResourceAppearing.java
@@ -0,0 +1,77 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.http.client.snamessage.gateway;
+
+import org.eclipse.sensinact.studio.http.client.snamessage.LifecycleMessage;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class LifecycleResourceAppearing extends LifecycleMessage {
+
+ public static final String KEY = "RESOURCE_APPEARING";
+ private final String resourceType;
+ private String name;
+ private String type;
+ private String initValue;
+
+ public LifecycleResourceAppearing(JSONObject message) throws JSONException {
+ super(message,KEY, toTab(message.getString("uri")), 3);
+ resourceType = message.getJSONObject("notification").getString("type");
+
+ if (message.has("initial")){
+ initValue=message.getJSONObject("initial").getString("value");
+ name=message.getJSONObject("initial").getString("name");
+ type=message.getJSONObject("initial").getString("type");
+ }else
+ initValue = null;
+ }
+
+ @Override
+ public String getFullDescription() {
+ return super.getFullDescription() + "\ntype: " + resourceType + ((initValue==null)?"":("\ninfo: " + initValue.toString()));
+ }
+
+ @Override
+ public String getProvider() {
+ return super.getProvider();
+ }
+
+ @Override
+ public String getService() {
+ return super.getService();
+ }
+
+ @Override
+ public String getResource() {
+ return super.getResource();
+ }
+
+ public String getResourceType() {
+ return resourceType;
+ }
+
+ public String getInitValue() {
+ return initValue;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public String getType() {
+ return type;
+ }
+
+
+}
\ No newline at end of file
diff --git a/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/gateway/LifecycleResourceDisappearing.java b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/gateway/LifecycleResourceDisappearing.java
new file mode 100644
index 0000000..f9a5fa8
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/gateway/LifecycleResourceDisappearing.java
@@ -0,0 +1,43 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.http.client.snamessage.gateway;
+
+import org.eclipse.sensinact.studio.http.client.snamessage.LifecycleMessage;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class LifecycleResourceDisappearing extends LifecycleMessage {
+
+ public static final String KEY = "RESOURCE_DISAPPEARING";
+
+ public LifecycleResourceDisappearing(JSONObject message) throws JSONException {
+ super(message,KEY, toTab(message.getString("uri")), 3);
+ }
+
+ @Override
+ public String getProvider() {
+ return super.getProvider();
+ }
+
+ @Override
+ public String getService() {
+ return super.getService();
+ }
+
+ @Override
+ public String getResource() {
+ return super.getResource();
+ }
+}
+
diff --git a/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/gateway/LifecycleServiceAppearing.java b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/gateway/LifecycleServiceAppearing.java
new file mode 100644
index 0000000..a22c5fb
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/gateway/LifecycleServiceAppearing.java
@@ -0,0 +1,38 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.http.client.snamessage.gateway;
+
+import org.eclipse.sensinact.studio.http.client.snamessage.LifecycleMessage;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class LifecycleServiceAppearing extends LifecycleMessage {
+
+ public static final String KEY = "SERVICE_APPEARING";
+
+ public LifecycleServiceAppearing(JSONObject message) throws JSONException {
+ super(message,KEY, toTab(message.getString("uri")), 2);
+ }
+
+ @Override
+ public String getProvider() {
+ return super.getProvider();
+ }
+
+ @Override
+ public String getService() {
+ return super.getService();
+ }
+}
+
diff --git a/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/gateway/LifecycleServiceDisappearing.java b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/gateway/LifecycleServiceDisappearing.java
new file mode 100644
index 0000000..8b0767b
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/gateway/LifecycleServiceDisappearing.java
@@ -0,0 +1,38 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.http.client.snamessage.gateway;
+
+import org.eclipse.sensinact.studio.http.client.snamessage.LifecycleMessage;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+/**
+ * @author Etienne Gandrille
+ */
+ public class LifecycleServiceDisappearing extends LifecycleMessage {
+
+ public static final String KEY = "SERVICE_DISAPPEARING";
+
+ public LifecycleServiceDisappearing(JSONObject message) throws JSONException {
+ super(message,KEY, toTab(message.getString("uri")), 2);
+ }
+
+ @Override
+ public String getProvider() {
+ return super.getProvider();
+ }
+
+ @Override
+ public String getService() {
+ return super.getService();
+ }
+}
+
diff --git a/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/gateway/ResponseAct.java b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/gateway/ResponseAct.java
new file mode 100644
index 0000000..b7b2d35
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/gateway/ResponseAct.java
@@ -0,0 +1,117 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.http.client.snamessage.gateway;
+
+import org.eclipse.sensinact.studio.http.client.snamessage.ResponseKO;
+import org.eclipse.sensinact.studio.http.client.snamessage.ResponseMessage;
+import org.eclipse.sensinact.studio.http.client.snamessage.ResponseOK;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class ResponseAct extends ResponseMessage {
+
+ public static final String KEY = "ACT_RESPONSE";
+
+ private int timestamp;
+ private String type;
+ private String value;
+
+ private ResponseOK ok;
+ private ResponseKO ko;
+
+ // BUGFIX Christophe has to swap the response part and the triggered part.
+ // Update this when the gateway bug will be fixed.
+ // {"response":{"timestamp":1465826225451,"name":"status","value":"ON","type":"string"},"statusCode":200,"type":"ACT_RESPONSE","uri":"/light/switch/turn_on","triggered":[{"taskId":"light#ACT#switch#turn_on","result":null,"status":"EXECUTED","start":1465826225114,"end":1465826225184}]}
+ public ResponseAct(JSONObject jsonObject) {
+ super(jsonObject);
+
+ try {
+
+ if (isValid()) {
+ JSONObject triggered;
+ triggered = super.getJson().getJSONObject("response");
+
+ timestamp = triggered.getInt("start");
+ type = super.getType();
+ value = triggered.getString("result");
+ ko = null;
+ } else {
+ ok = null;
+ ko = new ResponseKO(jsonObject);
+ }
+
+ } catch (JSONException e) {
+ e.printStackTrace();
+ ok = null;
+ ko = new ResponseKO(jsonObject);
+ }
+ }
+
+ @Override
+ public String getFullDescription() {
+ return value;
+ }
+
+ @Override
+ public String getPrettyPrintedValue() {
+ if (isValid())
+ return ok.getPrettyPrintedValue();
+ else
+ return ko.getPrettyPrintedValue();
+ }
+
+ public int getTimestamp() {
+ return timestamp;
+ }
+
+ public String getType() {
+ return type;
+ }
+ public String getValue() {
+ return value;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((type == null) ? 0 : type.hashCode());
+ result = prime * result + ((value == null) ? 0 : value.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ ResponseAct other = (ResponseAct) obj;
+
+ if (type == null) {
+ if (other.type != null)
+ return false;
+ } else if (!type.equals(other.type))
+ return false;
+ if (value == null) {
+ if (other.value != null)
+ return false;
+ } else if (!value.equals(other.value))
+ return false;
+ return true;
+ }
+
+}
diff --git a/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/gateway/ResponseCustom.java b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/gateway/ResponseCustom.java
new file mode 100644
index 0000000..6b6ca43
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/gateway/ResponseCustom.java
@@ -0,0 +1,35 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.http.client.snamessage.gateway;
+
+import org.eclipse.sensinact.studio.http.client.snamessage.SnaMessage;
+import org.json.JSONObject;
+
+/**
+ * @author nj246216
+ *
+ */
+public class ResponseCustom extends SnaMessage {
+
+ private String source;
+
+ public ResponseCustom(String source,JSONObject json) {
+ super(json);
+ this.source=source;
+ }
+
+ public String getSource() {
+ return source;
+ }
+
+
+
+}
diff --git a/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/gateway/ResponseDescribe.java b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/gateway/ResponseDescribe.java
new file mode 100644
index 0000000..5974c1f
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/gateway/ResponseDescribe.java
@@ -0,0 +1,52 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.http.client.snamessage.gateway;
+
+import org.eclipse.sensinact.studio.http.client.snamessage.ResponseDescribeResource;
+import org.eclipse.sensinact.studio.http.client.snamessage.ResponseMessage;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+
+/**
+ * @author Etienne Gandrille
+ */
+// {"response":{"name":"name","type":"PROPERTY"},"statusCode":200,"type":"DESCRIBE_RESPONSE","uri":"/weather_11/admin/name"}
+public class ResponseDescribe extends ResponseMessage {
+
+ public static final String KEY = "DESCRIBE_RESPONSE";
+
+ private final JSONObject info;
+
+ public static ResponseMessage build(JSONObject jsonObject) {
+
+ try {
+ JSONObject info = jsonObject.getJSONObject("response");
+ try {
+ return new ResponseDescribeResource(jsonObject, info);
+ } catch (Exception e) {
+ return new ResponseDescribe(jsonObject, info);
+ }
+ } catch (JSONException e) {
+ // no response field...
+ throw new IllegalArgumentException(ResponseDescribe.class.getName() + " json malformed");
+ }
+ }
+
+ public ResponseDescribe(JSONObject jsonObject, JSONObject info) {
+ super(jsonObject);
+ this.info = info;
+ }
+
+ public JSONObject getInfo() {
+ return info;
+ }
+}
diff --git a/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/gateway/ResponseGet.java b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/gateway/ResponseGet.java
new file mode 100644
index 0000000..5c257b6
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/gateway/ResponseGet.java
@@ -0,0 +1,42 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.http.client.snamessage.gateway;
+
+import org.eclipse.sensinact.studio.http.client.snamessage.ResponseGetError;
+import org.eclipse.sensinact.studio.http.client.snamessage.ResponseGetOK;
+import org.eclipse.sensinact.studio.http.client.snamessage.ResponseKO;
+import org.eclipse.sensinact.studio.http.client.snamessage.ResponseMessage;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+/**
+ * @author Etienne Gandrille
+ */
+public abstract class ResponseGet extends ResponseMessage {
+
+ public static final String KEY = "GET_RESPONSE";
+
+ public static ResponseGet build(JSONObject jsonObject) {
+ try {
+ int statusCode = jsonObject.getInt("statusCode");
+ if (statusCode == 200)
+ return new ResponseGetOK(jsonObject);
+ else
+ return new ResponseGetError(jsonObject, new ResponseKO(jsonObject));
+ } catch (JSONException e) {
+ throw new IllegalArgumentException(ResponseGet.class.getName() + " json malformed");
+ }
+ }
+
+ public ResponseGet(JSONObject jsonObject) {
+ super(jsonObject);
+ }
+}
diff --git a/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/gateway/ResponseSet.java b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/gateway/ResponseSet.java
new file mode 100644
index 0000000..659d09a
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/gateway/ResponseSet.java
@@ -0,0 +1,43 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.http.client.snamessage.gateway;
+
+import org.eclipse.sensinact.studio.http.client.snamessage.ResponseKO;
+import org.eclipse.sensinact.studio.http.client.snamessage.ResponseMessage;
+import org.eclipse.sensinact.studio.http.client.snamessage.ResponseOK;
+import org.eclipse.sensinact.studio.http.client.snamessage.ResponseSetError;
+import org.eclipse.sensinact.studio.http.client.snamessage.ResponseSetOK;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+/**
+ * @author Etienne Gandrille
+ */
+public abstract class ResponseSet extends ResponseMessage {
+
+ public static final String KEY = "SET_RESPONSE";
+
+ public ResponseSet(JSONObject jsonObject) {
+ super(jsonObject);
+ }
+
+ public static ResponseSet build(JSONObject jsonObject) {
+ try {
+ int statusCode = jsonObject.getInt("statusCode");
+ if (statusCode == 200)
+ return new ResponseSetOK(jsonObject, new ResponseOK(jsonObject));
+ else
+ return new ResponseSetError(jsonObject, new ResponseKO(jsonObject));
+ } catch (JSONException e) {
+ throw new IllegalArgumentException(ResponseSet.class.getName() + " json malformed");
+ }
+ }
+}
diff --git a/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/gateway/ResponseSubscribe.java b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/gateway/ResponseSubscribe.java
new file mode 100644
index 0000000..d8a4a25
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/gateway/ResponseSubscribe.java
@@ -0,0 +1,52 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.http.client.snamessage.gateway;
+
+import org.eclipse.sensinact.studio.http.client.snamessage.ResponseMessage;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class ResponseSubscribe extends ResponseMessage {
+
+ public static final String KEY = "SUBSCRIBE_RESPONSE";
+
+ private final String id;
+
+ // {"response":{"subscriptionId":"event18040186921465822896394"},"statusCode":200,"type":"SUBSCRIBE_RESPONSE","uri":"/sensiNact/system/event"}
+ public ResponseSubscribe(JSONObject jsonObject) {
+ super(jsonObject);
+
+ try {
+ id = jsonObject.getJSONObject("response").getString("subscriptionId");
+ } catch (JSONException e) {
+ throw new IllegalArgumentException(this.getClass().getName() + " json malformed");
+ }
+ }
+
+ public String getSubscriptionId() {
+ return id;
+ }
+
+ @Override
+ public String getPrettyPrintedValue() {
+ return id;
+ }
+
+ @Override
+ public String getFullDescription() {
+ String msg = super.getFullDescription();
+ msg += "id:" + id;
+ return msg;
+ }
+}
diff --git a/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/gateway/ResponseUnsubscribe.java b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/gateway/ResponseUnsubscribe.java
new file mode 100644
index 0000000..860f203
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/client/snamessage/gateway/ResponseUnsubscribe.java
@@ -0,0 +1,58 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.http.client.snamessage.gateway;
+
+import org.eclipse.sensinact.studio.http.client.snamessage.ResponseMessage;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class ResponseUnsubscribe extends ResponseMessage {
+
+ public static final String KEY = "UNSUBSCRIBE_RESPONSE";
+
+ private final String taskId;
+ private final String status;
+ private final int start;
+ private final int end;
+
+ //{"response":{"taskId":"sensiNact#UNSUBSCRIBE#system#event","status":"ABORDED","start":1465823758549,"end":1465823758549},"statusCode":200,"type":"UNSUBSCRIBE_RESPONSE","uri":"/sensiNact/system/event"}
+ public ResponseUnsubscribe(JSONObject jsonObject) {
+ super(jsonObject);
+
+ try {
+ JSONObject response = jsonObject.getJSONObject("response");
+ taskId = response.getString("taskId");
+ status = response.getString("status");
+ start = response.getInt("start");
+ end = response.getInt("end");
+ } catch (JSONException e) {
+ throw new IllegalArgumentException(this.getClass().getName() + " json malformed");
+ }
+ }
+
+ @Override
+ public String getPrettyPrintedValue() {
+ return taskId;
+ }
+
+ @Override
+ public String getFullDescription() {
+ String msg = super.getFullDescription();
+ msg += "taskId:" + taskId + "\n";
+ msg += "status: " + status + "\n";
+ msg += "start: " + start + "\n";
+ msg += "end: " + end + "\n";
+ return msg;
+ }
+}
diff --git a/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/server/BundleResourceClientHelper.java b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/server/BundleResourceClientHelper.java
new file mode 100644
index 0000000..763dd9e
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/server/BundleResourceClientHelper.java
@@ -0,0 +1,110 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+
+package org.eclipse.sensinact.studio.http.server;
+
+import java.net.URL;
+import java.util.Date;
+
+import org.restlet.Client;
+import org.restlet.Request;
+import org.restlet.Response;
+import org.restlet.data.Method;
+import org.restlet.data.Protocol;
+import org.restlet.data.Status;
+import org.restlet.engine.local.Entity;
+import org.restlet.engine.local.LocalClientHelper;
+import org.restlet.representation.InputRepresentation;
+import org.restlet.representation.Representation;
+
+/**
+ * @author Nicolas Hili
+ * @since Nov 19, 2014
+ *
+ * @see http://permalink.gmane.org/gmane.comp.java.restlet/12378
+ */
+public class BundleResourceClientHelper extends LocalClientHelper {
+
+ public static final Protocol BUNDLERESOURCE = new Protocol("bundleresource","BUNDLERESOURCE",
+ "OSGI Bundle Resource", Protocol.UNKNOWN_PORT);
+
+ public BundleResourceClientHelper(Client client)
+ {
+ super(client);
+
+ getProtocols().add(BUNDLERESOURCE);
+ }
+
+ @Override
+ protected void handleLocal(Request request, Response response, String decodedPath) {
+ String scheme = request.getResourceRef().getScheme();
+ if(BUNDLERESOURCE.getSchemeName().equalsIgnoreCase(scheme))
+ {
+ handleFile(request,response);
+ }
+ else
+ {
+ throw new IllegalArgumentException("Protocol " + scheme + " not supported, only BUNDLERESOURCE is supported");
+ }
+ }
+
+ private void handleFile(Request request, Response response)
+ {
+ if(Method.GET.equals(request.getMethod()) || Method.HEAD.equals(request.getMethod()))
+ {
+ handleGet(request,response);
+ }
+ else {
+ response.setStatus(Status.CLIENT_ERROR_METHOD_NOT_ALLOWED);
+ response.getAllowedMethods().add(Method.GET);
+ response.getAllowedMethods().add(Method.HEAD);
+ }
+ }
+
+ private void handleGet(Request request, Response response)
+ {
+ try
+ {
+ String path = request.getResourceRef().getPath();
+ URL url = new URL(request.getResourceRef().toString());
+ Representation output = new InputRepresentation(url
+ .openStream(), getMetadataService()
+ .getDefaultMediaType());
+ output.setLocationRef(request.getResourceRef());
+ output.setModificationDate(new Date());
+
+ // Update the expiration date
+ long timeToLive = getTimeToLive();
+
+ if (timeToLive == 0) {
+ output.setExpirationDate(null);
+ } else if (timeToLive > 0) {
+ output.setExpirationDate(new Date(System
+ .currentTimeMillis()
+ + (1000L * timeToLive)));
+ }
+
+ // Update the metadata based on file extensions
+ String name = path.substring(path.lastIndexOf('/') + 1);
+ Entity.updateMetadata(name, output, true,
+ getMetadataService());
+
+ // Update the response
+ response.setEntity(output);
+ response.setStatus(Status.SUCCESS_OK);
+ }
+ catch(Exception e)
+ {
+ response.setStatus(Status.CLIENT_ERROR_NOT_FOUND);
+ }
+ }
+
+}
diff --git a/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/server/GatewayHttpServer.java b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/server/GatewayHttpServer.java
new file mode 100644
index 0000000..09bc906
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/server/GatewayHttpServer.java
@@ -0,0 +1,139 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.http.server;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Level;
+
+import org.apache.log4j.Logger;
+import org.eclipse.sensinact.studio.http.server.serverstarted.PortUpdate;
+import org.eclipse.sensinact.studio.http.server.serverstarted.ResourceAddedUpdate;
+import org.eclipse.sensinact.studio.http.server.serverstarted.ServerUpdatedManager;
+import org.eclipse.sensinact.studio.preferences.ConfigurationListerner;
+import org.eclipse.sensinact.studio.preferences.ConfigurationManager;
+import org.eclipse.sensinact.studio.preferences.GatewayHttpConfig;
+import org.restlet.Component;
+import org.restlet.Restlet;
+import org.restlet.data.Protocol;
+import org.restlet.engine.Engine;
+import org.restlet.resource.ServerResource;
+
+public class GatewayHttpServer extends SensinactServerResource implements ConfigurationListerner {
+
+ private static final Logger logger = Logger.getLogger(GatewayHttpServer.class);
+
+ private Component serverComponent;
+
+ private List<String> registeredPaths = new ArrayList<>();
+
+ private boolean serverRuning = false;
+
+ private static GatewayHttpServer instance;
+
+ synchronized public static GatewayHttpServer getInstance() {
+ if (instance == null) {
+ instance = new GatewayHttpServer();
+ try {
+ int port = ConfigurationManager.getStudioPort();
+ instance.initServer();
+ instance.updateServerPort(port);
+ } catch (Exception e) {
+ logger.error("GatewayHttpServer creation", e);
+ }
+ }
+ return instance;
+ }
+
+ public boolean isServerRuning() {
+ return serverRuning;
+ }
+
+ private GatewayHttpServer() {
+ ConfigurationManager.addListener(this);
+ configureEngine();
+ }
+
+ private void configureEngine() {
+ // Restlet global config
+ Engine.setLogLevel(Level.OFF);
+
+ // This is used to allow the server to return bundle resources
+ Engine.getInstance().getRegisteredClients().add(new BundleResourceClientHelper(null));
+ }
+
+ private void initServer() throws Exception {
+ if (serverComponent == null) {
+
+ // Create the webapp component
+ serverComponent = new Component();
+ serverComponent.getClients().add(BundleResourceClientHelper.BUNDLERESOURCE);
+ }
+ }
+
+ public void attach(String uriPattern, Restlet target) throws Exception {
+ logger.debug("http resource registered: " + uriPattern);
+ registeredPaths.add(uriPattern);
+ serverComponent.getDefaultHost().attach(uriPattern, target);
+ if (serverComponent.isStarted())
+ ServerUpdatedManager.getInstance().notifyServerUpdated(new ResourceAddedUpdate(uriPattern, registeredPaths));
+ }
+
+ public void attach(String pathTemplate, Class<? extends ServerResource> targetClass) throws Exception {
+ logger.debug("http resource registered: " + pathTemplate);
+ registeredPaths.add(pathTemplate);
+ serverComponent.getDefaultHost().attach(pathTemplate, targetClass);
+ if (serverComponent.isStarted())
+ ServerUpdatedManager.getInstance().notifyServerUpdated(new ResourceAddedUpdate(pathTemplate, registeredPaths));
+ }
+
+ public void updateServerPort(int port) throws Exception {
+ // stop running server
+ if (serverRuning) {
+ serverRuning = false;
+ serverComponent.stop();
+ serverComponent.getServers().remove(0);
+ }
+
+ // start new server
+ if (port != 0) {
+ serverComponent.getServers().add(Protocol.HTTP, port);
+ serverComponent.start();
+ serverRuning = true;
+ }
+
+ // notify
+ ServerUpdatedManager.getInstance().notifyServerUpdated(new PortUpdate(port));
+ }
+
+ /* ======================== */
+ /* Config listener callback */
+ /* ======================== */
+
+ @Override
+ public void studioPortUpdatedNotif(int port) {
+ try {
+ updateServerPort(port);
+ } catch (Exception e) {
+ logger.error("update server port", e);
+ }
+ }
+
+ @Override
+ public void gatewayAddedOrUpdatedNotif(GatewayHttpConfig gateway) {
+ // do nothing
+ }
+
+ @Override
+ public void gatewayRemovedNotif(String name) {
+ // do nothing
+ }
+}
diff --git a/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/server/RouteUtil.java b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/server/RouteUtil.java
new file mode 100644
index 0000000..564baba
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/server/RouteUtil.java
@@ -0,0 +1,44 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.http.server;
+
+import org.apache.log4j.Logger;
+import org.restlet.Application;
+import org.restlet.resource.ServerResource;
+
+public class RouteUtil {
+
+ public static final String ENCODING = "UTF-8";
+
+ private static final Logger logger = Logger.getLogger(RouteUtil.class);
+
+ private static final GatewayHttpServer server = GatewayHttpServer.getInstance();
+
+ public static boolean attachRoute(String pathTemplate, Class<? extends ServerResource> targetClass) {
+ try {
+ server.attach(pathTemplate, targetClass);
+ return true;
+ } catch (Exception e) {
+ logger.error("attach route fails", e);
+ return false;
+ }
+ }
+
+ public static boolean attachRoute(String pathTemplate, Application application) {
+ try {
+ server.attach(pathTemplate, application);
+ return true;
+ } catch (Exception e) {
+ logger.error("attach route fails", e);
+ return false;
+ }
+ }
+}
diff --git a/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/server/SensinactServerResource.java b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/server/SensinactServerResource.java
new file mode 100644
index 0000000..9ec5549
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/server/SensinactServerResource.java
@@ -0,0 +1,23 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.http.server;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+
+import org.restlet.resource.ServerResource;
+
+public abstract class SensinactServerResource extends ServerResource {
+
+ protected String getRequestAttribute(String name) throws UnsupportedEncodingException {
+ return URLDecoder.decode(getRequestAttributes().get(name).toString(), RouteUtil.ENCODING);
+ }
+}
diff --git a/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/server/serverstarted/PortUpdate.java b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/server/serverstarted/PortUpdate.java
new file mode 100644
index 0000000..9200de8
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/server/serverstarted/PortUpdate.java
@@ -0,0 +1,25 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.http.server.serverstarted;
+
+public class PortUpdate extends UpdateDescriptor {
+
+ private final int port;
+
+ public PortUpdate(int port) {
+ super(UpdateType.PORT_UPDATE);
+ this.port = port;
+ }
+
+ public int getPort() {
+ return port;
+ }
+}
diff --git a/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/server/serverstarted/ResourceAddedUpdate.java b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/server/serverstarted/ResourceAddedUpdate.java
new file mode 100644
index 0000000..4986516
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/server/serverstarted/ResourceAddedUpdate.java
@@ -0,0 +1,36 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.http.server.serverstarted;
+
+import java.util.List;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class ResourceAddedUpdate extends UpdateDescriptor {
+
+ private final String curPath;
+ private final List<String> registeredPaths;
+
+ public ResourceAddedUpdate(String curPath, List<String> registeredPaths) {
+ super(UpdateType.RESOURCE_ADDED);
+ this.curPath = curPath;
+ this.registeredPaths = registeredPaths;
+ }
+
+ public List<String> getRegisteredPath() {
+ return registeredPaths;
+ }
+
+ public String getCurPath() {
+ return curPath;
+ }
+}
diff --git a/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/server/serverstarted/ServerUpdatedListener.java b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/server/serverstarted/ServerUpdatedListener.java
new file mode 100644
index 0000000..b749736
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/server/serverstarted/ServerUpdatedListener.java
@@ -0,0 +1,16 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.http.server.serverstarted;
+
+public interface ServerUpdatedListener {
+
+ public void serverUpdated(UpdateDescriptor descriptor);
+}
diff --git a/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/server/serverstarted/ServerUpdatedManager.java b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/server/serverstarted/ServerUpdatedManager.java
new file mode 100644
index 0000000..0680b21
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/server/serverstarted/ServerUpdatedManager.java
@@ -0,0 +1,51 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.http.server.serverstarted;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.apache.log4j.Logger;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class ServerUpdatedManager {
+
+ private static final Logger logger = Logger.getLogger(ServerUpdatedManager.class);
+
+ private static ServerUpdatedManager INSTANCE = null;
+ private final Set<ServerUpdatedListener> listeners = new HashSet<ServerUpdatedListener>();
+
+ private ServerUpdatedManager() {
+ }
+
+ public static ServerUpdatedManager getInstance() {
+ if (INSTANCE == null)
+ INSTANCE = new ServerUpdatedManager();
+ return INSTANCE;
+ }
+
+ public void removeServerUpdatedListener(ServerUpdatedListener listener) {
+ listeners.remove(listener);
+ }
+
+ public void addServerUpdatedListener(ServerUpdatedListener listener) {
+ listeners.add(listener);
+ }
+
+ public void notifyServerUpdated(UpdateDescriptor descriptor) {
+ logger.debug("Server updated. Notification fired (" + listeners.size() + " listeners");
+ for (ServerUpdatedListener listener : listeners) {
+ listener.serverUpdated(descriptor);
+ }
+ }
+}
diff --git a/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/server/serverstarted/UpdateDescriptor.java b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/server/serverstarted/UpdateDescriptor.java
new file mode 100644
index 0000000..11acaff
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.http/src/org/eclipse/sensinact/studio/http/server/serverstarted/UpdateDescriptor.java
@@ -0,0 +1,31 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.http.server.serverstarted;
+
+/**
+ * @author Etienne Gandrille
+ */
+public abstract class UpdateDescriptor {
+
+ private final UpdateType type;
+
+ protected UpdateDescriptor(UpdateType type) {
+ this.type = type;
+ }
+
+ public UpdateType getType() {
+ return type;
+ }
+
+ public enum UpdateType {
+ PORT_UPDATE, RESOURCE_ADDED;
+ }
+}
diff --git a/services/org.eclipse.sensinact.studio.model.manager/META-INF/MANIFEST.MF b/services/org.eclipse.sensinact.studio.model.manager/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..96973be
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.manager/META-INF/MANIFEST.MF
@@ -0,0 +1,20 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Manager
+Bundle-SymbolicName: org.eclipse.sensinact.studio.model.manager;singleton:=true
+Bundle-Version: 1.0.0.qualifier
+Bundle-Activator: org.eclipse.sensinact.studio.model.manager.Activator
+Require-Bundle: org.json,
+ org.eclipse.emf.transaction,
+ org.restlet,
+ org.eclipse.sensinact.studio.model.resource,
+ org.eclipse.sensinact.studio.http,
+ org.apache.log4j,
+ org.eclipse.sensinact.studio.preferences
+Bundle-RequiredExecutionEnvironment: JavaSE-1.7
+Bundle-ActivationPolicy: lazy
+Export-Package: org.eclipse.sensinact.studio.model.manager.listener.devicelocation,
+ org.eclipse.sensinact.studio.model.manager.listener.modelset,
+ org.eclipse.sensinact.studio.model.manager.listener.subscription,
+ org.eclipse.sensinact.studio.model.manager.modelupdater
+Import-Package: org.apache.log4j
diff --git a/services/org.eclipse.sensinact.studio.model.manager/about.html b/services/org.eclipse.sensinact.studio.model.manager/about.html
new file mode 100644
index 0000000..3b39f88
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.manager/about.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"><head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 5, 2006</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+
+</body></html>
\ No newline at end of file
diff --git a/services/org.eclipse.sensinact.studio.model.manager/build.properties b/services/org.eclipse.sensinact.studio.model.manager/build.properties
new file mode 100644
index 0000000..30f220c
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.manager/build.properties
@@ -0,0 +1,16 @@
+#
+# Copyright (c) 2017 CEA.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+# CEA - initial API and implementation and/or initial documentation
+#
+
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ plugin.xml
diff --git a/services/org.eclipse.sensinact.studio.model.manager/plugin.xml b/services/org.eclipse.sensinact.studio.model.manager/plugin.xml
new file mode 100644
index 0000000..a27203c
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.manager/plugin.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Copyright (c) 2017 CEA.
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+
+ Contributors:
+ CEA - initial API and implementation and/or initial documentation
+
+-->
+<?eclipse version="3.4"?>
+<plugin>
+ <extension
+ point="org.eclipse.emf.transaction.editingDomains">
+ <editingDomain
+ id="org.eclipse.sensinact.studio.model.resource.editingDomain">
+ </editingDomain>
+ </extension>
+ <extension
+ point="org.eclipse.emf.transaction.listeners">
+ <listener
+ class="org.eclipse.sensinact.studio.model.manager.listener.modelset.ResourceModelSetListenerInternal">
+ <editingDomain
+ id="org.eclipse.sensinact.studio.model.resource.editingDomain">
+ </editingDomain>
+ </listener>
+ </extension>
+</plugin>
diff --git a/services/org.eclipse.sensinact.studio.model.manager/src/org/eclipse/sensinact/studio/model/manager/Activator.java b/services/org.eclipse.sensinact.studio.model.manager/src/org/eclipse/sensinact/studio/model/manager/Activator.java
new file mode 100644
index 0000000..544e1e3
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.manager/src/org/eclipse/sensinact/studio/model/manager/Activator.java
@@ -0,0 +1,54 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.model.manager;
+
+import org.eclipse.sensinact.studio.model.manager.http.InitRoutes;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class Activator implements BundleActivator {
+
+ // The plug-in ID
+ public static final String PLUGIN_ID = "org.eclipse.sensinact.studio.model.manager"; //$NON-NLS-1$
+
+ // The shared instance
+ private static Activator plugin;
+
+ /**
+ * The constructor
+ */
+ public Activator() {
+ // init HTTP routes in server
+ InitRoutes.initRoutes();
+ }
+
+ @Override
+ public void start(BundleContext context) throws Exception {
+ plugin = this;
+ }
+
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ plugin = null;
+ }
+
+ /**
+ * Returns the shared instance
+ *
+ * @return the shared instance
+ */
+ public static Activator getDefault() {
+ return plugin;
+ }
+}
diff --git a/services/org.eclipse.sensinact.studio.model.manager/src/org/eclipse/sensinact/studio/model/manager/http/DeviceInfoRoute.java b/services/org.eclipse.sensinact.studio.model.manager/src/org/eclipse/sensinact/studio/model/manager/http/DeviceInfoRoute.java
new file mode 100644
index 0000000..186a972
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.manager/src/org/eclipse/sensinact/studio/model/manager/http/DeviceInfoRoute.java
@@ -0,0 +1,65 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.model.manager.http;
+
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.util.List;
+
+import org.apache.log4j.Logger;
+import org.eclipse.sensinact.studio.http.server.SensinactServerResource;
+import org.eclipse.sensinact.studio.model.manager.modelupdater.ModelEditor;
+import org.eclipse.sensinact.studio.model.manager.modelupdater.ModelUpdater;
+import org.restlet.resource.Get;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class DeviceInfoRoute extends SensinactServerResource {
+
+ private static final Logger logger = Logger.getLogger(DeviceInfoRoute.class);
+
+ @Get
+ public String getValue(String params) {
+
+ StringBuilder sb = new StringBuilder();
+
+ try {
+ String gatewayName = getRequestAttribute("gateway");
+ String deviceName = getRequestAttribute("device");
+
+ String fullName = gatewayName + "/" + deviceName;
+
+ sb.append("<b>" + fullName + "</b><br/>");
+ List<String> serviceIds = ModelEditor.getInstance().getServicesId(gatewayName, deviceName);
+ if(serviceIds.size()==0){
+ ModelUpdater.getInstance().updateServicesRecursive(gatewayName, deviceName);
+ serviceIds = ModelEditor.getInstance().getServicesId(gatewayName, deviceName);
+ }
+ for (String serviceId : serviceIds) {
+ String link = "updatePopupOnClick('" + fullName + "','" + serviceId + "')";
+ String symbol = "+";
+ sb.append("<a href=\"#\" onclick=\"" + link + "\"> " + symbol + " " + serviceId + "</a><br/>\n");
+ }
+
+ return sb.toString();
+ } catch (InterruptedException e) {
+ logger.error("DeviceInfoRoute", e);
+ return "ERROR - see logs";
+ } catch (UnsupportedEncodingException e) {
+ logger.error("DeviceInfoRoute - decode error", e);
+ return "ERROR - see logs";
+ } catch (IOException e) {
+ logger.error("DeviceInfoRoute - decode error", e);
+ return "ERROR - see logs";
+ }
+ }
+}
diff --git a/services/org.eclipse.sensinact.studio.model.manager/src/org/eclipse/sensinact/studio/model/manager/http/GatewayHttpServerRoute.java b/services/org.eclipse.sensinact.studio.model.manager/src/org/eclipse/sensinact/studio/model/manager/http/GatewayHttpServerRoute.java
new file mode 100644
index 0000000..05c29a2
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.manager/src/org/eclipse/sensinact/studio/model/manager/http/GatewayHttpServerRoute.java
@@ -0,0 +1,46 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.model.manager.http;
+
+import java.io.UnsupportedEncodingException;
+
+import org.apache.log4j.Logger;
+import org.eclipse.sensinact.studio.http.server.SensinactServerResource;
+import org.eclipse.sensinact.studio.model.manager.listener.subscription.SubscriptionManager;
+import org.restlet.Response;
+import org.restlet.data.Status;
+import org.restlet.resource.Post;
+
+/**
+ * @author Nicolas Hili
+ */
+public class GatewayHttpServerRoute extends SensinactServerResource {
+
+ private static final Logger logger = Logger.getLogger(GatewayHttpServerRoute.class);
+
+ @Post("json")
+ public Response getValue(String params) {
+ try {
+ String content = new String(params.getBytes());
+ String id = getRequestAttribute("id");
+
+ logger.debug("Callback recieved : " + content);
+ Status status = SubscriptionManager.getInstance().callbackRecieved(content, id);
+
+ Response response = getResponse();
+ response.setStatus(status);
+ return response;
+ } catch (UnsupportedEncodingException e) {
+ logger.error("DeviceInfoRoute - decode error", e);
+ return null;
+ }
+ }
+}
diff --git a/services/org.eclipse.sensinact.studio.model.manager/src/org/eclipse/sensinact/studio/model/manager/http/InitRoutes.java b/services/org.eclipse.sensinact.studio.model.manager/src/org/eclipse/sensinact/studio/model/manager/http/InitRoutes.java
new file mode 100644
index 0000000..1064fe5
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.manager/src/org/eclipse/sensinact/studio/model/manager/http/InitRoutes.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.model.manager.http;
+
+import org.eclipse.sensinact.studio.http.server.RouteUtil;
+
+/**
+ * @author Etienne Gandrille
+ */
+public abstract class InitRoutes {
+
+ public static void initRoutes() {
+ RouteUtil.attachRoute("/webapp/deviceinfo/{gateway}/{device}", DeviceInfoRoute.class);
+ RouteUtil.attachRoute("/webapp/deviceinfo/{gateway}/{device}/{service}", ServiceInfoRoute.class);
+ RouteUtil.attachRoute("/webapp/performAction/{gateway}/{device}/{service}/{ressource}", PerformActionRoute.class);
+ RouteUtil.attachRoute("/webapp/updatelocation/{gateway}/{device}", UpdateLocationRoute.class);
+ RouteUtil.attachRoute("/callback/{id}", GatewayHttpServerRoute.class);
+ }
+}
diff --git a/services/org.eclipse.sensinact.studio.model.manager/src/org/eclipse/sensinact/studio/model/manager/http/PerformActionRoute.java b/services/org.eclipse.sensinact.studio.model.manager/src/org/eclipse/sensinact/studio/model/manager/http/PerformActionRoute.java
new file mode 100644
index 0000000..544b2cf
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.manager/src/org/eclipse/sensinact/studio/model/manager/http/PerformActionRoute.java
@@ -0,0 +1,51 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.model.manager.http;
+
+import java.io.UnsupportedEncodingException;
+
+import org.apache.log4j.Logger;
+import org.eclipse.sensinact.studio.http.client.StudioRequest;
+import org.eclipse.sensinact.studio.http.client.UIResult;
+import org.eclipse.sensinact.studio.http.server.SensinactServerResource;
+import org.eclipse.sensinact.studio.model.resource.utils.ResourceDescriptor;
+import org.restlet.resource.Get;
+
+import org.eclipse.sensinact.studio.resource.AccessMethodType;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class PerformActionRoute extends SensinactServerResource {
+
+ private static final Logger logger = Logger.getLogger(PerformActionRoute.class);
+
+ @Get
+ public String getValue(String params) {
+ try {
+ String gatewayName = getRequestAttribute("gateway");
+ String deviceName = getRequestAttribute("device");
+ String serviceName = getRequestAttribute("service");
+ String ressourceName = getRequestAttribute("ressource");
+
+ ResourceDescriptor descriptor = new ResourceDescriptor(gatewayName, deviceName, serviceName, ressourceName);
+ StudioRequest request = new StudioRequest(descriptor, AccessMethodType.ACT);
+ UIResult result = request.sendRequestForIU();
+
+ logger.debug(result.asJson());
+
+ return result.asJson().toString();
+ } catch (UnsupportedEncodingException e) {
+ logger.error("DeviceInfoRoute - decode error", e);
+ return "";
+ }
+ }
+}
diff --git a/services/org.eclipse.sensinact.studio.model.manager/src/org/eclipse/sensinact/studio/model/manager/http/ServiceInfoRoute.java b/services/org.eclipse.sensinact.studio.model.manager/src/org/eclipse/sensinact/studio/model/manager/http/ServiceInfoRoute.java
new file mode 100644
index 0000000..8ff5fc0
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.manager/src/org/eclipse/sensinact/studio/model/manager/http/ServiceInfoRoute.java
@@ -0,0 +1,131 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.model.manager.http;
+
+import java.io.IOException;
+import java.util.List;
+
+import org.apache.log4j.Logger;
+import org.eclipse.sensinact.studio.http.client.StudioRequest;
+import org.eclipse.sensinact.studio.http.client.snamessage.SnaMessage;
+import org.eclipse.sensinact.studio.http.server.SensinactServerResource;
+import org.eclipse.sensinact.studio.model.manager.modelupdater.ModelEditor;
+import org.eclipse.sensinact.studio.model.resource.utils.ResourceDescriptor;
+import org.restlet.resource.Get;
+
+import org.eclipse.sensinact.studio.resource.AccessMethodType;
+import org.eclipse.sensinact.studio.resource.ResourcePackage;
+
+/**
+ * @author Etienne Gandrille
+ */public class ServiceInfoRoute extends SensinactServerResource {
+
+ private static final Logger logger = Logger.getLogger(ServiceInfoRoute.class);
+
+ @Get
+ public String getValue(String params) {
+
+ StringBuilder sb = new StringBuilder();
+
+ try {
+ String gatewayName = getRequestAttribute("gateway");
+ String deviceName = getRequestAttribute("device");
+ String serviceName = getRequestAttribute("service");
+
+ String fullName = gatewayName + "/" + deviceName;
+
+ sb.append("<b>" + fullName + "</b><br/>");
+
+ List<String> serviceIds = ModelEditor.getInstance().getServicesId(gatewayName, deviceName);
+ for (String serviceId : serviceIds) {
+
+ // service name
+
+ String symbol;
+ String linkParams;
+ if (serviceName.equals(serviceId)) {
+ symbol = "-";
+ linkParams = "'" + fullName + "'";
+ } else {
+ symbol = "+";
+ linkParams = "'" + fullName + "','" + serviceId + "'";
+ }
+ String link = "updatePopupOnClick(" + linkParams + ")";
+ sb.append("<a href=\"#\" onclick=\"" + link + "\"> " + symbol + " " + serviceId + "</a><br/>\n");
+
+ // resources, if needed
+ if (serviceName.equals(serviceId)) {
+ List<String> resourceIds = ModelEditor.getInstance().getResourcesId(gatewayName, deviceName, serviceName);
+ for (String resourceId : resourceIds) {
+
+ ResourceDescriptor descriptor = new ResourceDescriptor(gatewayName, deviceName, serviceName, resourceId);
+ int classifierID = ModelEditor.getInstance().getResourceClass(descriptor).getClassifierID();
+
+ // ACTION
+ if ( classifierID == ResourcePackage.ACTION) {
+ String jsParams = "'" + gatewayName + "','" + deviceName + "','" + serviceName + "','" + resourceId + "'";
+
+ // <a onclick="performAction(...)">...</a>
+ String resourceValueWithLink = writeOnClickStatement("performAction", jsParams, "<Action>");
+
+ sb.append(" " + resourceId + ": " + resourceValueWithLink + "<br/>");
+ }
+
+ // OTHER
+ else {
+ StudioRequest request = new StudioRequest(descriptor, AccessMethodType.GET);
+ SnaMessage response = request.sendRequest();
+ String resourceValue = response.getPrettyPrintedValue().replaceAll("\n", "<br/>");
+
+ // IMAGE
+ if (isImageUrl(resourceValue)) {
+ // <a onclick="showImage(...)">...</a>
+ String resourceValueWithLink = writeOnClickStatement("showImage", "'" + resourceValue + "'", resourceValue);
+ sb.append(" " + resourceId + ": " + resourceValueWithLink + "<br/>");
+ }
+ // NOT AN IMAGE
+ else {
+ sb.append(" " + resourceId + ": " + resourceValue + "<br/>");
+ }
+ }
+ }
+ }
+ }
+
+ return sb.toString();
+ } catch (IOException | InterruptedException e) {
+ logger.error("Service info route", e);
+ }
+ return "";
+ }
+
+ // returns '<a onclick="$jsFunction($jsParams)">$linkText</a>'
+ private String writeOnClickStatement(String jsFunction, String jsParams, String linkText) {
+ return "<a href=\"#\" onclick=\"" + jsFunction + "(" + jsParams + ")" +"\">" + linkText + "</a>";
+ }
+
+ private boolean isImageUrl(String resourceValue) {
+
+ String[] exts ={"gif", "jpg", "jpeg", "png"};
+
+ // protocol check : must be an url
+ if (! resourceValue.startsWith("http://") && ! resourceValue.startsWith("https://"))
+ return false;
+
+ // extension check : must be an image
+ for (String ext : exts) {
+ if (resourceValue.toLowerCase().endsWith("." + ext))
+ return true;
+ }
+
+ return false;
+ }
+}
\ No newline at end of file
diff --git a/services/org.eclipse.sensinact.studio.model.manager/src/org/eclipse/sensinact/studio/model/manager/http/UpdateLocationRoute.java b/services/org.eclipse.sensinact.studio.model.manager/src/org/eclipse/sensinact/studio/model/manager/http/UpdateLocationRoute.java
new file mode 100644
index 0000000..5b54b4b
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.manager/src/org/eclipse/sensinact/studio/model/manager/http/UpdateLocationRoute.java
@@ -0,0 +1,56 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.model.manager.http;
+
+import java.io.UnsupportedEncodingException;
+
+import org.apache.log4j.Logger;
+import org.eclipse.sensinact.studio.http.server.SensinactServerResource;
+import org.eclipse.sensinact.studio.model.manager.listener.devicelocation.DeviceLocationManager;
+import org.eclipse.sensinact.studio.model.resource.utils.DeviceDescriptor;
+import org.eclipse.sensinact.studio.model.resource.utils.GPScoordinates;
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.restlet.Response;
+import org.restlet.data.Status;
+import org.restlet.resource.Post;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class UpdateLocationRoute extends SensinactServerResource {
+
+ private static final Logger logger = Logger.getLogger(UpdateLocationRoute.class);
+
+ @Post("json")
+ public Response getValue(String params) {
+ Response response = getResponse();
+
+ try {
+ String gatewayName = getRequestAttribute("gateway");
+ String deviceName = getRequestAttribute("device");
+
+ JSONObject jsonMsg = new JSONObject(params);
+ double lat = (Double) jsonMsg.get("lat");
+ double lng = (Double) jsonMsg.get("lng");
+ DeviceLocationManager.getInstance().updateLocationInServer(new DeviceDescriptor(gatewayName, deviceName), new GPScoordinates(lat, lng));
+ response.setStatus(Status.SUCCESS_OK);
+ } catch (UnsupportedEncodingException e) {
+ logger.error("DeviceInfoRoute - decode error", e);
+ response.setStatus(Status.SERVER_ERROR_INTERNAL);
+ } catch (JSONException e) {
+ logger.error("Update Location Route", e);
+ response.setStatus(Status.SERVER_ERROR_INTERNAL);
+ }
+
+ return response;
+ }
+}
diff --git a/services/org.eclipse.sensinact.studio.model.manager/src/org/eclipse/sensinact/studio/model/manager/listener/devicelocation/DeviceLocationListener.java b/services/org.eclipse.sensinact.studio.model.manager/src/org/eclipse/sensinact/studio/model/manager/listener/devicelocation/DeviceLocationListener.java
new file mode 100644
index 0000000..3f7dbbe
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.manager/src/org/eclipse/sensinact/studio/model/manager/listener/devicelocation/DeviceLocationListener.java
@@ -0,0 +1,24 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.model.manager.listener.devicelocation;
+
+import org.eclipse.sensinact.studio.model.resource.utils.DeviceDescriptor;
+import org.eclipse.sensinact.studio.model.resource.utils.GPScoordinates;
+
+/**
+ * @author Etienne Gandrille
+ */
+public interface DeviceLocationListener {
+
+ public void deviceLocationUpdated(GPScoordinates coordinate, DeviceDescriptor descriptor);
+
+ public void deviceRemoved(DeviceDescriptor descriptor);
+}
diff --git a/services/org.eclipse.sensinact.studio.model.manager/src/org/eclipse/sensinact/studio/model/manager/listener/devicelocation/DeviceLocationManager.java b/services/org.eclipse.sensinact.studio.model.manager/src/org/eclipse/sensinact/studio/model/manager/listener/devicelocation/DeviceLocationManager.java
new file mode 100644
index 0000000..93b7afa
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.manager/src/org/eclipse/sensinact/studio/model/manager/listener/devicelocation/DeviceLocationManager.java
@@ -0,0 +1,109 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.model.manager.listener.devicelocation;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.log4j.Logger;
+import org.eclipse.sensinact.studio.model.manager.modelupdater.ModelUpdater;
+import org.eclipse.sensinact.studio.model.resource.utils.DeviceDescriptor;
+import org.eclipse.sensinact.studio.model.resource.utils.GPScoordinates;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class DeviceLocationManager {
+
+ private static final Logger logger = Logger.getLogger(DeviceLocationManager.class);
+
+ private static DeviceLocationManager INSTANCE = null;
+ private final Set<DeviceLocationListener> locationListeners = new HashSet<DeviceLocationListener>();
+
+ private final Map<DeviceDescriptor, GPScoordinates> locations = new HashMap<DeviceDescriptor, GPScoordinates>();
+
+ private DeviceLocationManager() {
+ }
+
+ public static DeviceLocationManager getInstance() {
+ if (INSTANCE == null)
+ INSTANCE = new DeviceLocationManager();
+ return INSTANCE;
+ }
+
+ public void removeDeviceLocationListener(DeviceLocationListener listener) {
+ locationListeners.remove(listener);
+ }
+
+ public void addDeviceLocationListener(DeviceLocationListener listener) {
+ locationListeners.add(listener);
+ }
+
+ public void updateLocationInStudio(DeviceDescriptor deviceDescriptor, GPScoordinates newCoordinates) {
+ if (needUpdate(deviceDescriptor, newCoordinates)) {
+ locations.put(deviceDescriptor, newCoordinates);
+ logger.debug("Device location updated for " + deviceDescriptor + ". Notification fired (" + locationListeners.size() + " listeners");
+ for (DeviceLocationListener listener : locationListeners) {
+ listener.deviceLocationUpdated(newCoordinates, deviceDescriptor);
+ }
+ }
+ }
+
+ public void deleteGatewayInStudio(String gatewayName) {
+ // for iterating safely over the keyset while deleting elements in the map
+ DeviceDescriptor[] tab = locations.keySet().toArray(new DeviceDescriptor[0]);
+
+ for (int i=0; i<tab.length; i++) {
+ DeviceDescriptor descriptor = tab [i];
+ if (descriptor.getGateway() != null && descriptor.getGateway().equals(gatewayName)) {
+ deleteDeviceInStudio(descriptor);
+ }
+ }
+ }
+
+ public void deleteDeviceInStudio(DeviceDescriptor deviceDescriptor) {
+ locations.remove(deviceDescriptor);
+ logger.debug("Device location removed for " + deviceDescriptor + ". Notification fired (" + locationListeners.size() + " listeners");
+ for (DeviceLocationListener listener : locationListeners) {
+ listener.deviceRemoved(deviceDescriptor);
+ }
+ }
+
+ public void updateLocationInServer(DeviceDescriptor deviceDescriptor, GPScoordinates newCoordinates) {
+ if (needUpdate(deviceDescriptor, newCoordinates)) {
+ locations.put(deviceDescriptor, newCoordinates);
+ ModelUpdater.getInstance().updateLocationOnServer(deviceDescriptor, newCoordinates);
+ }
+ }
+
+ private boolean needUpdate(DeviceDescriptor deviceDescriptor, GPScoordinates newCoordinates) {
+ GPScoordinates oldCoordinates = locations.get(deviceDescriptor);
+ return (! newCoordinates.equals(oldCoordinates)) ;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ boolean start = true;
+ for (DeviceDescriptor deviceDescriptor : locations.keySet()) {
+ if (start)
+ start = false;
+ else
+ sb.append("\n");
+ sb.append(deviceDescriptor);
+ sb.append(" ");
+ sb.append(locations.get(deviceDescriptor));
+ }
+ return sb.toString();
+ }
+}
diff --git a/services/org.eclipse.sensinact.studio.model.manager/src/org/eclipse/sensinact/studio/model/manager/listener/modelset/ResourceModelSetListener.java b/services/org.eclipse.sensinact.studio.model.manager/src/org/eclipse/sensinact/studio/model/manager/listener/modelset/ResourceModelSetListener.java
new file mode 100644
index 0000000..52c11fc
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.manager/src/org/eclipse/sensinact/studio/model/manager/listener/modelset/ResourceModelSetListener.java
@@ -0,0 +1,20 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.model.manager.listener.modelset;
+
+import org.eclipse.emf.transaction.ResourceSetChangeEvent;
+
+/**
+ * @author Etienne Gandrille
+ */
+public interface ResourceModelSetListener {
+ public void modelSetUpdated(ResourceSetChangeEvent event);
+}
diff --git a/services/org.eclipse.sensinact.studio.model.manager/src/org/eclipse/sensinact/studio/model/manager/listener/modelset/ResourceModelSetListenerInternal.java b/services/org.eclipse.sensinact.studio.model.manager/src/org/eclipse/sensinact/studio/model/manager/listener/modelset/ResourceModelSetListenerInternal.java
new file mode 100644
index 0000000..1cf820b
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.manager/src/org/eclipse/sensinact/studio/model/manager/listener/modelset/ResourceModelSetListenerInternal.java
@@ -0,0 +1,53 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.model.manager.listener.modelset;
+
+import org.eclipse.emf.common.command.Command;
+import org.eclipse.emf.transaction.NotificationFilter;
+import org.eclipse.emf.transaction.ResourceSetChangeEvent;
+import org.eclipse.emf.transaction.ResourceSetListener;
+import org.eclipse.emf.transaction.RollbackException;
+
+/**
+ * @author Yazid Benazzouz
+ */
+public class ResourceModelSetListenerInternal implements ResourceSetListener {
+
+ @Override
+ public NotificationFilter getFilter() {
+ return null;
+ }
+
+ @Override
+ public Command transactionAboutToCommit(ResourceSetChangeEvent event) throws RollbackException {
+ return null;
+ }
+
+ @Override
+ public void resourceSetChanged(final ResourceSetChangeEvent event) {
+ ResourceModelSetManager.getInstance().notifyListeners(event);
+ }
+
+ @Override
+ public boolean isAggregatePrecommitListener() {
+ return false;
+ }
+
+ @Override
+ public boolean isPrecommitOnly() {
+ return false;
+ }
+
+ @Override
+ public boolean isPostcommitOnly() {
+ return false;
+ }
+}
diff --git a/services/org.eclipse.sensinact.studio.model.manager/src/org/eclipse/sensinact/studio/model/manager/listener/modelset/ResourceModelSetManager.java b/services/org.eclipse.sensinact.studio.model.manager/src/org/eclipse/sensinact/studio/model/manager/listener/modelset/ResourceModelSetManager.java
new file mode 100644
index 0000000..b22fa33
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.manager/src/org/eclipse/sensinact/studio/model/manager/listener/modelset/ResourceModelSetManager.java
@@ -0,0 +1,53 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.model.manager.listener.modelset;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.log4j.Logger;
+import org.eclipse.emf.transaction.ResourceSetChangeEvent;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class ResourceModelSetManager {
+
+ private static final Logger logger = Logger.getLogger(ResourceModelSetManager.class);
+
+ private static ResourceModelSetManager INSTANCE = null;
+
+ private List<ResourceModelSetListener> listeners = new ArrayList<>();
+
+ private ResourceModelSetManager() {
+ }
+
+ public static ResourceModelSetManager getInstance() {
+ if (INSTANCE == null)
+ INSTANCE = new ResourceModelSetManager();
+ return INSTANCE;
+ }
+
+ public boolean subscribe(ResourceModelSetListener listener) {
+ return listeners.add(listener);
+ }
+
+ public boolean unsubscribe(ResourceModelSetListener listener) {
+ return listeners.remove(listener);
+ }
+
+ void notifyListeners(ResourceSetChangeEvent event) {
+ logger.debug("Resource model set updated. Notification fired (" + listeners.size() + " listeners");
+ for (ResourceModelSetListener listener : listeners) {
+ listener.modelSetUpdated(event);
+ }
+ }
+}
diff --git a/services/org.eclipse.sensinact.studio.model.manager/src/org/eclipse/sensinact/studio/model/manager/listener/subscription/SubscriptionListener.java b/services/org.eclipse.sensinact.studio.model.manager/src/org/eclipse/sensinact/studio/model/manager/listener/subscription/SubscriptionListener.java
new file mode 100644
index 0000000..5fe2b04
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.manager/src/org/eclipse/sensinact/studio/model/manager/listener/subscription/SubscriptionListener.java
@@ -0,0 +1,22 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.model.manager.listener.subscription;
+
+import org.eclipse.sensinact.studio.http.client.snamessage.SnaMessage;
+import org.eclipse.sensinact.studio.model.resource.utils.ResourceDescriptor;
+
+/**
+ * @author Etienne Gandrille
+ */
+public interface SubscriptionListener
+{
+ void onEvent(SnaMessage response, ResourceDescriptor resource);
+}
diff --git a/services/org.eclipse.sensinact.studio.model.manager/src/org/eclipse/sensinact/studio/model/manager/listener/subscription/SubscriptionManager.java b/services/org.eclipse.sensinact.studio.model.manager/src/org/eclipse/sensinact/studio/model/manager/listener/subscription/SubscriptionManager.java
new file mode 100644
index 0000000..3c3bf7c
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.manager/src/org/eclipse/sensinact/studio/model/manager/listener/subscription/SubscriptionManager.java
@@ -0,0 +1,284 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.model.manager.listener.subscription;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.log4j.Logger;
+import org.eclipse.sensinact.studio.http.client.GatewayHttpClient;
+import org.eclipse.sensinact.studio.http.client.snamessage.SnaMessage;
+import org.eclipse.sensinact.studio.http.client.snamessage.SnaMessageFactory;
+import org.eclipse.sensinact.studio.http.client.snamessage.gateway.ResponseSubscribe;
+import org.eclipse.sensinact.studio.model.resource.utils.ResourceDescriptor;
+import org.eclipse.sensinact.studio.model.resource.utils.Segments;
+import org.eclipse.sensinact.studio.preferences.ConfigurationListerner;
+import org.eclipse.sensinact.studio.preferences.ConfigurationManager;
+import org.eclipse.sensinact.studio.preferences.GatewayHttpConfig;
+import org.eclipse.sensinact.studio.preferences.StudioHttpConfig;
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.restlet.data.Status;
+
+import org.eclipse.sensinact.studio.resource.AccessMethodType;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class SubscriptionManager implements ConfigurationListerner {
+
+ private static final Logger logger = Logger.getLogger(SubscriptionManager.class);
+
+ private static SubscriptionManager INSTANCE = null;
+
+ private final Map<String, ResourceDescriptor> id2resource = new HashMap<String, ResourceDescriptor>();
+ private final Map<ResourceDescriptor, Set<SubscriptionListener>> resource2listeners = new HashMap<ResourceDescriptor, Set<SubscriptionListener>>();
+
+ private SubscriptionManager() {
+ ConfigurationManager.addListener(this);
+ }
+
+ public static SubscriptionManager getInstance() {
+ if (INSTANCE == null)
+ INSTANCE = new SubscriptionManager();
+ return INSTANCE;
+ }
+
+ private String generateSubscriptionID(ResourceDescriptor resource){
+ return resource.toString()+"-"+System.currentTimeMillis();
+ }
+
+ public String subscribeResource(ResourceDescriptor resource, SubscriptionListener listener) throws IOException {
+
+ if (resource2listeners.get(resource) == null)
+ resource2listeners.put(resource, new HashSet<SubscriptionListener>());
+ resource2listeners.get(resource).add(listener);
+
+ String subsId = getSubscriptionId(resource);
+
+ if (subsId == null) {
+
+ try {
+ subsId = subscribeResourceInternal(resource);
+ }catch(IOException e){
+ subsId = generateSubscriptionID(resource);
+ }finally {
+ id2resource.put(subsId, resource);
+ }
+
+ }
+
+ return subsId;
+ }
+
+ public void unsubscribeResource(ResourceDescriptor resource, SubscriptionListener listener) throws IOException {
+ Set<SubscriptionListener> listeners = resource2listeners.get(resource);
+
+ if (listeners != null) {
+ listeners.remove(listener);
+ if (listeners.isEmpty()) {
+ resource2listeners.remove(resource);
+ String subsId = getSubscriptionId(resource);
+ if (subsId != null) {
+ id2resource.remove(subsId);
+ unsubscribeResourceInternal(resource, subsId);
+ }
+ }
+ }
+ }
+
+ public boolean hasSubscribeResource(ResourceDescriptor resource, SubscriptionListener listener) {
+ Set<SubscriptionListener> listeners = resource2listeners.get(resource);
+ if (listeners != null) {
+ if (listeners.contains(listener)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public List<String> getSubscriptionIDFromResourceURI(String eventURI){
+
+ List<String> subscriptions=new ArrayList<String>();
+
+ for(Map.Entry<String, ResourceDescriptor> entry:id2resource.entrySet()){
+ ResourceDescriptor resourceDescription=entry.getValue();
+ System.out.println("Key:"+entry.getKey().toString()+" Value:"+entry.getValue().toString());
+ String uriBuilt="/" + resourceDescription.getDevice() + "/" + resourceDescription.getService() + "/" + resourceDescription.getResource()+"/value";
+ if(uriBuilt.equals(eventURI)){
+ subscriptions.add(entry.getKey());
+ }
+ }
+
+ return subscriptions;
+ }
+
+ public Status callbackRecieved(String content, String subscriptionId) {
+ ResourceDescriptor resource = id2resource.get(subscriptionId);
+
+ System.out.println("Subscription ID "+subscriptionId+" Content "+content);
+
+ for(Map.Entry<String, ResourceDescriptor> entry:id2resource.entrySet()){
+ System.out.println("Signal: key"+entry.getKey()+" value:"+entry.getValue().toString());
+ }
+
+ if (resource != null) {
+ Set<SubscriptionListener> listeners = resource2listeners.get(resource);
+
+ SnaMessage response = null;
+ if (content != null) {
+ try {
+ response = SnaMessageFactory.build(resource.getGateway(), new JSONObject(content));
+ } catch (JSONException e) {
+ throw new IllegalArgumentException(content);
+ }
+ }
+ if (listeners != null) {
+ Iterator<SubscriptionListener> iterator = listeners.iterator();
+ while (iterator.hasNext()) {
+ SubscriptionListener listener = iterator.next();
+ listener.onEvent(response, resource);
+ }
+ return Status.SUCCESS_OK;
+ }
+ }
+
+ logger.info("SubscriptionManager::callbackRecieved Unknown subscription ID " + subscriptionId);
+ return Status.CLIENT_ERROR_NOT_FOUND; // error 404
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ for (String id : id2resource.keySet()) {
+ ResourceDescriptor resource = id2resource.get(id);
+ sb.append(id + " - " + resource + "\n");
+ for (SubscriptionListener listener : resource2listeners.get(resource)) {
+ sb.append(" * " + listener + "\n");
+ }
+ }
+
+ for (ResourceDescriptor resource : resource2listeners.keySet())
+ if (!id2resource.containsValue(resource))
+ sb.append("[ERROR] No id for resource " + resource + "\n");
+
+ return sb.toString();
+ }
+
+ /* ================================== */
+ /* callbacks for configuration update */
+ /* ================================== */
+
+ @Override
+ public void gatewayAddedOrUpdatedNotif(GatewayHttpConfig gateway) {
+ }
+
+ @Override
+ public void gatewayRemovedNotif(String name) {
+ }
+
+ @Override
+ public void studioPortUpdatedNotif(int port) {
+ logger.info("SubscriptionManager::studioConfigUpdated");
+ for (String id : id2resource.keySet()) {
+ ResourceDescriptor resource = id2resource.remove(id);
+ try {
+ unsubscribeResourceInternal(resource, id);
+ } catch (IOException e) {
+ logger.error("Unsubscribe failed", e);
+ }
+ String newId;
+ try {
+ newId = subscribeResourceInternal(resource);
+ id2resource.put(newId, resource);
+ } catch (IOException e) {
+ logger.error("Subscribe failed", e);
+ }
+ }
+ }
+
+ /* ======== */
+ /* internal */
+ /* ======== */
+
+ public String getSubscriptionId(ResourceDescriptor resource) {
+ for (String id : id2resource.keySet())
+ if (id2resource.get(id).equals(resource))
+ return id;
+ return null;
+ }
+
+ private static String subscribeResourceInternal(ResourceDescriptor resource) throws IOException {
+ JSONObject jsonObject = new JSONObject();
+
+ System.out.println("Resource:"+resource.getDevice());
+
+ GatewayHttpConfig gateway = ConfigurationManager.getGateway(resource.getGateway());
+ int port = ConfigurationManager.getStudioPort();
+ StudioHttpConfig studioConfig = new StudioHttpConfig(gateway, port);
+ String url = studioConfig.getUrl().toString();
+
+ //System.out.println("Studio URL:"+url);
+
+ if (url == null || url.isEmpty())
+ throw new IOException("URL is not valid - subscribtion fail");
+
+ // TODO update this with a constant --> see also InitRoutes.java
+ url += "/callback";
+
+ //System.out.println("Studio callback:"+url);
+
+ try {
+ jsonObject.put("callback", url);
+ } catch (JSONException e) {
+ logger.error("Should never happend");
+ }
+
+ Segments segment = new Segments.Builder().resource(resource).method(AccessMethodType.SUBSCRIBE).build();
+ System.out.println("Sending subscribe for resource " + segment + " with callback " + url);
+ logger.debug("Sending subscribe for resource " + segment + " with callback " + url);
+ SnaMessage response = GatewayHttpClient.sendPostRequest(segment, jsonObject);
+
+ if (response.isValid()) {
+ ResponseSubscribe objectResponse = (ResponseSubscribe) response;
+ String id = objectResponse.getSubscriptionId();
+ logger.debug("Recieved subscription id: " + id);
+ return id;
+ } else {
+ String msg = "Subscribe fails for resource " + resource;
+ logger.error(msg);
+ throw new IOException(msg);
+ }
+ }
+
+ private static void unsubscribeResourceInternal(ResourceDescriptor resource, String subsId) throws IOException {
+ try {
+ JSONObject jsonObject = new JSONObject();
+ jsonObject.put("usid", subsId);
+
+ Segments segments = new Segments.Builder().resource(resource).method(AccessMethodType.UNSUBSCRIBE).build();
+
+ logger.debug("Sending unsubscribe for resource " + segments);
+ GatewayHttpClient.sendPostRequest(segments, jsonObject);
+
+ } catch (JSONException e) {
+ String msg = "Unsubscribe fails for resource " + resource;
+ logger.error(msg, e);
+ throw new IOException(msg, e);
+ }
+ }
+}
diff --git a/services/org.eclipse.sensinact.studio.model.manager/src/org/eclipse/sensinact/studio/model/manager/modelupdater/ModelEditor.java b/services/org.eclipse.sensinact.studio.model.manager/src/org/eclipse/sensinact/studio/model/manager/modelupdater/ModelEditor.java
new file mode 100644
index 0000000..8b9b8df
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.manager/src/org/eclipse/sensinact/studio/model/manager/modelupdater/ModelEditor.java
@@ -0,0 +1,707 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.model.manager.modelupdater;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.log4j.Logger;
+import org.eclipse.emf.common.util.BasicEList;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.common.util.WrappedException;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.transaction.RecordingCommand;
+import org.eclipse.emf.transaction.RunnableWithResult;
+import org.eclipse.emf.transaction.TransactionalEditingDomain;
+import org.eclipse.sensinact.studio.http.client.GatewayHttpClient;
+import org.eclipse.sensinact.studio.http.client.snamessage.ResponseDescribeResource;
+import org.eclipse.sensinact.studio.http.client.snamessage.SnaMessage;
+import org.eclipse.sensinact.studio.http.client.snamessage.ResponseDescribeResource.RestAM;
+import org.eclipse.sensinact.studio.http.client.snamessage.ResponseDescribeResource.RestParam;
+import org.eclipse.sensinact.studio.model.manager.listener.devicelocation.DeviceLocationManager;
+import org.eclipse.sensinact.studio.model.resource.utils.DeviceDescriptor;
+import org.eclipse.sensinact.studio.model.resource.utils.ResourceDescriptor;
+import org.eclipse.sensinact.studio.model.resource.utils.Segments;
+import org.eclipse.sensinact.studio.preferences.ConfigurationListerner;
+import org.eclipse.sensinact.studio.preferences.ConfigurationManager;
+import org.eclipse.sensinact.studio.preferences.GatewayHttpConfig;
+
+import org.eclipse.sensinact.studio.resource.AccessMethod;
+import org.eclipse.sensinact.studio.resource.AccessMethodType;
+import org.eclipse.sensinact.studio.resource.Device;
+import org.eclipse.sensinact.studio.resource.Gateway;
+import org.eclipse.sensinact.studio.resource.Parameter;
+import org.eclipse.sensinact.studio.resource.Resource;
+import org.eclipse.sensinact.studio.resource.ResourceFactory;
+import org.eclipse.sensinact.studio.resource.ResourcePackage;
+import org.eclipse.sensinact.studio.resource.Service;
+import org.eclipse.sensinact.studio.resource.Studio;
+
+/**
+ * @author Nicolas Hili, Etienne Gandrille
+ */
+public class ModelEditor implements ConfigurationListerner {
+
+ /* ===================== */
+ /* Model data structures */
+ /* ===================== */
+
+ private static org.eclipse.emf.ecore.resource.Resource resource;
+
+ private final static String EDITING_DOMAIN_ID = "org.eclipse.sensinact.studio.model.resource.editingDomain";
+
+ private static TransactionalEditingDomain editingDomain;
+
+ private static final Logger logger = Logger.getLogger(ModelEditor.class);
+
+ private static ModelEditor INSTANCE = null;
+
+ private ModelEditor() {
+ ConfigurationManager.addListener(this);
+ }
+
+ public synchronized static ModelEditor getInstance() {
+ if (INSTANCE == null)
+ INSTANCE = new ModelEditor();
+ return INSTANCE;
+ }
+
+ @Override
+ public void gatewayAddedOrUpdatedNotif(GatewayHttpConfig gateway) {
+ addGatewayIfNotExist_UNSAFE(gateway.getName());
+ }
+
+ @Override
+ public void gatewayRemovedNotif(String name) {
+ removeGateway_UNSAFE(name);
+ }
+
+ @Override
+ public void studioPortUpdatedNotif(int port) {
+ // do nothing
+ }
+
+ private synchronized static TransactionalEditingDomain getEditingDomain() {
+ if (editingDomain == null) {
+ editingDomain = TransactionalEditingDomain.Registry.INSTANCE.getEditingDomain(EDITING_DOMAIN_ID);
+ }
+ return editingDomain;
+ }
+
+ private static org.eclipse.emf.ecore.resource.Resource getResource() {
+ if (resource == null) {
+ String path = "/org.eclipse.sensinact.studio.model.resource/cache/resource.cache";
+ URI uri = URI.createPlatformPluginURI(path, true);
+ resource = getEditingDomain().getResourceSet().createResource(uri);
+ }
+ return resource;
+ }
+
+ /**
+ * IMPORTANT. This method MUST NOT BE USED TO UPDATE THE MODEL !!!!
+ *
+ * @return
+ * @throws InterruptedException
+ */
+ public Studio getViewerInput() throws InterruptedException {
+
+ setupStudio();
+
+ // Init available gateways names
+ for (GatewayHttpConfig gateway : ConfigurationManager.getGateways()) {
+ addGatewayIfNotExist_UNSAFE(gateway.getName());
+ }
+
+ return (Studio) getEditingDomain().runExclusive(new RunnableWithResult.Impl<Studio>() {
+ @Override
+ public void run() {
+ setResult(USE_IN_RUNEXLUSIVE_getStudio());
+ return;
+ }
+ });
+ }
+
+ private void setupStudio() {
+
+ final String label=getResource() instanceof Resource?((Resource)getResource()).getName():"Unknown resource";
+
+ RecordingCommand command = new RecordingCommand(getEditingDomain(),label) {
+ @Override
+ protected void doExecute() {
+ EList<EObject> contents = getResource().getContents();
+ if (contents.size() == 0)
+ getResource().getContents().add(ResourceFactory.eINSTANCE.createStudio());
+ }
+ };
+ getEditingDomain().getCommandStack().execute(command);
+ }
+
+ /* ====================== */
+ /* Internal NON EXCLUSIVE */
+ /* ====================== */
+
+ private static Studio USE_IN_RUNEXLUSIVE_getStudio() {
+ EList<EObject> contents = getResource().getContents();
+ return (Studio) contents.get(0);
+ }
+
+ private static Gateway USE_IN_RUNEXLUSIVE_getGateway(String gatewayName) {
+ EList<Gateway> gateways = USE_IN_RUNEXLUSIVE_getStudio().getGateways();
+ for (Gateway gateway : gateways) {
+ if (gateway.getName().equals(gatewayName)) {
+ return gateway;
+ }
+ }
+ return null;
+ }
+
+ private static Device USE_IN_RUNEXLUSIVE_getDevice(String gatewayName, String devicename) {
+
+ Gateway gateway = USE_IN_RUNEXLUSIVE_getGateway(gatewayName);
+ if (gateway == null)
+ return null;
+
+ EList<Device> devices = gateway.getDevice();
+ for (Device device : devices) {
+ if (device.getName().equals(devicename)) {
+ return device;
+ }
+ }
+ return null;
+ }
+
+ private static Service USE_IN_RUNEXLUSIVE_getService(String gatewayName, String devicename, String servicename) {
+ Device device = USE_IN_RUNEXLUSIVE_getDevice(gatewayName, devicename);
+ if (device == null)
+ return null;
+
+ for (Service service : device.getService()) {
+ if (service.getName().equals(servicename)) {
+ return service;
+ }
+ }
+
+ return null;
+ }
+
+ private static Resource USE_IN_RUNEXLUSIVE_getResource(ResourceDescriptor descriptor) {
+ Service service = USE_IN_RUNEXLUSIVE_getService(descriptor.getGateway(), descriptor.getDevice(), descriptor.getService());
+ if (service == null)
+ return null;
+
+ for (Resource resource : service.getResource()) {
+ if (resource.getName().equals(descriptor.getResource())) {
+ return resource;
+ }
+ }
+
+ return null;
+ }
+
+ private void USE_IN_RUNEXLUSIVE_addDeviceIfNotExist(final String gatewayName, final String deviceId) {
+ if (USE_IN_RUNEXLUSIVE_getDevice(gatewayName, deviceId) != null)
+ return;
+
+ final Device addedDevice = ResourceFactory.eINSTANCE.createDevice();
+ addedDevice.setName(deviceId);
+ USE_IN_RUNEXLUSIVE_getGateway(gatewayName).getDevice().add(addedDevice);
+ }
+
+ private void USE_IN_RUNEXLUSIVE_addServiceIfNotExist(final String gatewayName, final String deviceId, final String serviceId) {
+ if (USE_IN_RUNEXLUSIVE_getService(gatewayName, deviceId, serviceId) != null)
+ return;
+
+ final Service addedService = ResourceFactory.eINSTANCE.createService();
+ addedService.setName(serviceId);
+ try {
+ USE_IN_RUNEXLUSIVE_getDevice(gatewayName, deviceId).getService().add(addedService);
+ } catch (NullPointerException e) {
+ e.printStackTrace();
+ System.out.println();
+ }
+ }
+
+ /* ======= */
+ /* Get IDs */
+ /* ======= */
+
+ @SuppressWarnings("unchecked")
+ public List<String> getGatewaysId() throws InterruptedException {
+
+ setupStudio();
+
+ return (List<String>) getEditingDomain().runExclusive(new RunnableWithResult.Impl<List<String>>() {
+ @Override
+ public void run() {
+ List<String> retval = new ArrayList<String>();
+ EList<Gateway> gateways = USE_IN_RUNEXLUSIVE_getStudio().getGateways();
+ for (Gateway gateway : gateways) {
+ retval.add(gateway.getName());
+ }
+ setResult(retval);
+ return;
+ }
+ });
+ }
+
+ @SuppressWarnings("unchecked")
+ public List<String> getDevicesId(final String gatewayName) throws InterruptedException {
+
+ //setupStudio();
+
+ return (List<String>) getEditingDomain().runExclusive(new RunnableWithResult.Impl<List<String>>() {
+ @Override
+ public void run() {
+ List<String> retval = new ArrayList<String>();
+ EList<Device> devices = USE_IN_RUNEXLUSIVE_getGateway(gatewayName).getDevice();
+ for (Device device : devices) {
+ retval.add(device.getName());
+ }
+ setResult(retval);
+ return;
+ }
+ });
+ }
+
+ @SuppressWarnings("unchecked")
+ public List<String> getServicesId(final String gatewayName, final String devicename) throws InterruptedException {
+
+ //setupStudio();
+
+ return (List<String>) getEditingDomain().runExclusive(new RunnableWithResult.Impl<List<String>>() {
+ @Override
+ public void run() {
+ List<String> retval = new ArrayList<String>();
+ Device device = USE_IN_RUNEXLUSIVE_getDevice(gatewayName, devicename);
+
+ if (device != null) {
+ for (Service service : device.getService()) {
+ retval.add(service.getName());
+ }
+ }
+
+ setResult(retval);
+ return;
+ }
+ });
+ }
+
+ @SuppressWarnings("unchecked")
+ public List<String> getResourcesId(final String gatewayName, final String devicename, final String servicename) throws InterruptedException {
+
+ setupStudio();
+
+ return (List<String>) getEditingDomain().runExclusive(new RunnableWithResult.Impl<List<String>>() {
+ @Override
+ public void run() {
+ List<String> retval = new ArrayList<String>();
+
+ Service service = USE_IN_RUNEXLUSIVE_getService(gatewayName, devicename, servicename);
+
+ if (service != null) {
+ for (Resource resource : service.getResource()) {
+ retval.add(resource.getName());
+ }
+ }
+
+ setResult(retval);
+ return;
+ }
+ });
+ }
+
+ /* ============= */
+ /* Checks exists */
+ /* ============= */
+
+ public boolean existsGateway(final String gatewayId) throws InterruptedException {
+ return getGatewaysId().contains(gatewayId);
+ }
+
+ public boolean existsDevice(final String gatewayId, String deviceId) throws InterruptedException {
+ return getDevicesId(gatewayId).contains(deviceId);
+ }
+
+ public boolean existsService(final String gatewayId, String deviceId, String serviceId) throws InterruptedException {
+ return getServicesId(gatewayId, deviceId).contains(serviceId);
+ }
+
+ public boolean existsResource(final String gatewayId, String deviceId, String serviceId, String resourceId) throws InterruptedException {
+ return existsResource(new ResourceDescriptor(gatewayId, deviceId, serviceId, resourceId));
+ }
+
+ public boolean existsResource(ResourceDescriptor descriptor) throws InterruptedException {
+ return getResourcesId(descriptor.getGateway(), descriptor.getDevice(), descriptor.getService()).contains(descriptor.getResource());
+ }
+
+ /* ============== */
+ /* Access Methods */
+ /* ============== */
+
+ @SuppressWarnings("unchecked")
+ public EList<AccessMethod> getAccessMethods(final ResourceDescriptor descriptor) throws InterruptedException {
+
+ setupStudio();
+
+ EList<AccessMethod> accessMethods = null;
+ accessMethods = (EList<AccessMethod>) getEditingDomain().runExclusive(new RunnableWithResult.Impl<EList<AccessMethod>>() {
+ @Override
+ public void run() {
+ EList<AccessMethod> accessMethods = new BasicEList<AccessMethod>();
+ Resource resource = USE_IN_RUNEXLUSIVE_getResource(descriptor);
+ for (AccessMethod accessMethod : resource.getAccessMethod()) {
+ accessMethods.add(accessMethod);
+ }
+ setResult(accessMethods);
+ return;
+ }
+ });
+ return accessMethods;
+ }
+
+ @SuppressWarnings("unchecked")
+ public EList<AccessMethod> getAccessMethodsWithType(final ResourceDescriptor descriptor, final AccessMethodType type) throws InterruptedException {
+
+ setupStudio();
+
+ EList<AccessMethod> accessMethods = null;
+ accessMethods = (EList<AccessMethod>) getEditingDomain().runExclusive(new RunnableWithResult.Impl<EList<AccessMethod>>() {
+ @Override
+ public void run() {
+ EList<AccessMethod> accessMethods = new BasicEList<AccessMethod>();
+ Resource resource = USE_IN_RUNEXLUSIVE_getResource(descriptor);
+ for (AccessMethod accessMethod : resource.getAccessMethod()) {
+ if (accessMethod.getType().equals(type)) {
+ accessMethods.add(accessMethod);
+ }
+ }
+ setResult(accessMethods);
+ return;
+ }
+ });
+ return accessMethods;
+ }
+
+ public AccessMethod getAccessMethodWithTypeNbParams(final ResourceDescriptor descriptor, final AccessMethodType type, final int nbOfParameters)
+ throws InterruptedException {
+
+ setupStudio();
+
+ return (AccessMethod) getEditingDomain().runExclusive(new RunnableWithResult.Impl<AccessMethod>() {
+ @Override
+ public void run() {
+ Resource resource = USE_IN_RUNEXLUSIVE_getResource(descriptor);
+ for (AccessMethod accessMethod : resource.getAccessMethod()) {
+ if (accessMethod.getType().equals(type)) {
+ if (accessMethod.getParameter().size() == nbOfParameters) {
+ setResult(accessMethod);
+ return;
+ }
+ }
+ }
+ setResult(null);
+ return;
+ }
+ });
+ }
+
+ /* ================= */
+ /* ADD Objects by ID */
+ /* ================= */
+
+ // USE CAREFULLY
+ // usually, if you want to add a gateway, use
+ // ConfigurationManager.addGateway
+ private void addGatewayIfNotExist_UNSAFE(final String gatewayName) {
+
+ //setupStudio();
+
+ RecordingCommand command = new RecordingCommand(getEditingDomain()) {
+
+ @Override
+ protected void doExecute() {
+ if (USE_IN_RUNEXLUSIVE_getGateway(gatewayName) != null)
+ return;
+
+ final Gateway addedGateway = ResourceFactory.eINSTANCE.createGateway();
+ addedGateway.setName(gatewayName);
+ USE_IN_RUNEXLUSIVE_getStudio().getGateways().add(addedGateway);
+ return;
+ }
+ };
+ getEditingDomain().getCommandStack().execute(command);
+ }
+
+ public void addDeviceIfNotExist(final String gatewayName, final String deviceId) {
+
+ //setupStudio();
+
+ RecordingCommand command = new RecordingCommand(getEditingDomain()) {
+ @Override
+ protected void doExecute() {
+ USE_IN_RUNEXLUSIVE_addDeviceIfNotExist(gatewayName, deviceId);
+ }
+ };
+ getEditingDomain().getCommandStack().execute(command);
+ }
+
+ public void addServiceIfNotExist(final String gatewayName, final String deviceId, final String serviceId) {
+
+ //setupStudio();
+
+ RecordingCommand command = new RecordingCommand(getEditingDomain()) {
+ @Override
+ protected void doExecute() {
+ USE_IN_RUNEXLUSIVE_addDeviceIfNotExist(gatewayName, deviceId);
+ USE_IN_RUNEXLUSIVE_addServiceIfNotExist(gatewayName, deviceId, serviceId);
+ }
+ };
+ getEditingDomain().getCommandStack().execute(command);
+ }
+
+ public void addResourceIfNotExist(final ResourceDescriptor descriptor) {
+
+ //setupStudio();
+
+ addServiceIfNotExist(descriptor.getGateway(), descriptor.getDevice(), descriptor.getService());
+
+ try {
+ if (!existsResource(descriptor)) {
+ Segments segment = new Segments.Builder().resource(descriptor).build();
+ SnaMessage response = GatewayHttpClient.sendGetRequest(segment);
+
+ if (!response.isValid()) {
+ throw new RuntimeException("Can't get remote resources info for " + descriptor);
+ }
+
+ final ResponseDescribeResource responseMessage = (ResponseDescribeResource) response;
+
+ RecordingCommand command = new RecordingCommand(getEditingDomain()) {
+ @Override
+ protected void doExecute() {
+
+ if (USE_IN_RUNEXLUSIVE_getResource(descriptor) != null)
+ return;
+
+ // create resource
+ EClass type = literalToType(responseMessage.getType());
+ Resource createdResource = (Resource) ResourceFactory.eINSTANCE.create(type);
+ createdResource.setName(descriptor.getResource());
+
+ // create access methods
+ for (RestAM am : responseMessage.getAccessMethods()) {
+ AccessMethod accessMethod = ResourceFactory.eINSTANCE.createAccessMethod();
+ accessMethod.setType(AccessMethodType.get(am.name));
+
+ Parameter[] parameters = new Parameter[am.parameters.size()];
+ for (int i = 0; i < am.parameters.size(); i++) {
+ RestParam param = am.parameters.get(i);
+ Parameter parameter = ResourceFactory.eINSTANCE.createParameter();
+ parameter.setName(param.name);
+ parameter.setType(param.type);
+ parameters[i] = parameter;
+ }
+
+ for (Parameter parameter : parameters) {
+ accessMethod.getParameter().add(parameter);
+ }
+ createdResource.getAccessMethod().add(accessMethod);
+ }
+
+ USE_IN_RUNEXLUSIVE_getService(descriptor.getGateway(), descriptor.getDevice(), descriptor.getService()).getResource().add(
+ createdResource);
+
+ return;
+ }
+ };
+ try {
+ getEditingDomain().getCommandStack().execute(command);
+ }catch (WrappedException we){
+ getEditingDomain().getCommandStack().flush();
+ //Caused by multiple events received.
+ }
+ }
+ } catch (NullPointerException | InterruptedException | IOException e) {
+ getEditingDomain().getCommandStack().flush();
+ throw new RuntimeException("Unexpected exception... " + descriptor);
+ }
+ }
+
+ static EClass literalToType(final String type) {
+
+ final EClass resourceType;
+ // Literals
+ EClass stateVariableLiteral = ResourcePackage.Literals.STATE_VARIABLE;
+ EClass actionLiteral = ResourcePackage.Literals.ACTION;
+ EClass propertyLiteral = ResourcePackage.Literals.PROPERTY;
+ EClass sensorDataLiteral = ResourcePackage.Literals.SENSOR_DATA;
+
+ if ("STATE_VARIABLE".equals(type)) {
+ resourceType = stateVariableLiteral;
+ } else if ("ACTION".equals(type)) {
+ resourceType = actionLiteral;
+ } else if ("PROPERTY".equals(type)) {
+ resourceType = propertyLiteral;
+ } else if ("SENSOR".equals(type)) {
+ resourceType = sensorDataLiteral;
+ } else {
+ logger.error(ModelEditor.class.getCanonicalName() + "::updateResource with type=" + type + " - Is it a bug or a feature ?");
+ resourceType = actionLiteral;
+ }
+ return resourceType;
+ }
+
+ /* ==================== */
+ /* REMOVE Objects by ID */
+ /* ==================== */
+
+ // USE CAREFULLY
+ // usually, if you want to remove a gateway, use
+ // ConfigurationManager.removeGateway
+ private void removeGateway_UNSAFE(final String gatewayName) {
+
+ setupStudio();
+
+ RecordingCommand command = new RecordingCommand(getEditingDomain()) {
+ @Override
+ protected void doExecute() {
+ EList<Gateway> gateways = USE_IN_RUNEXLUSIVE_getStudio().getGateways();
+
+ for (int i = 0; i < gateways.size(); i++) {
+ Gateway gateway = gateways.get(i);
+ if (gateway.getName().equals(gatewayName)) {
+ gateways.remove(i);
+ return;
+ }
+ }
+ }
+ };
+ getEditingDomain().getCommandStack().execute(command);
+
+ DeviceLocationManager.getInstance().deleteGatewayInStudio(gatewayName);
+ }
+
+ public void clearGatewayContent(String name) {
+ try {
+ for (String device : getDevicesId(name)) {
+ removeDevice(name, device);
+ }
+ } catch (InterruptedException e) {
+ logger.error("Clear gateway content failed", e);
+ }
+ }
+
+ public void removeDevice(final String gatewayName, final String deviceId) {
+
+ setupStudio();
+
+ RecordingCommand command = new RecordingCommand(getEditingDomain()) {
+ @Override
+ protected void doExecute() {
+ Gateway gateway = USE_IN_RUNEXLUSIVE_getGateway(gatewayName);
+ if (gateway != null) {
+ EList<Device> devices = gateway.getDevice();
+ for (int i = 0; i < devices.size(); i++) {
+ Device device = devices.get(i);
+ if (deviceId.equals(device.getName())) {
+ devices.remove(i);
+ return;
+ }
+ }
+ }
+ }
+ };
+ getEditingDomain().getCommandStack().execute(command);
+
+ DeviceLocationManager.getInstance().deleteDeviceInStudio(new DeviceDescriptor(gatewayName, deviceId));
+ }
+
+ public void removeService(final String gatewayName, final String deviceId, final String serviceId) {
+
+ //setupStudio();
+
+ RecordingCommand command = new RecordingCommand(getEditingDomain()) {
+ @Override
+ protected void doExecute() {
+ Device device = USE_IN_RUNEXLUSIVE_getDevice(gatewayName, deviceId);
+ if (device != null) {
+ EList<Service> services = device.getService();
+ for (int i = 0; i < services.size(); i++) {
+ Service service = services.get(i);
+ if (serviceId.equals(service.getName())) {
+ services.remove(i);
+ return;
+ }
+ }
+ }
+ }
+ };
+ getEditingDomain().getCommandStack().execute(command);
+ }
+
+ public void removeResource(final ResourceDescriptor descriptor) {
+
+ setupStudio();
+
+ RecordingCommand command = new RecordingCommand(getEditingDomain()) {
+ @Override
+ protected void doExecute() {
+ Service service = USE_IN_RUNEXLUSIVE_getService(descriptor.getGateway(), descriptor.getDevice(), descriptor.getService());
+ if (service != null) {
+ EList<Resource> resources = service.getResource();
+ for (int i = 0; i < resources.size(); i++) {
+ Resource resource = resources.get(i);
+ if (descriptor.getResource().equals(resource.getName())) {
+ resources.remove(i);
+ return;
+ }
+ }
+ }
+ }
+ };
+ getEditingDomain().getCommandStack().execute(command);
+ }
+
+ /* ==== */
+ /* MISC */
+ /* ==== */
+
+ public EClass getResourceClass(final ResourceDescriptor descriptor) throws InterruptedException {
+
+ //setupStudio();
+
+ return (EClass) getEditingDomain().runExclusive(new RunnableWithResult.Impl<EClass>() {
+ @Override
+ public void run() {
+ Resource resource = USE_IN_RUNEXLUSIVE_getResource(descriptor);
+ setResult(resource.eClass());
+ return;
+ }
+ });
+ }
+
+ public int getAccessMethodNb(final ResourceDescriptor descriptor) throws InterruptedException {
+
+ //setupStudio();
+
+ return (Integer) getEditingDomain().runExclusive(new RunnableWithResult.Impl<Integer>() {
+ @Override
+ public void run() {
+ Resource resource = USE_IN_RUNEXLUSIVE_getResource(descriptor);
+ setResult(new Integer(resource.getAccessMethod().size()));
+ return;
+ }
+ });
+ }
+}
diff --git a/services/org.eclipse.sensinact.studio.model.manager/src/org/eclipse/sensinact/studio/model/manager/modelupdater/ModelUpdater.java b/services/org.eclipse.sensinact.studio.model.manager/src/org/eclipse/sensinact/studio/model/manager/modelupdater/ModelUpdater.java
new file mode 100644
index 0000000..ea4599a
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.manager/src/org/eclipse/sensinact/studio/model/manager/modelupdater/ModelUpdater.java
@@ -0,0 +1,463 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.model.manager.modelupdater;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.List;
+
+import javax.naming.directory.InvalidAttributesException;
+
+import org.apache.log4j.Logger;
+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.sensinact.studio.http.client.GatewayHttpClient;
+import org.eclipse.sensinact.studio.http.client.GatewayHttpClient.RequestParameter;
+import org.eclipse.sensinact.studio.http.client.snamessage.ErrorMessage;
+import org.eclipse.sensinact.studio.http.client.snamessage.ResponseGetOK;
+import org.eclipse.sensinact.studio.http.client.snamessage.RestProvidersList;
+import org.eclipse.sensinact.studio.http.client.snamessage.RestResourcesList;
+import org.eclipse.sensinact.studio.http.client.snamessage.RestServicesList;
+import org.eclipse.sensinact.studio.http.client.snamessage.SnaMessage;
+import org.eclipse.sensinact.studio.http.client.snamessage.UpdateAttribute;
+import org.eclipse.sensinact.studio.http.client.snamessage.gateway.LifecycleProviderAppearing;
+import org.eclipse.sensinact.studio.http.client.snamessage.gateway.LifecycleProviderDisappearing;
+import org.eclipse.sensinact.studio.http.client.snamessage.gateway.LifecycleResourceAppearing;
+import org.eclipse.sensinact.studio.http.client.snamessage.gateway.LifecycleResourceDisappearing;
+import org.eclipse.sensinact.studio.http.client.snamessage.gateway.LifecycleServiceAppearing;
+import org.eclipse.sensinact.studio.http.client.snamessage.gateway.LifecycleServiceDisappearing;
+import org.eclipse.sensinact.studio.http.client.snamessage.gateway.ResponseCustom;
+import org.eclipse.sensinact.studio.model.manager.listener.devicelocation.DeviceLocationManager;
+import org.eclipse.sensinact.studio.model.manager.listener.subscription.SubscriptionListener;
+import org.eclipse.sensinact.studio.model.manager.listener.subscription.SubscriptionManager;
+import org.eclipse.sensinact.studio.model.resource.utils.Constants;
+import org.eclipse.sensinact.studio.model.resource.utils.DeviceDescriptor;
+import org.eclipse.sensinact.studio.model.resource.utils.GPScoordinates;
+import org.eclipse.sensinact.studio.model.resource.utils.ResourceDescriptor;
+import org.eclipse.sensinact.studio.model.resource.utils.Segments;
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import org.eclipse.sensinact.studio.resource.AccessMethodType;
+
+/**
+ * Central point for managing the connection with the SensiNact Gateway.
+ * @author Nicolas Hili, Etienne Gandrille
+ */
+public class ModelUpdater implements SubscriptionListener {
+
+ private static final Logger logger = Logger.getLogger(ModelUpdater.class);
+
+ private static Object lock = new Object();
+
+ private static ModelUpdater INSTANCE;
+
+ // TODO update the ugly monitor... EVERYWHERE !!!
+
+ public static ModelUpdater getInstance() {
+ if (INSTANCE == null)
+ INSTANCE = new ModelUpdater();
+ return INSTANCE;
+ }
+
+ private ModelUpdater() {
+ }
+
+ /**
+ * Get all devices from the gateway and updates the model.
+ *
+ * @throws IOException
+ */
+ public void updateDevices(final String gatewayName) throws IOException {
+
+ logger.info("Full model update triggered");
+
+ Segments segments = new Segments.Builder().gateway(gatewayName).devices().build();
+
+ SnaMessage response = GatewayHttpClient.sendGetRequest(segments);
+ if (response instanceof ErrorMessage) {
+ throwExceptionOnError((ErrorMessage) response, "devices");
+ }
+
+ final List<String> providers = ((RestProvidersList) response).getProviders();
+
+ // add device
+ new Thread(){
+ public void run(){
+ try {
+ for (int i = 0; i < providers.size(); i++) {
+ final String deviceName = providers.get(i);
+ ModelEditor.getInstance().addDeviceIfNotExist(gatewayName, deviceName);
+ }
+
+ // remove device
+ for (String localDevicesId : ModelEditor.getInstance().getDevicesId(gatewayName)) {
+ if(!providers.contains(localDevicesId)){
+ ModelEditor.getInstance().removeDevice(gatewayName, localDevicesId);
+ }
+ }
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ }.start();
+
+ // add location
+
+ Thread loadLocationThread = new Thread(){
+ public void run(){
+ Segments segments = new Segments.Builder().gateway(gatewayName).locations().getLocations().build();
+ try {
+ SnaMessage response = GatewayHttpClient.sendGetRequest(segments);
+ if (response instanceof ErrorMessage) {
+ throwExceptionOnError((ErrorMessage) response, "devices");
+ }
+
+ if(response instanceof ResponseGetOK){
+ ResponseGetOK responseGet=(ResponseGetOK)response;
+ //System.out.println(responseGet.getValue());
+ ModelUpdater.getInstance().updateLocation(gatewayName, new JSONArray(responseGet.getValue()));
+ }
+
+ } catch (IOException | JSONException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+
+ }
+ };
+ //loadLocationThread.setDaemon(true);
+ loadLocationThread.start();
+
+ }
+
+ public void updateServicesOnly(final String gatewayName, final String deviceId) throws IOException {
+ //Segments segments = new Segments.Builder().gateway(gatewayName).device(deviceId).services().build();
+
+ final DeviceDescriptor dd=new DeviceDescriptor(gatewayName, deviceId);
+
+ //Segments segments = new Segments.Builder().gateway(gatewayName).device(deviceId).services().build();
+ Segments segments = new Segments.Builder().gateway(gatewayName).jsonpath(dd).getResult().build();
+ //GatewayHttpClient.sendPostRequest(segments, parameters)
+ SnaMessage response = GatewayHttpClient.sendGetRequest(segments, new HashMap<String, String>(){{put("jsonpath", String.format("$..providers[?(@.name=='%s')]", dd.getDevice()));}});
+ if (response instanceof ErrorMessage) {
+ throwExceptionOnError((ErrorMessage) response, "services");
+ }
+
+ if(response instanceof ResponseCustom){
+
+ ResponseCustom custom=(ResponseCustom) response;
+
+ try {
+ JSONObject providers=new JSONArray(custom.getSource()).getJSONObject(0);
+ JSONArray services = providers.getJSONArray("services");
+
+ for (int i = 0; i < services.length(); i++) {
+ JSONObject ob=(JSONObject)services.get(i);
+ String serviceId=ob.getString("name");
+ //ModelEditor.getInstance().addServiceIfNotExist(gatewayName, deviceId, serviceId);
+ JSONArray resources = ob.getJSONArray("resources");
+ for (int x = 0; x < resources.length(); x++) {
+ JSONObject resource=(JSONObject)resources.get(x);
+ ResourceDescriptor rd=new ResourceDescriptor(gatewayName,deviceId,serviceId,resource.getString("name"));
+ ModelEditor.getInstance().addResourceIfNotExist(rd);
+ }
+
+
+ //synchronized (lock) {
+ //updateResources(gatewayName, deviceId, serviceId);
+ //}
+ }
+
+ } catch (Exception json){
+ json.printStackTrace();
+ }
+ }
+ }
+
+ public void updateServices(final String gatewayName, final String deviceId) throws IOException {
+ updateServices(gatewayName, deviceId,false);
+
+ }
+
+ public void updateServicesRecursive(final String gatewayName, final String deviceId) throws IOException {
+ updateServices(gatewayName, deviceId,true);
+ }
+
+ /**
+ * Get all services on a device, from the gateway, and updates the model.
+ *
+ * @param device
+ * the device from which services need to be retrieved
+ * @throws IOException
+ */
+ public void updateServices(final String gatewayName, final String deviceId,Boolean recursive) throws IOException {
+
+ try {
+ Segments segments = new Segments.Builder().gateway(gatewayName).device(deviceId).services().build();
+
+ SnaMessage response = GatewayHttpClient.sendGetRequest(segments);
+ if (response instanceof ErrorMessage) {
+ throwExceptionOnError((ErrorMessage) response, "services");
+ }
+
+ List<String> services = ((RestServicesList) response).getServices();
+
+ // add service
+
+ for (int i = 0; i < services.size(); i++) {
+ final String serviceId = services.get(i);
+ ModelEditor.getInstance().addServiceIfNotExist(gatewayName, deviceId, serviceId);
+ if(recursive){
+ updateResources(gatewayName, deviceId, serviceId,false);
+ }
+ }
+
+ // remove service
+ for (String localServicesId : ModelEditor.getInstance().getServicesId(gatewayName, deviceId)) {
+ if(!services.contains(localServicesId)){
+ ModelEditor.getInstance().removeService(gatewayName, deviceId, localServicesId);
+ }
+ }
+ } catch (InterruptedException e) {
+ throw new IOException("Error while parsing JSON", e);
+ }
+ }
+
+ /**
+ * Retrieve all resources from one service
+ *
+ * @param service
+ * the service from which resources need to be retrieved
+ * @throws IOException
+ */
+ public void updateResources(final String gatewayName, final String deviceId, final String serviceId) throws IOException {
+ updateResources(gatewayName,deviceId,serviceId,false);
+ }
+
+ public void updateResources(final String gatewayName, final String deviceId, final String serviceId,Boolean useJob) throws IOException {
+
+ System.out.println("updateResources(final String gatewayName, final String deviceId, final String serviceId,Boolean useJob)"+useJob);
+
+ Segments segment = new Segments.Builder().gateway(gatewayName).device(deviceId).service(serviceId).resources().build();
+
+ SnaMessage response = GatewayHttpClient.sendGetRequest(segment);
+ if (response instanceof ErrorMessage) {
+ throwExceptionOnError((ErrorMessage) response, "resources");
+ }
+
+ List<String> resources = ((RestResourcesList) response).getResources();
+
+ for (int i = 0; i < resources.size(); i++) {
+ final String resourceId = resources.get(i);
+
+ if(useJob){
+ Job job = new Job("add resource") {
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ try {
+ updateResource(new ResourceDescriptor(gatewayName, deviceId, serviceId, resourceId));
+ } catch (IOException e) {
+ logger.error("update resource failed", e);
+ }
+ return Status.OK_STATUS;
+ }
+ };
+ job.setPriority(Job.LONG);
+ job.setUser(true);
+ job.schedule();
+ }else {
+ updateResource(new ResourceDescriptor(gatewayName, deviceId, serviceId, resourceId));
+ }
+
+
+
+ }
+ }
+
+ public void updateLocation(String gateway,JSONArray objects) throws IOException {
+ JSONArray arrayJSON=objects;
+ try {
+ for (int i = 0; i < arrayJSON.length(); i++) {
+ JSONObject jsonPair=arrayJSON.getJSONObject(i);
+ DeviceDescriptor dd=new DeviceDescriptor(gateway, jsonPair.getString("provider"));
+ //System.out.println("Loading location:"+dd.getDevice());
+ String location=jsonPair.getString("location");
+ updateLocation(dd, location);
+
+ }
+ } catch (JSONException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+
+ private void updateResource(ResourceDescriptor descriptor) throws IOException {
+
+ ModelEditor.getInstance().addResourceIfNotExist(descriptor);
+
+ if (descriptor.getResource().equals("location")) {
+
+ Segments segment = new Segments.Builder().resource(descriptor).method(AccessMethodType.GET).build();
+ SnaMessage response = GatewayHttpClient.sendGetRequest(segment);
+
+ if (!response.isValid()) {
+ logger.error("Invalid HTTP response while getting gps coordinates for " + descriptor);
+ return;
+ }
+
+ String coordinates = ((ResponseGetOK) response).getValue();
+
+ updateLocation(descriptor.toDeviceDescriptor(), coordinates);
+ }
+ }
+
+ private void updateLocation(DeviceDescriptor descriptor, String coordinates) {
+ if (validCoordinates(coordinates)) {
+ try {
+ GPScoordinates gps = new GPScoordinates(coordinates);
+ DeviceLocationManager.getInstance().updateLocationInStudio(descriptor, gps);
+ } catch (InvalidAttributesException e) {
+ logger.error("coordinates parsing error for " + descriptor + " (" + coordinates + ")");
+ }
+ }
+ }
+
+ private static boolean validCoordinates(String coordinate) {
+ if (coordinate == null)
+ return false;
+ if (coordinate.isEmpty())
+ return false;
+ if (coordinate.equals("null"))
+ return false;
+ if (coordinate.equals("null:null"))
+ return false;
+ return true;
+ }
+
+ private void throwExceptionOnError(SnaMessage response, String elementName) {
+ String msg = response.getFullDescription();
+ String fullMsg = "Error sent by gateway while getting " + elementName + "\n" + msg;
+ throw new RuntimeException(fullMsg);
+ }
+
+ /* ==================== */
+ /* Subscribe last event */
+ /* ==================== */
+
+ public boolean subscribeLastEvent(String gatewayID) {
+ try {
+ SubscriptionManager.getInstance().subscribeResource(Constants.createLastEventRD(gatewayID), this);
+ return true;
+ } catch (Exception e) {
+ logger.error(e);
+ return false;
+ }
+ }
+
+ public boolean unsubscribeLastEvent(String gatewayID) {
+ try {
+ SubscriptionManager.getInstance().unsubscribeResource(Constants.createLastEventRD(gatewayID), this);
+ return true;
+ } catch (Exception e) {
+ return false;
+ }
+ }
+
+ @Override
+ public void onEvent(SnaMessage response, ResourceDescriptor resource) {
+
+ if (response == null) {
+ logger.error("No identified content");
+ return;
+ }
+
+ // Gateway name
+ String gatewayName = resource.getGateway();
+
+ if (response instanceof UpdateAttribute) {
+ logger.error("UpdateAttribute");
+ UpdateAttribute notificationResponse = (UpdateAttribute) response;
+
+ ResourceDescriptor descriptor = notificationResponse.getTarget();
+
+ if ("location".equals(descriptor.getResource())) {
+ String coordinates = notificationResponse.getValue();
+ updateLocation(descriptor.toDeviceDescriptor(), coordinates);
+ }
+ }else if (response instanceof LifecycleProviderAppearing) {
+ logger.error("Lifecycle appearing");
+ LifecycleProviderAppearing providerAppearing = (LifecycleProviderAppearing) response;
+ String providerName = providerAppearing.getProvider();
+ ModelEditor.getInstance().addDeviceIfNotExist(gatewayName, providerName);
+ }else if (response instanceof LifecycleProviderDisappearing) {
+ logger.error("LifecycleProviderDisappearing");
+ LifecycleProviderDisappearing providerDisappearing = (LifecycleProviderDisappearing) response;
+ String providerName = providerDisappearing.getProvider();
+ ModelEditor.getInstance().removeDevice(gatewayName, providerName);
+ }else if (response instanceof LifecycleServiceAppearing) {
+ logger.error("LifecycleServiceAppearing");
+ LifecycleServiceAppearing serviceAppearing = (LifecycleServiceAppearing) response;
+ String providerName = serviceAppearing.getProvider();
+ String serviceName = serviceAppearing.getService();
+ ModelEditor.getInstance().addServiceIfNotExist(gatewayName, providerName, serviceName);
+ }else if (response instanceof LifecycleServiceDisappearing) {
+ logger.error("LifecycleServiceDisappearing");
+ LifecycleServiceDisappearing serviceDisappearing = (LifecycleServiceDisappearing) response;
+ String providerName = serviceDisappearing.getProvider();
+ String serviceName = serviceDisappearing.getService();
+ ModelEditor.getInstance().removeService(gatewayName, providerName, serviceName);
+ }else if (response instanceof LifecycleResourceAppearing) {
+ logger.error("LifecycleResourceAppearing");
+ LifecycleResourceAppearing resourceAppearing = (LifecycleResourceAppearing) response;
+
+ String providerName = resourceAppearing.getProvider();
+ String serviceName = resourceAppearing.getService();
+ String resourceName = resourceAppearing.getResource();
+ ResourceDescriptor descriptor = new ResourceDescriptor(gatewayName, providerName, serviceName, resourceName);
+ ModelEditor.getInstance().addResourceIfNotExist(descriptor);
+ if (resourceName.equals("location")) {
+ String coordinates = resourceAppearing.getInitValue();
+ updateLocation(descriptor.toDeviceDescriptor(), coordinates);
+ }
+ }else if (response instanceof LifecycleResourceDisappearing) {
+ logger.error("LifecycleResourceDisappearing");
+ LifecycleResourceDisappearing resourceDisappearing = (LifecycleResourceDisappearing) response;
+ String providerName = resourceDisappearing.getProvider();
+ String serviceName = resourceDisappearing.getService();
+ String resourceName = resourceDisappearing.getResource();
+ ResourceDescriptor descriptor = new ResourceDescriptor(gatewayName, providerName, serviceName, resourceName);
+ ModelEditor.getInstance().removeResource(descriptor);
+ }
+ }
+
+ public boolean isConnected(String gatewayID) {
+ return SubscriptionManager.getInstance().hasSubscribeResource(Constants.createLastEventRD(gatewayID), this);
+ }
+
+ /* =================== */
+ /* Location management */
+ /* =================== */
+
+ public void updateLocationOnServer(DeviceDescriptor deviceDescriptor, GPScoordinates coordinates) {
+ Segments segments = new Segments.Builder().device(deviceDescriptor).service("admin").resource("location").method(AccessMethodType.SET).build();
+ try {
+ RequestParameter param = new RequestParameter("location", "java.lang.String", coordinates.getLat() + "," + coordinates.getLng());
+ GatewayHttpClient.sendPostRequest(segments, null,param);
+ } catch (IOException e) {
+ logger.error("update location failed", e);
+ }
+ // Note: resources values are not stored in the model
+ }
+}
\ No newline at end of file
diff --git a/services/org.eclipse.sensinact.studio.model.resource.edit/META-INF/MANIFEST.MF b/services/org.eclipse.sensinact.studio.model.resource.edit/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..5bf8773
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.edit/META-INF/MANIFEST.MF
@@ -0,0 +1,15 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-SymbolicName: org.eclipse.sensinact.studio.model.resource.edit;singleton:=true
+Bundle-Version: 1.0.0.qualifier
+Bundle-ClassPath: .
+Bundle-Activator: org.eclipse.sensinact.studio.resource.provider.ResourceEditPlugin$Implementation
+Bundle-Vendor: %providerName
+Bundle-Localization: plugin
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Export-Package: org.eclipse.sensinact.studio.resource.provider
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.sensinact.studio.model.resource;visibility:=reexport,
+ org.eclipse.emf.edit;visibility:=reexport
+Bundle-ActivationPolicy: lazy
diff --git a/services/org.eclipse.sensinact.studio.model.resource.edit/about.html b/services/org.eclipse.sensinact.studio.model.resource.edit/about.html
new file mode 100644
index 0000000..3b39f88
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.edit/about.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"><head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 5, 2006</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+
+</body></html>
\ No newline at end of file
diff --git a/services/org.eclipse.sensinact.studio.model.resource.edit/build.properties b/services/org.eclipse.sensinact.studio.model.resource.edit/build.properties
new file mode 100644
index 0000000..43f48db
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.edit/build.properties
@@ -0,0 +1,21 @@
+#
+# Copyright (c) 2017 CEA.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+# CEA - initial API and implementation and/or initial documentation
+#
+
+#
+
+bin.includes = .,\
+ icons/,\
+ META-INF/,\
+ plugin.xml,\
+ plugin.properties
+jars.compile.order = .
+source.. = src/
+output.. = bin/
diff --git a/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/ctool16/CreateAccessMethod_parameter_Parameter.gif b/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/ctool16/CreateAccessMethod_parameter_Parameter.gif
new file mode 100644
index 0000000..bd45e3e
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/ctool16/CreateAccessMethod_parameter_Parameter.gif
Binary files differ
diff --git a/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/ctool16/CreateAttribute_metadata_Metadata.gif b/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/ctool16/CreateAttribute_metadata_Metadata.gif
new file mode 100644
index 0000000..097f1cb
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/ctool16/CreateAttribute_metadata_Metadata.gif
Binary files differ
diff --git a/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/ctool16/CreateDevice_service_Service.gif b/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/ctool16/CreateDevice_service_Service.gif
new file mode 100644
index 0000000..fbd2adb
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/ctool16/CreateDevice_service_Service.gif
Binary files differ
diff --git a/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/ctool16/CreateGateway_device_Device.gif b/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/ctool16/CreateGateway_device_Device.gif
new file mode 100644
index 0000000..64b04a5
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/ctool16/CreateGateway_device_Device.gif
Binary files differ
diff --git a/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/ctool16/CreateResource_accessMethod_AccessMethod.gif b/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/ctool16/CreateResource_accessMethod_AccessMethod.gif
new file mode 100644
index 0000000..0cf27b2
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/ctool16/CreateResource_accessMethod_AccessMethod.gif
Binary files differ
diff --git a/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/ctool16/CreateResource_attribute_Attribute.gif b/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/ctool16/CreateResource_attribute_Attribute.gif
new file mode 100644
index 0000000..6baa8a5
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/ctool16/CreateResource_attribute_Attribute.gif
Binary files differ
diff --git a/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/ctool16/CreateService_resource_Action.gif b/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/ctool16/CreateService_resource_Action.gif
new file mode 100644
index 0000000..002f4e5
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/ctool16/CreateService_resource_Action.gif
Binary files differ
diff --git a/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/ctool16/CreateService_resource_Property.gif b/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/ctool16/CreateService_resource_Property.gif
new file mode 100644
index 0000000..4837c02
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/ctool16/CreateService_resource_Property.gif
Binary files differ
diff --git a/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/ctool16/CreateService_resource_Resource.gif b/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/ctool16/CreateService_resource_Resource.gif
new file mode 100644
index 0000000..2449727
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/ctool16/CreateService_resource_Resource.gif
Binary files differ
diff --git a/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/ctool16/CreateService_resource_SensorData.gif b/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/ctool16/CreateService_resource_SensorData.gif
new file mode 100644
index 0000000..597f655
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/ctool16/CreateService_resource_SensorData.gif
Binary files differ
diff --git a/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/ctool16/CreateService_resource_StateVariable.gif b/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/ctool16/CreateService_resource_StateVariable.gif
new file mode 100644
index 0000000..67c2619
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/ctool16/CreateService_resource_StateVariable.gif
Binary files differ
diff --git a/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/ctool16/CreateStudio_gateways_Gateway.gif b/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/ctool16/CreateStudio_gateways_Gateway.gif
new file mode 100644
index 0000000..0a7b807
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/ctool16/CreateStudio_gateways_Gateway.gif
Binary files differ
diff --git a/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/obj16/AccessMethod.gif b/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/obj16/AccessMethod.gif
new file mode 100644
index 0000000..89ad5da
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/obj16/AccessMethod.gif
Binary files differ
diff --git a/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/obj16/Action.gif b/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/obj16/Action.gif
new file mode 100644
index 0000000..cb1755a
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/obj16/Action.gif
Binary files differ
diff --git a/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/obj16/Attribute.gif b/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/obj16/Attribute.gif
new file mode 100644
index 0000000..7b7c428
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/obj16/Attribute.gif
Binary files differ
diff --git a/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/obj16/Device.gif b/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/obj16/Device.gif
new file mode 100644
index 0000000..5a9bc75
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/obj16/Device.gif
Binary files differ
diff --git a/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/obj16/Gateway.gif b/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/obj16/Gateway.gif
new file mode 100644
index 0000000..afb82ea
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/obj16/Gateway.gif
Binary files differ
diff --git a/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/obj16/Metadata.gif b/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/obj16/Metadata.gif
new file mode 100644
index 0000000..53500da
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/obj16/Metadata.gif
Binary files differ
diff --git a/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/obj16/NamedElement.gif b/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/obj16/NamedElement.gif
new file mode 100644
index 0000000..14af8aa
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/obj16/NamedElement.gif
Binary files differ
diff --git a/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/obj16/Parameter.gif b/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/obj16/Parameter.gif
new file mode 100644
index 0000000..a3908bc
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/obj16/Parameter.gif
Binary files differ
diff --git a/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/obj16/Property.gif b/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/obj16/Property.gif
new file mode 100644
index 0000000..136e3b2
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/obj16/Property.gif
Binary files differ
diff --git a/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/obj16/Resource.gif b/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/obj16/Resource.gif
new file mode 100644
index 0000000..338fb8d
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/obj16/Resource.gif
Binary files differ
diff --git a/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/obj16/SensorData.gif b/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/obj16/SensorData.gif
new file mode 100644
index 0000000..5915591
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/obj16/SensorData.gif
Binary files differ
diff --git a/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/obj16/Service.gif b/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/obj16/Service.gif
new file mode 100644
index 0000000..db7414e
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/obj16/Service.gif
Binary files differ
diff --git a/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/obj16/StateVariable.gif b/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/obj16/StateVariable.gif
new file mode 100644
index 0000000..e4b530e
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/obj16/StateVariable.gif
Binary files differ
diff --git a/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/obj16/Studio.gif b/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/obj16/Studio.gif
new file mode 100644
index 0000000..739ebbf
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/obj16/Studio.gif
Binary files differ
diff --git a/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/obj16/TypedElement.gif b/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/obj16/TypedElement.gif
new file mode 100644
index 0000000..c8d381f
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.edit/icons/full/obj16/TypedElement.gif
Binary files differ
diff --git a/services/org.eclipse.sensinact.studio.model.resource.edit/plugin.properties b/services/org.eclipse.sensinact.studio.model.resource.edit/plugin.properties
new file mode 100644
index 0000000..efe2b31
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.edit/plugin.properties
@@ -0,0 +1,68 @@
+#
+# Copyright (c) 2017 CEA.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+# CEA - initial API and implementation and/or initial documentation
+#
+
+#
+
+pluginName = Resource Edit Support
+providerName = www.example.org
+
+_UI_CreateChild_text = {0}
+_UI_CreateChild_text2 = {1} {0}
+_UI_CreateChild_text3 = {1}
+_UI_CreateChild_tooltip = Create New {0} Under {1} Feature
+_UI_CreateChild_description = Create a new child of type {0} for the {1} feature of the selected {2}.
+_UI_CreateSibling_description = Create a new sibling of type {0} for the selected {2}, under the {1} feature of their parent.
+
+_UI_PropertyDescriptor_description = The {0} of the {1}
+
+_UI_Studio_type = Studio
+_UI_Device_type = Device
+_UI_NamedElement_type = Named Element
+_UI_TypedElement_type = Typed Element
+_UI_Service_type = Service
+_UI_Resource_type = Resource
+_UI_Property_type = Property
+_UI_SensorData_type = Sensor Data
+_UI_StateVariable_type = State Variable
+_UI_Action_type = Action
+_UI_Attribute_type = Attribute
+_UI_Metadata_type = Metadata
+_UI_AccessMethod_type = Access Method
+_UI_Parameter_type = Parameter
+_UI_Gateway_type = Gateway
+_UI_Unknown_type = Object
+
+_UI_Unknown_datatype= Value
+
+_UI_Studio_gateways_feature = Gateways
+_UI_Device_friendlyName_feature = Friendly Name
+_UI_Device_service_feature = Service
+_UI_NamedElement_name_feature = Name
+_UI_TypedElement_type_feature = Type
+_UI_TypedElement_value_feature = Value
+_UI_Service_friendlyName_feature = Friendly Name
+_UI_Service_resource_feature = Resource
+_UI_Resource_friendlyName_feature = Friendly Name
+_UI_Resource_attribute_feature = Attribute
+_UI_Resource_accessMethod_feature = Access Method
+_UI_StateVariable_modifier_feature = Modifier
+_UI_Action_state_feature = State
+_UI_Attribute_metadata_feature = Metadata
+_UI_AccessMethod_parameter_feature = Parameter
+_UI_AccessMethod_type_feature = Type
+_UI_Gateway_device_feature = Device
+_UI_Unknown_feature = Unspecified
+
+_UI_AccessMethodType_GET_literal = GET
+_UI_AccessMethodType_SET_literal = SET
+_UI_AccessMethodType_ACT_literal = ACT
+_UI_AccessMethodType_SUBSCRIBE_literal = SUBSCRIBE
+_UI_AccessMethodType_UNSUBSCRIBE_literal = UNSUBSCRIBE
diff --git a/services/org.eclipse.sensinact.studio.model.resource.edit/plugin.xml b/services/org.eclipse.sensinact.studio.model.resource.edit/plugin.xml
new file mode 100644
index 0000000..78935f9
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.edit/plugin.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Copyright (c) 2017 CEA.
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+
+ Contributors:
+ CEA - initial API and implementation and/or initial documentation
+
+-->
+<?eclipse version="3.0"?>
+
+<!--
+-->
+
+<plugin>
+
+ <extension point="org.eclipse.emf.edit.itemProviderAdapterFactories">
+ <!-- @generated resource -->
+ <factory
+ uri="http://SENSINACT_RESOURCE/0.1"
+ class="org.eclipse.sensinact.studio.resource.provider.ResourceItemProviderAdapterFactory"
+ supportedTypes=
+ "org.eclipse.emf.edit.provider.IEditingDomainItemProvider
+ org.eclipse.emf.edit.provider.IStructuredItemContentProvider
+ org.eclipse.emf.edit.provider.ITreeItemContentProvider
+ org.eclipse.emf.edit.provider.IItemLabelProvider
+ org.eclipse.emf.edit.provider.IItemPropertySource"/>
+ </extension>
+
+</plugin>
diff --git a/services/org.eclipse.sensinact.studio.model.resource.edit/src/org/eclipse/sensinact/studio/resource/provider/AccessMethodItemProvider.java b/services/org.eclipse.sensinact.studio.model.resource.edit/src/org/eclipse/sensinact/studio/resource/provider/AccessMethodItemProvider.java
new file mode 100644
index 0000000..a29eccf
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.edit/src/org/eclipse/sensinact/studio/resource/provider/AccessMethodItemProvider.java
@@ -0,0 +1,211 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource.provider;
+
+
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.common.util.ResourceLocator;
+
+import org.eclipse.emf.ecore.EStructuralFeature;
+
+import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
+import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
+import org.eclipse.emf.edit.provider.IItemLabelProvider;
+import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.IItemPropertySource;
+import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
+import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
+import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.ItemProviderAdapter;
+import org.eclipse.emf.edit.provider.ViewerNotification;
+
+import org.eclipse.sensinact.studio.resource.AccessMethod;
+import org.eclipse.sensinact.studio.resource.AccessMethodType;
+import org.eclipse.sensinact.studio.resource.ResourceFactory;
+import org.eclipse.sensinact.studio.resource.ResourcePackage;
+
+/**
+ * This is the item provider adapter for a {@link org.eclipse.sensinact.studio.resource.AccessMethod} object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class AccessMethodItemProvider
+ extends ItemProviderAdapter
+ implements
+ IEditingDomainItemProvider,
+ IStructuredItemContentProvider,
+ ITreeItemContentProvider,
+ IItemLabelProvider,
+ IItemPropertySource {
+ /**
+ * This constructs an instance from a factory and a notifier.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public AccessMethodItemProvider(AdapterFactory adapterFactory) {
+ super(adapterFactory);
+ }
+
+ /**
+ * This returns the property descriptors for the adapted class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public List<IItemPropertyDescriptor> getPropertyDescriptors(Object object) {
+ if (itemPropertyDescriptors == null) {
+ super.getPropertyDescriptors(object);
+
+ addTypePropertyDescriptor(object);
+ }
+ return itemPropertyDescriptors;
+ }
+
+ /**
+ * This adds a property descriptor for the Type feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected void addTypePropertyDescriptor(Object object) {
+ itemPropertyDescriptors.add
+ (createItemPropertyDescriptor
+ (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+ getResourceLocator(),
+ getString("_UI_AccessMethod_type_feature"),
+ getString("_UI_PropertyDescriptor_description", "_UI_AccessMethod_type_feature", "_UI_AccessMethod_type"),
+ ResourcePackage.Literals.ACCESS_METHOD__TYPE,
+ true,
+ false,
+ false,
+ ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
+ null,
+ null));
+ }
+
+ /**
+ * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
+ * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
+ * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Collection<? extends EStructuralFeature> getChildrenFeatures(Object object) {
+ if (childrenFeatures == null) {
+ super.getChildrenFeatures(object);
+ childrenFeatures.add(ResourcePackage.Literals.ACCESS_METHOD__PARAMETER);
+ }
+ return childrenFeatures;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EStructuralFeature getChildFeature(Object object, Object child) {
+ // Check the type of the specified child object and return the proper feature to use for
+ // adding (see {@link AddCommand}) it as a child.
+
+ return super.getChildFeature(object, child);
+ }
+
+ /**
+ * This returns AccessMethod.gif.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Object getImage(Object object) {
+ return overlayImage(object, getResourceLocator().getImage("full/obj16/AccessMethod"));
+ }
+
+ /**
+ * This returns the label text for the adapted class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public String getText(Object object) {
+ AccessMethodType labelValue = ((AccessMethod)object).getType();
+ String label = labelValue == null ? null : labelValue.toString();
+ return label == null || label.length() == 0 ?
+ getString("_UI_AccessMethod_type") :
+ getString("_UI_AccessMethod_type") + " " + label;
+ }
+
+
+ /**
+ * This handles model notifications by calling {@link #updateChildren} to update any cached
+ * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void notifyChanged(Notification notification) {
+ updateChildren(notification);
+
+ switch (notification.getFeatureID(AccessMethod.class)) {
+ case ResourcePackage.ACCESS_METHOD__TYPE:
+ fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
+ return;
+ case ResourcePackage.ACCESS_METHOD__PARAMETER:
+ fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
+ return;
+ }
+ super.notifyChanged(notification);
+ }
+
+ /**
+ * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
+ * that can be created under this object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected void collectNewChildDescriptors(Collection<Object> newChildDescriptors, Object object) {
+ super.collectNewChildDescriptors(newChildDescriptors, object);
+
+ newChildDescriptors.add
+ (createChildParameter
+ (ResourcePackage.Literals.ACCESS_METHOD__PARAMETER,
+ ResourceFactory.eINSTANCE.createParameter()));
+ }
+
+ /**
+ * Return the resource locator for this item provider's resources.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public ResourceLocator getResourceLocator() {
+ return ResourceEditPlugin.INSTANCE;
+ }
+
+}
diff --git a/services/org.eclipse.sensinact.studio.model.resource.edit/src/org/eclipse/sensinact/studio/resource/provider/ActionItemProvider.java b/services/org.eclipse.sensinact.studio.model.resource.edit/src/org/eclipse/sensinact/studio/resource/provider/ActionItemProvider.java
new file mode 100644
index 0000000..8ce9f80
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.edit/src/org/eclipse/sensinact/studio/resource/provider/ActionItemProvider.java
@@ -0,0 +1,134 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource.provider;
+
+
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
+import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
+
+import org.eclipse.sensinact.studio.resource.Action;
+import org.eclipse.sensinact.studio.resource.ResourcePackage;
+
+/**
+ * This is the item provider adapter for a {@link org.eclipse.sensinact.studio.resource.Action} object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class ActionItemProvider extends ResourceItemProvider {
+ /**
+ * This constructs an instance from a factory and a notifier.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public ActionItemProvider(AdapterFactory adapterFactory) {
+ super(adapterFactory);
+ }
+
+ /**
+ * This returns the property descriptors for the adapted class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public List<IItemPropertyDescriptor> getPropertyDescriptors(Object object) {
+ if (itemPropertyDescriptors == null) {
+ super.getPropertyDescriptors(object);
+
+ addStatePropertyDescriptor(object);
+ }
+ return itemPropertyDescriptors;
+ }
+
+ /**
+ * This adds a property descriptor for the State feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected void addStatePropertyDescriptor(Object object) {
+ itemPropertyDescriptors.add
+ (createItemPropertyDescriptor
+ (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+ getResourceLocator(),
+ getString("_UI_Action_state_feature"),
+ getString("_UI_PropertyDescriptor_description", "_UI_Action_state_feature", "_UI_Action_type"),
+ ResourcePackage.Literals.ACTION__STATE,
+ true,
+ false,
+ true,
+ null,
+ null,
+ null));
+ }
+
+ /**
+ * This returns Action.gif.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Object getImage(Object object) {
+ return overlayImage(object, getResourceLocator().getImage("full/obj16/Action"));
+ }
+
+ /**
+ * This returns the label text for the adapted class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public String getText(Object object) {
+ String label = ((Action)object).getName();
+ return label == null || label.length() == 0 ?
+ getString("_UI_Action_type") :
+ getString("_UI_Action_type") + " " + label;
+ }
+
+
+ /**
+ * This handles model notifications by calling {@link #updateChildren} to update any cached
+ * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void notifyChanged(Notification notification) {
+ updateChildren(notification);
+ super.notifyChanged(notification);
+ }
+
+ /**
+ * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
+ * that can be created under this object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected void collectNewChildDescriptors(Collection<Object> newChildDescriptors, Object object) {
+ super.collectNewChildDescriptors(newChildDescriptors, object);
+ }
+
+}
diff --git a/services/org.eclipse.sensinact.studio.model.resource.edit/src/org/eclipse/sensinact/studio/resource/provider/AttributeItemProvider.java b/services/org.eclipse.sensinact.studio.model.resource.edit/src/org/eclipse/sensinact/studio/resource/provider/AttributeItemProvider.java
new file mode 100644
index 0000000..03acb7b
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.edit/src/org/eclipse/sensinact/studio/resource/provider/AttributeItemProvider.java
@@ -0,0 +1,155 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource.provider;
+
+
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EStructuralFeature;
+
+import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.ViewerNotification;
+
+import org.eclipse.sensinact.studio.resource.Attribute;
+import org.eclipse.sensinact.studio.resource.ResourceFactory;
+import org.eclipse.sensinact.studio.resource.ResourcePackage;
+
+/**
+ * This is the item provider adapter for a {@link org.eclipse.sensinact.studio.resource.Attribute} object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class AttributeItemProvider extends TypedElementItemProvider {
+ /**
+ * This constructs an instance from a factory and a notifier.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public AttributeItemProvider(AdapterFactory adapterFactory) {
+ super(adapterFactory);
+ }
+
+ /**
+ * This returns the property descriptors for the adapted class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public List<IItemPropertyDescriptor> getPropertyDescriptors(Object object) {
+ if (itemPropertyDescriptors == null) {
+ super.getPropertyDescriptors(object);
+
+ }
+ return itemPropertyDescriptors;
+ }
+
+ /**
+ * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
+ * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
+ * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Collection<? extends EStructuralFeature> getChildrenFeatures(Object object) {
+ if (childrenFeatures == null) {
+ super.getChildrenFeatures(object);
+ childrenFeatures.add(ResourcePackage.Literals.ATTRIBUTE__METADATA);
+ }
+ return childrenFeatures;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EStructuralFeature getChildFeature(Object object, Object child) {
+ // Check the type of the specified child object and return the proper feature to use for
+ // adding (see {@link AddCommand}) it as a child.
+
+ return super.getChildFeature(object, child);
+ }
+
+ /**
+ * This returns Attribute.gif.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Object getImage(Object object) {
+ return overlayImage(object, getResourceLocator().getImage("full/obj16/Attribute"));
+ }
+
+ /**
+ * This returns the label text for the adapted class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public String getText(Object object) {
+ String label = ((Attribute)object).getName();
+ return label == null || label.length() == 0 ?
+ getString("_UI_Attribute_type") :
+ getString("_UI_Attribute_type") + " " + label;
+ }
+
+
+ /**
+ * This handles model notifications by calling {@link #updateChildren} to update any cached
+ * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void notifyChanged(Notification notification) {
+ updateChildren(notification);
+
+ switch (notification.getFeatureID(Attribute.class)) {
+ case ResourcePackage.ATTRIBUTE__METADATA:
+ fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
+ return;
+ }
+ super.notifyChanged(notification);
+ }
+
+ /**
+ * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
+ * that can be created under this object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected void collectNewChildDescriptors(Collection<Object> newChildDescriptors, Object object) {
+ super.collectNewChildDescriptors(newChildDescriptors, object);
+
+ newChildDescriptors.add
+ (createChildParameter
+ (ResourcePackage.Literals.ATTRIBUTE__METADATA,
+ ResourceFactory.eINSTANCE.createMetadata()));
+ }
+
+}
diff --git a/services/org.eclipse.sensinact.studio.model.resource.edit/src/org/eclipse/sensinact/studio/resource/provider/DeviceItemProvider.java b/services/org.eclipse.sensinact.studio.model.resource.edit/src/org/eclipse/sensinact/studio/resource/provider/DeviceItemProvider.java
new file mode 100644
index 0000000..d11b74d
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.edit/src/org/eclipse/sensinact/studio/resource/provider/DeviceItemProvider.java
@@ -0,0 +1,183 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource.provider;
+
+
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EStructuralFeature;
+
+import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
+import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.ViewerNotification;
+
+import org.eclipse.sensinact.studio.resource.Device;
+import org.eclipse.sensinact.studio.resource.ResourceFactory;
+import org.eclipse.sensinact.studio.resource.ResourcePackage;
+
+/**
+ * This is the item provider adapter for a {@link org.eclipse.sensinact.studio.resource.Device} object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class DeviceItemProvider extends NamedElementItemProvider {
+ /**
+ * This constructs an instance from a factory and a notifier.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DeviceItemProvider(AdapterFactory adapterFactory) {
+ super(adapterFactory);
+ }
+
+ /**
+ * This returns the property descriptors for the adapted class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public List<IItemPropertyDescriptor> getPropertyDescriptors(Object object) {
+ if (itemPropertyDescriptors == null) {
+ super.getPropertyDescriptors(object);
+
+ addFriendlyNamePropertyDescriptor(object);
+ }
+ return itemPropertyDescriptors;
+ }
+
+ /**
+ * This adds a property descriptor for the Friendly Name feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected void addFriendlyNamePropertyDescriptor(Object object) {
+ itemPropertyDescriptors.add
+ (createItemPropertyDescriptor
+ (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+ getResourceLocator(),
+ getString("_UI_Device_friendlyName_feature"),
+ getString("_UI_PropertyDescriptor_description", "_UI_Device_friendlyName_feature", "_UI_Device_type"),
+ ResourcePackage.Literals.DEVICE__FRIENDLY_NAME,
+ true,
+ false,
+ false,
+ ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
+ null,
+ null));
+ }
+
+ /**
+ * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
+ * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
+ * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Collection<? extends EStructuralFeature> getChildrenFeatures(Object object) {
+ if (childrenFeatures == null) {
+ super.getChildrenFeatures(object);
+ childrenFeatures.add(ResourcePackage.Literals.DEVICE__SERVICE);
+ }
+ return childrenFeatures;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EStructuralFeature getChildFeature(Object object, Object child) {
+ // Check the type of the specified child object and return the proper feature to use for
+ // adding (see {@link AddCommand}) it as a child.
+
+ return super.getChildFeature(object, child);
+ }
+
+ /**
+ * This returns Device.gif.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Object getImage(Object object) {
+ return overlayImage(object, getResourceLocator().getImage("full/obj16/Device"));
+ }
+
+ /**
+ * This returns the label text for the adapted class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public String getText(Object object) {
+ String label = ((Device)object).getName();
+ return label == null || label.length() == 0 ?
+ getString("_UI_Device_type") :
+ getString("_UI_Device_type") + " " + label;
+ }
+
+
+ /**
+ * This handles model notifications by calling {@link #updateChildren} to update any cached
+ * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void notifyChanged(Notification notification) {
+ updateChildren(notification);
+
+ switch (notification.getFeatureID(Device.class)) {
+ case ResourcePackage.DEVICE__FRIENDLY_NAME:
+ fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
+ return;
+ case ResourcePackage.DEVICE__SERVICE:
+ fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
+ return;
+ }
+ super.notifyChanged(notification);
+ }
+
+ /**
+ * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
+ * that can be created under this object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected void collectNewChildDescriptors(Collection<Object> newChildDescriptors, Object object) {
+ super.collectNewChildDescriptors(newChildDescriptors, object);
+
+ newChildDescriptors.add
+ (createChildParameter
+ (ResourcePackage.Literals.DEVICE__SERVICE,
+ ResourceFactory.eINSTANCE.createService()));
+ }
+
+}
diff --git a/services/org.eclipse.sensinact.studio.model.resource.edit/src/org/eclipse/sensinact/studio/resource/provider/GatewayItemProvider.java b/services/org.eclipse.sensinact.studio.model.resource.edit/src/org/eclipse/sensinact/studio/resource/provider/GatewayItemProvider.java
new file mode 100644
index 0000000..2264fe7
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.edit/src/org/eclipse/sensinact/studio/resource/provider/GatewayItemProvider.java
@@ -0,0 +1,155 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource.provider;
+
+
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EStructuralFeature;
+
+import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.ViewerNotification;
+
+import org.eclipse.sensinact.studio.resource.Gateway;
+import org.eclipse.sensinact.studio.resource.ResourceFactory;
+import org.eclipse.sensinact.studio.resource.ResourcePackage;
+
+/**
+ * This is the item provider adapter for a {@link org.eclipse.sensinact.studio.resource.Gateway} object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class GatewayItemProvider extends NamedElementItemProvider {
+ /**
+ * This constructs an instance from a factory and a notifier.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public GatewayItemProvider(AdapterFactory adapterFactory) {
+ super(adapterFactory);
+ }
+
+ /**
+ * This returns the property descriptors for the adapted class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public List<IItemPropertyDescriptor> getPropertyDescriptors(Object object) {
+ if (itemPropertyDescriptors == null) {
+ super.getPropertyDescriptors(object);
+
+ }
+ return itemPropertyDescriptors;
+ }
+
+ /**
+ * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
+ * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
+ * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Collection<? extends EStructuralFeature> getChildrenFeatures(Object object) {
+ if (childrenFeatures == null) {
+ super.getChildrenFeatures(object);
+ childrenFeatures.add(ResourcePackage.Literals.GATEWAY__DEVICE);
+ }
+ return childrenFeatures;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EStructuralFeature getChildFeature(Object object, Object child) {
+ // Check the type of the specified child object and return the proper feature to use for
+ // adding (see {@link AddCommand}) it as a child.
+
+ return super.getChildFeature(object, child);
+ }
+
+ /**
+ * This returns Gateway.gif.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Object getImage(Object object) {
+ return overlayImage(object, getResourceLocator().getImage("full/obj16/Gateway"));
+ }
+
+ /**
+ * This returns the label text for the adapted class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public String getText(Object object) {
+ String label = ((Gateway)object).getName();
+ return label == null || label.length() == 0 ?
+ getString("_UI_Gateway_type") :
+ getString("_UI_Gateway_type") + " " + label;
+ }
+
+
+ /**
+ * This handles model notifications by calling {@link #updateChildren} to update any cached
+ * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void notifyChanged(Notification notification) {
+ updateChildren(notification);
+
+ switch (notification.getFeatureID(Gateway.class)) {
+ case ResourcePackage.GATEWAY__DEVICE:
+ fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
+ return;
+ }
+ super.notifyChanged(notification);
+ }
+
+ /**
+ * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
+ * that can be created under this object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected void collectNewChildDescriptors(Collection<Object> newChildDescriptors, Object object) {
+ super.collectNewChildDescriptors(newChildDescriptors, object);
+
+ newChildDescriptors.add
+ (createChildParameter
+ (ResourcePackage.Literals.GATEWAY__DEVICE,
+ ResourceFactory.eINSTANCE.createDevice()));
+ }
+
+}
diff --git a/services/org.eclipse.sensinact.studio.model.resource.edit/src/org/eclipse/sensinact/studio/resource/provider/MetadataItemProvider.java b/services/org.eclipse.sensinact.studio.model.resource.edit/src/org/eclipse/sensinact/studio/resource/provider/MetadataItemProvider.java
new file mode 100644
index 0000000..362a632
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.edit/src/org/eclipse/sensinact/studio/resource/provider/MetadataItemProvider.java
@@ -0,0 +1,109 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource.provider;
+
+
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
+
+import org.eclipse.sensinact.studio.resource.Metadata;
+
+/**
+ * This is the item provider adapter for a {@link org.eclipse.sensinact.studio.resource.Metadata} object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class MetadataItemProvider extends TypedElementItemProvider {
+ /**
+ * This constructs an instance from a factory and a notifier.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public MetadataItemProvider(AdapterFactory adapterFactory) {
+ super(adapterFactory);
+ }
+
+ /**
+ * This returns the property descriptors for the adapted class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public List<IItemPropertyDescriptor> getPropertyDescriptors(Object object) {
+ if (itemPropertyDescriptors == null) {
+ super.getPropertyDescriptors(object);
+
+ }
+ return itemPropertyDescriptors;
+ }
+
+ /**
+ * This returns Metadata.gif.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Object getImage(Object object) {
+ return overlayImage(object, getResourceLocator().getImage("full/obj16/Metadata"));
+ }
+
+ /**
+ * This returns the label text for the adapted class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public String getText(Object object) {
+ String label = ((Metadata)object).getName();
+ return label == null || label.length() == 0 ?
+ getString("_UI_Metadata_type") :
+ getString("_UI_Metadata_type") + " " + label;
+ }
+
+
+ /**
+ * This handles model notifications by calling {@link #updateChildren} to update any cached
+ * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void notifyChanged(Notification notification) {
+ updateChildren(notification);
+ super.notifyChanged(notification);
+ }
+
+ /**
+ * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
+ * that can be created under this object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected void collectNewChildDescriptors(Collection<Object> newChildDescriptors, Object object) {
+ super.collectNewChildDescriptors(newChildDescriptors, object);
+ }
+
+}
diff --git a/services/org.eclipse.sensinact.studio.model.resource.edit/src/org/eclipse/sensinact/studio/resource/provider/NamedElementItemProvider.java b/services/org.eclipse.sensinact.studio.model.resource.edit/src/org/eclipse/sensinact/studio/resource/provider/NamedElementItemProvider.java
new file mode 100644
index 0000000..4d26d08
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.edit/src/org/eclipse/sensinact/studio/resource/provider/NamedElementItemProvider.java
@@ -0,0 +1,168 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource.provider;
+
+
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.common.util.ResourceLocator;
+
+import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
+import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
+import org.eclipse.emf.edit.provider.IItemLabelProvider;
+import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.IItemPropertySource;
+import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
+import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
+import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.ItemProviderAdapter;
+import org.eclipse.emf.edit.provider.ViewerNotification;
+
+import org.eclipse.sensinact.studio.resource.NamedElement;
+import org.eclipse.sensinact.studio.resource.ResourcePackage;
+
+/**
+ * This is the item provider adapter for a {@link org.eclipse.sensinact.studio.resource.NamedElement} object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class NamedElementItemProvider
+ extends ItemProviderAdapter
+ implements
+ IEditingDomainItemProvider,
+ IStructuredItemContentProvider,
+ ITreeItemContentProvider,
+ IItemLabelProvider,
+ IItemPropertySource {
+ /**
+ * This constructs an instance from a factory and a notifier.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public NamedElementItemProvider(AdapterFactory adapterFactory) {
+ super(adapterFactory);
+ }
+
+ /**
+ * This returns the property descriptors for the adapted class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public List<IItemPropertyDescriptor> getPropertyDescriptors(Object object) {
+ if (itemPropertyDescriptors == null) {
+ super.getPropertyDescriptors(object);
+
+ addNamePropertyDescriptor(object);
+ }
+ return itemPropertyDescriptors;
+ }
+
+ /**
+ * This adds a property descriptor for the Name feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected void addNamePropertyDescriptor(Object object) {
+ itemPropertyDescriptors.add
+ (createItemPropertyDescriptor
+ (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+ getResourceLocator(),
+ getString("_UI_NamedElement_name_feature"),
+ getString("_UI_PropertyDescriptor_description", "_UI_NamedElement_name_feature", "_UI_NamedElement_type"),
+ ResourcePackage.Literals.NAMED_ELEMENT__NAME,
+ true,
+ false,
+ false,
+ ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
+ null,
+ null));
+ }
+
+ /**
+ * This returns NamedElement.gif.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Object getImage(Object object) {
+ return overlayImage(object, getResourceLocator().getImage("full/obj16/NamedElement"));
+ }
+
+ /**
+ * This returns the label text for the adapted class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public String getText(Object object) {
+ String label = ((NamedElement)object).getName();
+ return label == null || label.length() == 0 ?
+ getString("_UI_NamedElement_type") :
+ getString("_UI_NamedElement_type") + " " + label;
+ }
+
+
+ /**
+ * This handles model notifications by calling {@link #updateChildren} to update any cached
+ * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void notifyChanged(Notification notification) {
+ updateChildren(notification);
+
+ switch (notification.getFeatureID(NamedElement.class)) {
+ case ResourcePackage.NAMED_ELEMENT__NAME:
+ fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
+ return;
+ }
+ super.notifyChanged(notification);
+ }
+
+ /**
+ * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
+ * that can be created under this object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected void collectNewChildDescriptors(Collection<Object> newChildDescriptors, Object object) {
+ super.collectNewChildDescriptors(newChildDescriptors, object);
+ }
+
+ /**
+ * Return the resource locator for this item provider's resources.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public ResourceLocator getResourceLocator() {
+ return ResourceEditPlugin.INSTANCE;
+ }
+
+}
diff --git a/services/org.eclipse.sensinact.studio.model.resource.edit/src/org/eclipse/sensinact/studio/resource/provider/ParameterItemProvider.java b/services/org.eclipse.sensinact.studio.model.resource.edit/src/org/eclipse/sensinact/studio/resource/provider/ParameterItemProvider.java
new file mode 100644
index 0000000..02740b0
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.edit/src/org/eclipse/sensinact/studio/resource/provider/ParameterItemProvider.java
@@ -0,0 +1,109 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource.provider;
+
+
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
+
+import org.eclipse.sensinact.studio.resource.Parameter;
+
+/**
+ * This is the item provider adapter for a {@link org.eclipse.sensinact.studio.resource.Parameter} object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class ParameterItemProvider extends TypedElementItemProvider {
+ /**
+ * This constructs an instance from a factory and a notifier.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public ParameterItemProvider(AdapterFactory adapterFactory) {
+ super(adapterFactory);
+ }
+
+ /**
+ * This returns the property descriptors for the adapted class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public List<IItemPropertyDescriptor> getPropertyDescriptors(Object object) {
+ if (itemPropertyDescriptors == null) {
+ super.getPropertyDescriptors(object);
+
+ }
+ return itemPropertyDescriptors;
+ }
+
+ /**
+ * This returns Parameter.gif.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Object getImage(Object object) {
+ return overlayImage(object, getResourceLocator().getImage("full/obj16/Parameter"));
+ }
+
+ /**
+ * This returns the label text for the adapted class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public String getText(Object object) {
+ String label = ((Parameter)object).getName();
+ return label == null || label.length() == 0 ?
+ getString("_UI_Parameter_type") :
+ getString("_UI_Parameter_type") + " " + label;
+ }
+
+
+ /**
+ * This handles model notifications by calling {@link #updateChildren} to update any cached
+ * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void notifyChanged(Notification notification) {
+ updateChildren(notification);
+ super.notifyChanged(notification);
+ }
+
+ /**
+ * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
+ * that can be created under this object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected void collectNewChildDescriptors(Collection<Object> newChildDescriptors, Object object) {
+ super.collectNewChildDescriptors(newChildDescriptors, object);
+ }
+
+}
diff --git a/services/org.eclipse.sensinact.studio.model.resource.edit/src/org/eclipse/sensinact/studio/resource/provider/PropertyItemProvider.java b/services/org.eclipse.sensinact.studio.model.resource.edit/src/org/eclipse/sensinact/studio/resource/provider/PropertyItemProvider.java
new file mode 100644
index 0000000..affaa8a
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.edit/src/org/eclipse/sensinact/studio/resource/provider/PropertyItemProvider.java
@@ -0,0 +1,109 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource.provider;
+
+
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
+
+import org.eclipse.sensinact.studio.resource.Property;
+
+/**
+ * This is the item provider adapter for a {@link org.eclipse.sensinact.studio.resource.Property} object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class PropertyItemProvider extends ResourceItemProvider {
+ /**
+ * This constructs an instance from a factory and a notifier.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public PropertyItemProvider(AdapterFactory adapterFactory) {
+ super(adapterFactory);
+ }
+
+ /**
+ * This returns the property descriptors for the adapted class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public List<IItemPropertyDescriptor> getPropertyDescriptors(Object object) {
+ if (itemPropertyDescriptors == null) {
+ super.getPropertyDescriptors(object);
+
+ }
+ return itemPropertyDescriptors;
+ }
+
+ /**
+ * This returns Property.gif.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Object getImage(Object object) {
+ return overlayImage(object, getResourceLocator().getImage("full/obj16/Property"));
+ }
+
+ /**
+ * This returns the label text for the adapted class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public String getText(Object object) {
+ String label = ((Property)object).getName();
+ return label == null || label.length() == 0 ?
+ getString("_UI_Property_type") :
+ getString("_UI_Property_type") + " " + label;
+ }
+
+
+ /**
+ * This handles model notifications by calling {@link #updateChildren} to update any cached
+ * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void notifyChanged(Notification notification) {
+ updateChildren(notification);
+ super.notifyChanged(notification);
+ }
+
+ /**
+ * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
+ * that can be created under this object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected void collectNewChildDescriptors(Collection<Object> newChildDescriptors, Object object) {
+ super.collectNewChildDescriptors(newChildDescriptors, object);
+ }
+
+}
diff --git a/services/org.eclipse.sensinact.studio.model.resource.edit/src/org/eclipse/sensinact/studio/resource/provider/ResourceEditPlugin.java b/services/org.eclipse.sensinact.studio.model.resource.edit/src/org/eclipse/sensinact/studio/resource/provider/ResourceEditPlugin.java
new file mode 100644
index 0000000..581a6d0
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.edit/src/org/eclipse/sensinact/studio/resource/provider/ResourceEditPlugin.java
@@ -0,0 +1,99 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource.provider;
+
+import org.eclipse.emf.common.EMFPlugin;
+
+import org.eclipse.emf.common.util.ResourceLocator;
+
+/**
+ * This is the central singleton for the Resource edit plugin.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public final class ResourceEditPlugin extends EMFPlugin {
+ /**
+ * Keep track of the singleton.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public static final ResourceEditPlugin INSTANCE = new ResourceEditPlugin();
+
+ /**
+ * Keep track of the singleton.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ private static Implementation plugin;
+
+ /**
+ * Create the instance.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public ResourceEditPlugin() {
+ super
+ (new ResourceLocator [] {
+ });
+ }
+
+ /**
+ * Returns the singleton instance of the Eclipse plugin.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the singleton instance.
+ * @generated
+ */
+ @Override
+ public ResourceLocator getPluginResourceLocator() {
+ return plugin;
+ }
+
+ /**
+ * Returns the singleton instance of the Eclipse plugin.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the singleton instance.
+ * @generated
+ */
+ public static Implementation getPlugin() {
+ return plugin;
+ }
+
+ /**
+ * The actual implementation of the Eclipse <b>Plugin</b>.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public static class Implementation extends EclipsePlugin {
+ /**
+ * Creates an instance.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public Implementation() {
+ super();
+
+ // Remember the static instance.
+ //
+ plugin = this;
+ }
+ }
+
+}
diff --git a/services/org.eclipse.sensinact.studio.model.resource.edit/src/org/eclipse/sensinact/studio/resource/provider/ResourceItemProvider.java b/services/org.eclipse.sensinact.studio.model.resource.edit/src/org/eclipse/sensinact/studio/resource/provider/ResourceItemProvider.java
new file mode 100644
index 0000000..37befd6
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.edit/src/org/eclipse/sensinact/studio/resource/provider/ResourceItemProvider.java
@@ -0,0 +1,190 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource.provider;
+
+
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EStructuralFeature;
+
+import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
+import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.ViewerNotification;
+
+import org.eclipse.sensinact.studio.resource.Resource;
+import org.eclipse.sensinact.studio.resource.ResourceFactory;
+import org.eclipse.sensinact.studio.resource.ResourcePackage;
+
+/**
+ * This is the item provider adapter for a {@link org.eclipse.sensinact.studio.resource.Resource} object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class ResourceItemProvider extends NamedElementItemProvider {
+ /**
+ * This constructs an instance from a factory and a notifier.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public ResourceItemProvider(AdapterFactory adapterFactory) {
+ super(adapterFactory);
+ }
+
+ /**
+ * This returns the property descriptors for the adapted class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public List<IItemPropertyDescriptor> getPropertyDescriptors(Object object) {
+ if (itemPropertyDescriptors == null) {
+ super.getPropertyDescriptors(object);
+
+ addFriendlyNamePropertyDescriptor(object);
+ }
+ return itemPropertyDescriptors;
+ }
+
+ /**
+ * This adds a property descriptor for the Friendly Name feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected void addFriendlyNamePropertyDescriptor(Object object) {
+ itemPropertyDescriptors.add
+ (createItemPropertyDescriptor
+ (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+ getResourceLocator(),
+ getString("_UI_Resource_friendlyName_feature"),
+ getString("_UI_PropertyDescriptor_description", "_UI_Resource_friendlyName_feature", "_UI_Resource_type"),
+ ResourcePackage.Literals.RESOURCE__FRIENDLY_NAME,
+ true,
+ false,
+ false,
+ ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
+ null,
+ null));
+ }
+
+ /**
+ * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
+ * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
+ * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Collection<? extends EStructuralFeature> getChildrenFeatures(Object object) {
+ if (childrenFeatures == null) {
+ super.getChildrenFeatures(object);
+ childrenFeatures.add(ResourcePackage.Literals.RESOURCE__ATTRIBUTE);
+ childrenFeatures.add(ResourcePackage.Literals.RESOURCE__ACCESS_METHOD);
+ }
+ return childrenFeatures;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EStructuralFeature getChildFeature(Object object, Object child) {
+ // Check the type of the specified child object and return the proper feature to use for
+ // adding (see {@link AddCommand}) it as a child.
+
+ return super.getChildFeature(object, child);
+ }
+
+ /**
+ * This returns Resource.gif.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Object getImage(Object object) {
+ return overlayImage(object, getResourceLocator().getImage("full/obj16/Resource"));
+ }
+
+ /**
+ * This returns the label text for the adapted class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public String getText(Object object) {
+ String label = ((Resource)object).getName();
+ return label == null || label.length() == 0 ?
+ getString("_UI_Resource_type") :
+ getString("_UI_Resource_type") + " " + label;
+ }
+
+
+ /**
+ * This handles model notifications by calling {@link #updateChildren} to update any cached
+ * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void notifyChanged(Notification notification) {
+ updateChildren(notification);
+
+ switch (notification.getFeatureID(Resource.class)) {
+ case ResourcePackage.RESOURCE__FRIENDLY_NAME:
+ fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
+ return;
+ case ResourcePackage.RESOURCE__ATTRIBUTE:
+ case ResourcePackage.RESOURCE__ACCESS_METHOD:
+ fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
+ return;
+ }
+ super.notifyChanged(notification);
+ }
+
+ /**
+ * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
+ * that can be created under this object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected void collectNewChildDescriptors(Collection<Object> newChildDescriptors, Object object) {
+ super.collectNewChildDescriptors(newChildDescriptors, object);
+
+ newChildDescriptors.add
+ (createChildParameter
+ (ResourcePackage.Literals.RESOURCE__ATTRIBUTE,
+ ResourceFactory.eINSTANCE.createAttribute()));
+
+ newChildDescriptors.add
+ (createChildParameter
+ (ResourcePackage.Literals.RESOURCE__ACCESS_METHOD,
+ ResourceFactory.eINSTANCE.createAccessMethod()));
+ }
+
+}
diff --git a/services/org.eclipse.sensinact.studio.model.resource.edit/src/org/eclipse/sensinact/studio/resource/provider/ResourceItemProviderAdapterFactory.java b/services/org.eclipse.sensinact.studio.model.resource.edit/src/org/eclipse/sensinact/studio/resource/provider/ResourceItemProviderAdapterFactory.java
new file mode 100644
index 0000000..4cb6eec
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.edit/src/org/eclipse/sensinact/studio/resource/provider/ResourceItemProviderAdapterFactory.java
@@ -0,0 +1,545 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource.provider;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import org.eclipse.emf.common.notify.Adapter;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.Notifier;
+
+import org.eclipse.emf.edit.provider.ChangeNotifier;
+import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
+import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
+import org.eclipse.emf.edit.provider.IChangeNotifier;
+import org.eclipse.emf.edit.provider.IDisposable;
+import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
+import org.eclipse.emf.edit.provider.IItemLabelProvider;
+import org.eclipse.emf.edit.provider.IItemPropertySource;
+import org.eclipse.emf.edit.provider.INotifyChangedListener;
+import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
+import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
+
+import org.eclipse.sensinact.studio.resource.util.ResourceAdapterFactory;
+
+/**
+ * This is the factory that is used to provide the interfaces needed to support Viewers.
+ * The adapters generated by this factory convert EMF adapter notifications into calls to {@link #fireNotifyChanged fireNotifyChanged}.
+ * The adapters also support Eclipse property sheets.
+ * Note that most of the adapters are shared among multiple instances.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class ResourceItemProviderAdapterFactory extends ResourceAdapterFactory implements ComposeableAdapterFactory, IChangeNotifier, IDisposable {
+ /**
+ * This keeps track of the root adapter factory that delegates to this adapter factory.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected ComposedAdapterFactory parentAdapterFactory;
+
+ /**
+ * This is used to implement {@link org.eclipse.emf.edit.provider.IChangeNotifier}.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected IChangeNotifier changeNotifier = new ChangeNotifier();
+
+ /**
+ * This keeps track of all the supported types checked by {@link #isFactoryForType isFactoryForType}.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected Collection<Object> supportedTypes = new ArrayList<Object>();
+
+ /**
+ * This constructs an instance.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public ResourceItemProviderAdapterFactory() {
+ supportedTypes.add(IEditingDomainItemProvider.class);
+ supportedTypes.add(IStructuredItemContentProvider.class);
+ supportedTypes.add(ITreeItemContentProvider.class);
+ supportedTypes.add(IItemLabelProvider.class);
+ supportedTypes.add(IItemPropertySource.class);
+ }
+
+ /**
+ * This keeps track of the one adapter used for all {@link org.eclipse.sensinact.studio.resource.Studio} instances.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected StudioItemProvider studioItemProvider;
+
+ /**
+ * This creates an adapter for a {@link org.eclipse.sensinact.studio.resource.Studio}.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Adapter createStudioAdapter() {
+ if (studioItemProvider == null) {
+ studioItemProvider = new StudioItemProvider(this);
+ }
+
+ return studioItemProvider;
+ }
+
+ /**
+ * This keeps track of the one adapter used for all {@link org.eclipse.sensinact.studio.resource.Device} instances.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected DeviceItemProvider deviceItemProvider;
+
+ /**
+ * This creates an adapter for a {@link org.eclipse.sensinact.studio.resource.Device}.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Adapter createDeviceAdapter() {
+ if (deviceItemProvider == null) {
+ deviceItemProvider = new DeviceItemProvider(this);
+ }
+
+ return deviceItemProvider;
+ }
+
+ /**
+ * This keeps track of the one adapter used for all {@link org.eclipse.sensinact.studio.resource.NamedElement} instances.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected NamedElementItemProvider namedElementItemProvider;
+
+ /**
+ * This creates an adapter for a {@link org.eclipse.sensinact.studio.resource.NamedElement}.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Adapter createNamedElementAdapter() {
+ if (namedElementItemProvider == null) {
+ namedElementItemProvider = new NamedElementItemProvider(this);
+ }
+
+ return namedElementItemProvider;
+ }
+
+ /**
+ * This keeps track of the one adapter used for all {@link org.eclipse.sensinact.studio.resource.TypedElement} instances.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected TypedElementItemProvider typedElementItemProvider;
+
+ /**
+ * This creates an adapter for a {@link org.eclipse.sensinact.studio.resource.TypedElement}.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Adapter createTypedElementAdapter() {
+ if (typedElementItemProvider == null) {
+ typedElementItemProvider = new TypedElementItemProvider(this);
+ }
+
+ return typedElementItemProvider;
+ }
+
+ /**
+ * This keeps track of the one adapter used for all {@link org.eclipse.sensinact.studio.resource.Service} instances.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected ServiceItemProvider serviceItemProvider;
+
+ /**
+ * This creates an adapter for a {@link org.eclipse.sensinact.studio.resource.Service}.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Adapter createServiceAdapter() {
+ if (serviceItemProvider == null) {
+ serviceItemProvider = new ServiceItemProvider(this);
+ }
+
+ return serviceItemProvider;
+ }
+
+ /**
+ * This keeps track of the one adapter used for all {@link org.eclipse.sensinact.studio.resource.Resource} instances.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected ResourceItemProvider resourceItemProvider;
+
+ /**
+ * This creates an adapter for a {@link org.eclipse.sensinact.studio.resource.Resource}.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Adapter createResourceAdapter() {
+ if (resourceItemProvider == null) {
+ resourceItemProvider = new ResourceItemProvider(this);
+ }
+
+ return resourceItemProvider;
+ }
+
+ /**
+ * This keeps track of the one adapter used for all {@link org.eclipse.sensinact.studio.resource.Property} instances.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected PropertyItemProvider propertyItemProvider;
+
+ /**
+ * This creates an adapter for a {@link org.eclipse.sensinact.studio.resource.Property}.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Adapter createPropertyAdapter() {
+ if (propertyItemProvider == null) {
+ propertyItemProvider = new PropertyItemProvider(this);
+ }
+
+ return propertyItemProvider;
+ }
+
+ /**
+ * This keeps track of the one adapter used for all {@link org.eclipse.sensinact.studio.resource.SensorData} instances.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected SensorDataItemProvider sensorDataItemProvider;
+
+ /**
+ * This creates an adapter for a {@link org.eclipse.sensinact.studio.resource.SensorData}.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Adapter createSensorDataAdapter() {
+ if (sensorDataItemProvider == null) {
+ sensorDataItemProvider = new SensorDataItemProvider(this);
+ }
+
+ return sensorDataItemProvider;
+ }
+
+ /**
+ * This keeps track of the one adapter used for all {@link org.eclipse.sensinact.studio.resource.StateVariable} instances.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected StateVariableItemProvider stateVariableItemProvider;
+
+ /**
+ * This creates an adapter for a {@link org.eclipse.sensinact.studio.resource.StateVariable}.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Adapter createStateVariableAdapter() {
+ if (stateVariableItemProvider == null) {
+ stateVariableItemProvider = new StateVariableItemProvider(this);
+ }
+
+ return stateVariableItemProvider;
+ }
+
+ /**
+ * This keeps track of the one adapter used for all {@link org.eclipse.sensinact.studio.resource.Action} instances.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected ActionItemProvider actionItemProvider;
+
+ /**
+ * This creates an adapter for a {@link org.eclipse.sensinact.studio.resource.Action}.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Adapter createActionAdapter() {
+ if (actionItemProvider == null) {
+ actionItemProvider = new ActionItemProvider(this);
+ }
+
+ return actionItemProvider;
+ }
+
+ /**
+ * This keeps track of the one adapter used for all {@link org.eclipse.sensinact.studio.resource.Attribute} instances.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected AttributeItemProvider attributeItemProvider;
+
+ /**
+ * This creates an adapter for a {@link org.eclipse.sensinact.studio.resource.Attribute}.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Adapter createAttributeAdapter() {
+ if (attributeItemProvider == null) {
+ attributeItemProvider = new AttributeItemProvider(this);
+ }
+
+ return attributeItemProvider;
+ }
+
+ /**
+ * This keeps track of the one adapter used for all {@link org.eclipse.sensinact.studio.resource.Metadata} instances.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected MetadataItemProvider metadataItemProvider;
+
+ /**
+ * This creates an adapter for a {@link org.eclipse.sensinact.studio.resource.Metadata}.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Adapter createMetadataAdapter() {
+ if (metadataItemProvider == null) {
+ metadataItemProvider = new MetadataItemProvider(this);
+ }
+
+ return metadataItemProvider;
+ }
+
+ /**
+ * This keeps track of the one adapter used for all {@link org.eclipse.sensinact.studio.resource.AccessMethod} instances.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected AccessMethodItemProvider accessMethodItemProvider;
+
+ /**
+ * This creates an adapter for a {@link org.eclipse.sensinact.studio.resource.AccessMethod}.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Adapter createAccessMethodAdapter() {
+ if (accessMethodItemProvider == null) {
+ accessMethodItemProvider = new AccessMethodItemProvider(this);
+ }
+
+ return accessMethodItemProvider;
+ }
+
+ /**
+ * This keeps track of the one adapter used for all {@link org.eclipse.sensinact.studio.resource.Parameter} instances.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected ParameterItemProvider parameterItemProvider;
+
+ /**
+ * This creates an adapter for a {@link org.eclipse.sensinact.studio.resource.Parameter}.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Adapter createParameterAdapter() {
+ if (parameterItemProvider == null) {
+ parameterItemProvider = new ParameterItemProvider(this);
+ }
+
+ return parameterItemProvider;
+ }
+
+ /**
+ * This keeps track of the one adapter used for all {@link org.eclipse.sensinact.studio.resource.Gateway} instances.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected GatewayItemProvider gatewayItemProvider;
+
+ /**
+ * This creates an adapter for a {@link org.eclipse.sensinact.studio.resource.Gateway}.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Adapter createGatewayAdapter() {
+ if (gatewayItemProvider == null) {
+ gatewayItemProvider = new GatewayItemProvider(this);
+ }
+
+ return gatewayItemProvider;
+ }
+
+ /**
+ * This returns the root adapter factory that contains this factory.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public ComposeableAdapterFactory getRootAdapterFactory() {
+ return parentAdapterFactory == null ? this : parentAdapterFactory.getRootAdapterFactory();
+ }
+
+ /**
+ * This sets the composed adapter factory that contains this factory.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setParentAdapterFactory(ComposedAdapterFactory parentAdapterFactory) {
+ this.parentAdapterFactory = parentAdapterFactory;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public boolean isFactoryForType(Object type) {
+ return supportedTypes.contains(type) || super.isFactoryForType(type);
+ }
+
+ /**
+ * This implementation substitutes the factory itself as the key for the adapter.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Adapter adapt(Notifier notifier, Object type) {
+ return super.adapt(notifier, this);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Object adapt(Object object, Object type) {
+ if (isFactoryForType(type)) {
+ Object adapter = super.adapt(object, type);
+ if (!(type instanceof Class<?>) || (((Class<?>)type).isInstance(adapter))) {
+ return adapter;
+ }
+ }
+
+ return null;
+ }
+
+ /**
+ * This adds a listener.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void addListener(INotifyChangedListener notifyChangedListener) {
+ changeNotifier.addListener(notifyChangedListener);
+ }
+
+ /**
+ * This removes a listener.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void removeListener(INotifyChangedListener notifyChangedListener) {
+ changeNotifier.removeListener(notifyChangedListener);
+ }
+
+ /**
+ * This delegates to {@link #changeNotifier} and to {@link #parentAdapterFactory}.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void fireNotifyChanged(Notification notification) {
+ changeNotifier.fireNotifyChanged(notification);
+
+ if (parentAdapterFactory != null) {
+ parentAdapterFactory.fireNotifyChanged(notification);
+ }
+ }
+
+ /**
+ * This disposes all of the item providers created by this factory.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void dispose() {
+ if (studioItemProvider != null) studioItemProvider.dispose();
+ if (deviceItemProvider != null) deviceItemProvider.dispose();
+ if (namedElementItemProvider != null) namedElementItemProvider.dispose();
+ if (typedElementItemProvider != null) typedElementItemProvider.dispose();
+ if (serviceItemProvider != null) serviceItemProvider.dispose();
+ if (resourceItemProvider != null) resourceItemProvider.dispose();
+ if (propertyItemProvider != null) propertyItemProvider.dispose();
+ if (sensorDataItemProvider != null) sensorDataItemProvider.dispose();
+ if (stateVariableItemProvider != null) stateVariableItemProvider.dispose();
+ if (actionItemProvider != null) actionItemProvider.dispose();
+ if (attributeItemProvider != null) attributeItemProvider.dispose();
+ if (metadataItemProvider != null) metadataItemProvider.dispose();
+ if (accessMethodItemProvider != null) accessMethodItemProvider.dispose();
+ if (parameterItemProvider != null) parameterItemProvider.dispose();
+ if (gatewayItemProvider != null) gatewayItemProvider.dispose();
+ }
+
+}
diff --git a/services/org.eclipse.sensinact.studio.model.resource.edit/src/org/eclipse/sensinact/studio/resource/provider/SensorDataItemProvider.java b/services/org.eclipse.sensinact.studio.model.resource.edit/src/org/eclipse/sensinact/studio/resource/provider/SensorDataItemProvider.java
new file mode 100644
index 0000000..867dc1d
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.edit/src/org/eclipse/sensinact/studio/resource/provider/SensorDataItemProvider.java
@@ -0,0 +1,109 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource.provider;
+
+
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
+
+import org.eclipse.sensinact.studio.resource.SensorData;
+
+/**
+ * This is the item provider adapter for a {@link org.eclipse.sensinact.studio.resource.SensorData} object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class SensorDataItemProvider extends ResourceItemProvider {
+ /**
+ * This constructs an instance from a factory and a notifier.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public SensorDataItemProvider(AdapterFactory adapterFactory) {
+ super(adapterFactory);
+ }
+
+ /**
+ * This returns the property descriptors for the adapted class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public List<IItemPropertyDescriptor> getPropertyDescriptors(Object object) {
+ if (itemPropertyDescriptors == null) {
+ super.getPropertyDescriptors(object);
+
+ }
+ return itemPropertyDescriptors;
+ }
+
+ /**
+ * This returns SensorData.gif.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Object getImage(Object object) {
+ return overlayImage(object, getResourceLocator().getImage("full/obj16/SensorData"));
+ }
+
+ /**
+ * This returns the label text for the adapted class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public String getText(Object object) {
+ String label = ((SensorData)object).getName();
+ return label == null || label.length() == 0 ?
+ getString("_UI_SensorData_type") :
+ getString("_UI_SensorData_type") + " " + label;
+ }
+
+
+ /**
+ * This handles model notifications by calling {@link #updateChildren} to update any cached
+ * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void notifyChanged(Notification notification) {
+ updateChildren(notification);
+ super.notifyChanged(notification);
+ }
+
+ /**
+ * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
+ * that can be created under this object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected void collectNewChildDescriptors(Collection<Object> newChildDescriptors, Object object) {
+ super.collectNewChildDescriptors(newChildDescriptors, object);
+ }
+
+}
diff --git a/services/org.eclipse.sensinact.studio.model.resource.edit/src/org/eclipse/sensinact/studio/resource/provider/ServiceItemProvider.java b/services/org.eclipse.sensinact.studio.model.resource.edit/src/org/eclipse/sensinact/studio/resource/provider/ServiceItemProvider.java
new file mode 100644
index 0000000..c3a4b5e
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.edit/src/org/eclipse/sensinact/studio/resource/provider/ServiceItemProvider.java
@@ -0,0 +1,203 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource.provider;
+
+
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EStructuralFeature;
+
+import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
+import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.ViewerNotification;
+
+import org.eclipse.sensinact.studio.resource.ResourceFactory;
+import org.eclipse.sensinact.studio.resource.ResourcePackage;
+import org.eclipse.sensinact.studio.resource.Service;
+
+/**
+ * This is the item provider adapter for a {@link org.eclipse.sensinact.studio.resource.Service} object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class ServiceItemProvider extends NamedElementItemProvider {
+ /**
+ * This constructs an instance from a factory and a notifier.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public ServiceItemProvider(AdapterFactory adapterFactory) {
+ super(adapterFactory);
+ }
+
+ /**
+ * This returns the property descriptors for the adapted class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public List<IItemPropertyDescriptor> getPropertyDescriptors(Object object) {
+ if (itemPropertyDescriptors == null) {
+ super.getPropertyDescriptors(object);
+
+ addFriendlyNamePropertyDescriptor(object);
+ }
+ return itemPropertyDescriptors;
+ }
+
+ /**
+ * This adds a property descriptor for the Friendly Name feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected void addFriendlyNamePropertyDescriptor(Object object) {
+ itemPropertyDescriptors.add
+ (createItemPropertyDescriptor
+ (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+ getResourceLocator(),
+ getString("_UI_Service_friendlyName_feature"),
+ getString("_UI_PropertyDescriptor_description", "_UI_Service_friendlyName_feature", "_UI_Service_type"),
+ ResourcePackage.Literals.SERVICE__FRIENDLY_NAME,
+ true,
+ false,
+ false,
+ ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
+ null,
+ null));
+ }
+
+ /**
+ * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
+ * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
+ * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Collection<? extends EStructuralFeature> getChildrenFeatures(Object object) {
+ if (childrenFeatures == null) {
+ super.getChildrenFeatures(object);
+ childrenFeatures.add(ResourcePackage.Literals.SERVICE__RESOURCE);
+ }
+ return childrenFeatures;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EStructuralFeature getChildFeature(Object object, Object child) {
+ // Check the type of the specified child object and return the proper feature to use for
+ // adding (see {@link AddCommand}) it as a child.
+
+ return super.getChildFeature(object, child);
+ }
+
+ /**
+ * This returns Service.gif.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Object getImage(Object object) {
+ return overlayImage(object, getResourceLocator().getImage("full/obj16/Service"));
+ }
+
+ /**
+ * This returns the label text for the adapted class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public String getText(Object object) {
+ String label = ((Service)object).getName();
+ return label == null || label.length() == 0 ?
+ getString("_UI_Service_type") :
+ getString("_UI_Service_type") + " " + label;
+ }
+
+
+ /**
+ * This handles model notifications by calling {@link #updateChildren} to update any cached
+ * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void notifyChanged(Notification notification) {
+ updateChildren(notification);
+
+ switch (notification.getFeatureID(Service.class)) {
+ case ResourcePackage.SERVICE__FRIENDLY_NAME:
+ fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
+ return;
+ case ResourcePackage.SERVICE__RESOURCE:
+ fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
+ return;
+ }
+ super.notifyChanged(notification);
+ }
+
+ /**
+ * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
+ * that can be created under this object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected void collectNewChildDescriptors(Collection<Object> newChildDescriptors, Object object) {
+ super.collectNewChildDescriptors(newChildDescriptors, object);
+
+ newChildDescriptors.add
+ (createChildParameter
+ (ResourcePackage.Literals.SERVICE__RESOURCE,
+ ResourceFactory.eINSTANCE.createResource()));
+
+ newChildDescriptors.add
+ (createChildParameter
+ (ResourcePackage.Literals.SERVICE__RESOURCE,
+ ResourceFactory.eINSTANCE.createProperty()));
+
+ newChildDescriptors.add
+ (createChildParameter
+ (ResourcePackage.Literals.SERVICE__RESOURCE,
+ ResourceFactory.eINSTANCE.createSensorData()));
+
+ newChildDescriptors.add
+ (createChildParameter
+ (ResourcePackage.Literals.SERVICE__RESOURCE,
+ ResourceFactory.eINSTANCE.createStateVariable()));
+
+ newChildDescriptors.add
+ (createChildParameter
+ (ResourcePackage.Literals.SERVICE__RESOURCE,
+ ResourceFactory.eINSTANCE.createAction()));
+ }
+
+}
diff --git a/services/org.eclipse.sensinact.studio.model.resource.edit/src/org/eclipse/sensinact/studio/resource/provider/StateVariableItemProvider.java b/services/org.eclipse.sensinact.studio.model.resource.edit/src/org/eclipse/sensinact/studio/resource/provider/StateVariableItemProvider.java
new file mode 100644
index 0000000..b26717b
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.edit/src/org/eclipse/sensinact/studio/resource/provider/StateVariableItemProvider.java
@@ -0,0 +1,134 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource.provider;
+
+
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
+import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
+
+import org.eclipse.sensinact.studio.resource.ResourcePackage;
+import org.eclipse.sensinact.studio.resource.StateVariable;
+
+/**
+ * This is the item provider adapter for a {@link org.eclipse.sensinact.studio.resource.StateVariable} object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class StateVariableItemProvider extends ResourceItemProvider {
+ /**
+ * This constructs an instance from a factory and a notifier.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public StateVariableItemProvider(AdapterFactory adapterFactory) {
+ super(adapterFactory);
+ }
+
+ /**
+ * This returns the property descriptors for the adapted class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public List<IItemPropertyDescriptor> getPropertyDescriptors(Object object) {
+ if (itemPropertyDescriptors == null) {
+ super.getPropertyDescriptors(object);
+
+ addModifierPropertyDescriptor(object);
+ }
+ return itemPropertyDescriptors;
+ }
+
+ /**
+ * This adds a property descriptor for the Modifier feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected void addModifierPropertyDescriptor(Object object) {
+ itemPropertyDescriptors.add
+ (createItemPropertyDescriptor
+ (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+ getResourceLocator(),
+ getString("_UI_StateVariable_modifier_feature"),
+ getString("_UI_PropertyDescriptor_description", "_UI_StateVariable_modifier_feature", "_UI_StateVariable_type"),
+ ResourcePackage.Literals.STATE_VARIABLE__MODIFIER,
+ true,
+ false,
+ true,
+ null,
+ null,
+ null));
+ }
+
+ /**
+ * This returns StateVariable.gif.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Object getImage(Object object) {
+ return overlayImage(object, getResourceLocator().getImage("full/obj16/StateVariable"));
+ }
+
+ /**
+ * This returns the label text for the adapted class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public String getText(Object object) {
+ String label = ((StateVariable)object).getName();
+ return label == null || label.length() == 0 ?
+ getString("_UI_StateVariable_type") :
+ getString("_UI_StateVariable_type") + " " + label;
+ }
+
+
+ /**
+ * This handles model notifications by calling {@link #updateChildren} to update any cached
+ * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void notifyChanged(Notification notification) {
+ updateChildren(notification);
+ super.notifyChanged(notification);
+ }
+
+ /**
+ * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
+ * that can be created under this object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected void collectNewChildDescriptors(Collection<Object> newChildDescriptors, Object object) {
+ super.collectNewChildDescriptors(newChildDescriptors, object);
+ }
+
+}
diff --git a/services/org.eclipse.sensinact.studio.model.resource.edit/src/org/eclipse/sensinact/studio/resource/provider/StudioItemProvider.java b/services/org.eclipse.sensinact.studio.model.resource.edit/src/org/eclipse/sensinact/studio/resource/provider/StudioItemProvider.java
new file mode 100644
index 0000000..2e4ec76
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.edit/src/org/eclipse/sensinact/studio/resource/provider/StudioItemProvider.java
@@ -0,0 +1,178 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource.provider;
+
+
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.common.util.ResourceLocator;
+
+import org.eclipse.emf.ecore.EStructuralFeature;
+
+import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
+import org.eclipse.emf.edit.provider.IItemLabelProvider;
+import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.IItemPropertySource;
+import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
+import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
+import org.eclipse.emf.edit.provider.ItemProviderAdapter;
+import org.eclipse.emf.edit.provider.ViewerNotification;
+
+import org.eclipse.sensinact.studio.resource.ResourceFactory;
+import org.eclipse.sensinact.studio.resource.ResourcePackage;
+import org.eclipse.sensinact.studio.resource.Studio;
+
+/**
+ * This is the item provider adapter for a {@link org.eclipse.sensinact.studio.resource.Studio} object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class StudioItemProvider
+ extends ItemProviderAdapter
+ implements
+ IEditingDomainItemProvider,
+ IStructuredItemContentProvider,
+ ITreeItemContentProvider,
+ IItemLabelProvider,
+ IItemPropertySource {
+ /**
+ * This constructs an instance from a factory and a notifier.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public StudioItemProvider(AdapterFactory adapterFactory) {
+ super(adapterFactory);
+ }
+
+ /**
+ * This returns the property descriptors for the adapted class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public List<IItemPropertyDescriptor> getPropertyDescriptors(Object object) {
+ if (itemPropertyDescriptors == null) {
+ super.getPropertyDescriptors(object);
+
+ }
+ return itemPropertyDescriptors;
+ }
+
+ /**
+ * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
+ * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
+ * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Collection<? extends EStructuralFeature> getChildrenFeatures(Object object) {
+ if (childrenFeatures == null) {
+ super.getChildrenFeatures(object);
+ childrenFeatures.add(ResourcePackage.Literals.STUDIO__GATEWAYS);
+ }
+ return childrenFeatures;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EStructuralFeature getChildFeature(Object object, Object child) {
+ // Check the type of the specified child object and return the proper feature to use for
+ // adding (see {@link AddCommand}) it as a child.
+
+ return super.getChildFeature(object, child);
+ }
+
+ /**
+ * This returns Studio.gif.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Object getImage(Object object) {
+ return overlayImage(object, getResourceLocator().getImage("full/obj16/Studio"));
+ }
+
+ /**
+ * This returns the label text for the adapted class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public String getText(Object object) {
+ return getString("_UI_Studio_type");
+ }
+
+
+ /**
+ * This handles model notifications by calling {@link #updateChildren} to update any cached
+ * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void notifyChanged(Notification notification) {
+ updateChildren(notification);
+
+ switch (notification.getFeatureID(Studio.class)) {
+ case ResourcePackage.STUDIO__GATEWAYS:
+ fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
+ return;
+ }
+ super.notifyChanged(notification);
+ }
+
+ /**
+ * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
+ * that can be created under this object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected void collectNewChildDescriptors(Collection<Object> newChildDescriptors, Object object) {
+ super.collectNewChildDescriptors(newChildDescriptors, object);
+
+ newChildDescriptors.add
+ (createChildParameter
+ (ResourcePackage.Literals.STUDIO__GATEWAYS,
+ ResourceFactory.eINSTANCE.createGateway()));
+ }
+
+ /**
+ * Return the resource locator for this item provider's resources.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public ResourceLocator getResourceLocator() {
+ return ResourceEditPlugin.INSTANCE;
+ }
+
+}
diff --git a/services/org.eclipse.sensinact.studio.model.resource.edit/src/org/eclipse/sensinact/studio/resource/provider/TypedElementItemProvider.java b/services/org.eclipse.sensinact.studio.model.resource.edit/src/org/eclipse/sensinact/studio/resource/provider/TypedElementItemProvider.java
new file mode 100644
index 0000000..1abc5ba
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.edit/src/org/eclipse/sensinact/studio/resource/provider/TypedElementItemProvider.java
@@ -0,0 +1,166 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource.provider;
+
+
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
+import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.ViewerNotification;
+
+import org.eclipse.sensinact.studio.resource.ResourcePackage;
+import org.eclipse.sensinact.studio.resource.TypedElement;
+
+/**
+ * This is the item provider adapter for a {@link org.eclipse.sensinact.studio.resource.TypedElement} object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class TypedElementItemProvider extends NamedElementItemProvider {
+ /**
+ * This constructs an instance from a factory and a notifier.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public TypedElementItemProvider(AdapterFactory adapterFactory) {
+ super(adapterFactory);
+ }
+
+ /**
+ * This returns the property descriptors for the adapted class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public List<IItemPropertyDescriptor> getPropertyDescriptors(Object object) {
+ if (itemPropertyDescriptors == null) {
+ super.getPropertyDescriptors(object);
+
+ addTypePropertyDescriptor(object);
+ addValuePropertyDescriptor(object);
+ }
+ return itemPropertyDescriptors;
+ }
+
+ /**
+ * This adds a property descriptor for the Type feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected void addTypePropertyDescriptor(Object object) {
+ itemPropertyDescriptors.add
+ (createItemPropertyDescriptor
+ (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+ getResourceLocator(),
+ getString("_UI_TypedElement_type_feature"),
+ getString("_UI_PropertyDescriptor_description", "_UI_TypedElement_type_feature", "_UI_TypedElement_type"),
+ ResourcePackage.Literals.TYPED_ELEMENT__TYPE,
+ true,
+ false,
+ false,
+ ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
+ null,
+ null));
+ }
+
+ /**
+ * This adds a property descriptor for the Value feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected void addValuePropertyDescriptor(Object object) {
+ itemPropertyDescriptors.add
+ (createItemPropertyDescriptor
+ (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+ getResourceLocator(),
+ getString("_UI_TypedElement_value_feature"),
+ getString("_UI_PropertyDescriptor_description", "_UI_TypedElement_value_feature", "_UI_TypedElement_type"),
+ ResourcePackage.Literals.TYPED_ELEMENT__VALUE,
+ true,
+ false,
+ false,
+ ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
+ null,
+ null));
+ }
+
+ /**
+ * This returns TypedElement.gif.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Object getImage(Object object) {
+ return overlayImage(object, getResourceLocator().getImage("full/obj16/TypedElement"));
+ }
+
+ /**
+ * This returns the label text for the adapted class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public String getText(Object object) {
+ String label = ((TypedElement)object).getName();
+ return label == null || label.length() == 0 ?
+ getString("_UI_TypedElement_type") :
+ getString("_UI_TypedElement_type") + " " + label;
+ }
+
+
+ /**
+ * This handles model notifications by calling {@link #updateChildren} to update any cached
+ * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void notifyChanged(Notification notification) {
+ updateChildren(notification);
+
+ switch (notification.getFeatureID(TypedElement.class)) {
+ case ResourcePackage.TYPED_ELEMENT__TYPE:
+ case ResourcePackage.TYPED_ELEMENT__VALUE:
+ fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
+ return;
+ }
+ super.notifyChanged(notification);
+ }
+
+ /**
+ * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
+ * that can be created under this object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected void collectNewChildDescriptors(Collection<Object> newChildDescriptors, Object object) {
+ super.collectNewChildDescriptors(newChildDescriptors, object);
+ }
+
+}
diff --git a/services/org.eclipse.sensinact.studio.model.resource.editor/META-INF/MANIFEST.MF b/services/org.eclipse.sensinact.studio.model.resource.editor/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..a0c97ba
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.editor/META-INF/MANIFEST.MF
@@ -0,0 +1,18 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-SymbolicName: org.eclipse.sensinact.studio.model.resource.editor;singleton:=true
+Bundle-Version: 1.0.0.qualifier
+Bundle-ClassPath: .
+Bundle-Activator: org.eclipse.sensinact.studio.resource.presentation.ResourceEditorPlugin$Implementation
+Bundle-Vendor: %providerName
+Bundle-Localization: plugin
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Export-Package: org.eclipse.sensinact.studio.resource.presentation
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.core.resources;visibility:=reexport,
+ org.eclipse.sensinact.studio.model.resource.edit;visibility:=reexport,
+ org.eclipse.emf.ecore.xmi;visibility:=reexport,
+ org.eclipse.emf.edit.ui;visibility:=reexport,
+ org.eclipse.ui.ide;visibility:=reexport
+Bundle-ActivationPolicy: lazy
diff --git a/services/org.eclipse.sensinact.studio.model.resource.editor/about.html b/services/org.eclipse.sensinact.studio.model.resource.editor/about.html
new file mode 100644
index 0000000..3b39f88
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.editor/about.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"><head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 5, 2006</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+
+</body></html>
\ No newline at end of file
diff --git a/services/org.eclipse.sensinact.studio.model.resource.editor/build.properties b/services/org.eclipse.sensinact.studio.model.resource.editor/build.properties
new file mode 100644
index 0000000..d446ec9
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.editor/build.properties
@@ -0,0 +1,21 @@
+#
+# Copyright (c) 2017 CEA.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+# CEA - initial API and implementation and/or initial documentation
+#
+
+#
+
+bin.includes = .,\
+ icons/,\
+ META-INF/,\
+ plugin.xml,\
+ plugin.properties
+jars.compile.order = .
+source.. = src/
+output.. = bin
diff --git a/services/org.eclipse.sensinact.studio.model.resource.editor/icons/full/obj16/ResourceModelFile.gif b/services/org.eclipse.sensinact.studio.model.resource.editor/icons/full/obj16/ResourceModelFile.gif
new file mode 100644
index 0000000..40ce498
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.editor/icons/full/obj16/ResourceModelFile.gif
Binary files differ
diff --git a/services/org.eclipse.sensinact.studio.model.resource.editor/icons/full/wizban/NewResource.gif b/services/org.eclipse.sensinact.studio.model.resource.editor/icons/full/wizban/NewResource.gif
new file mode 100644
index 0000000..5f38f49
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.editor/icons/full/wizban/NewResource.gif
Binary files differ
diff --git a/services/org.eclipse.sensinact.studio.model.resource.editor/plugin.properties b/services/org.eclipse.sensinact.studio.model.resource.editor/plugin.properties
new file mode 100644
index 0000000..644e217
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.editor/plugin.properties
@@ -0,0 +1,64 @@
+#
+# Copyright (c) 2017 CEA.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+# CEA - initial API and implementation and/or initial documentation
+#
+
+#
+
+pluginName = Resource Editor
+providerName = www.example.org
+
+_UI_ResourceEditor_menu = &Resource Editor
+
+_UI_CreateChild_menu_item = &New Child
+_UI_CreateSibling_menu_item = N&ew Sibling
+
+_UI_ShowPropertiesView_menu_item = Show &Properties View
+_UI_RefreshViewer_menu_item = &Refresh
+
+_UI_SelectionPage_label = Selection
+_UI_ParentPage_label = Parent
+_UI_ListPage_label = List
+_UI_TreePage_label = Tree
+_UI_TablePage_label = Table
+_UI_TreeWithColumnsPage_label = Tree with Columns
+_UI_ObjectColumn_label = Object
+_UI_SelfColumn_label = Self
+
+_UI_NoObjectSelected = Selected Nothing
+_UI_SingleObjectSelected = Selected Object: {0}
+_UI_MultiObjectSelected = Selected {0} Objects
+
+_UI_OpenEditorError_label = Open Editor
+
+_UI_Wizard_category = Example EMF Model Creation Wizards
+
+_UI_CreateModelError_message = Problems encountered in file "{0}"
+
+_UI_ResourceModelWizard_label = Resource Model
+_UI_ResourceModelWizard_description = Create a new Resource model
+
+_UI_ResourceEditor_label = Resource Model Editor
+
+_UI_ResourceEditorFilenameDefaultBase = My
+_UI_ResourceEditorFilenameExtensions = resource
+
+_UI_Wizard_label = New
+
+_WARN_FilenameExtension = The file name must end in ''.{0}''
+_WARN_FilenameExtensions = The file name must have one of the following extensions: {0}
+
+_UI_ModelObject = &Model Object
+_UI_XMLEncoding = &XML Encoding
+_UI_XMLEncodingChoices = UTF-8 ASCII UTF-16 UTF-16BE UTF-16LE ISO-8859-1
+_UI_Wizard_initial_object_description = Select a model object to create
+
+_UI_FileConflict_label = File Conflict
+_WARN_FileConflict = There are unsaved changes that conflict with changes made outside the editor. Do you wish to discard this editor's changes?
+
diff --git a/services/org.eclipse.sensinact.studio.model.resource.editor/plugin.xml b/services/org.eclipse.sensinact.studio.model.resource.editor/plugin.xml
new file mode 100644
index 0000000..8876e34
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.editor/plugin.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Copyright (c) 2017 CEA.
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+
+ Contributors:
+ CEA - initial API and implementation and/or initial documentation
+
+-->
+<?eclipse version="3.0"?>
+
+<!--
+-->
+
+<plugin>
+
+ <extension point="org.eclipse.ui.newWizards">
+ <!-- @generated resource -->
+ <category
+ id="org.eclipse.emf.ecore.Wizard.category.ID"
+ name="%_UI_Wizard_category"/>
+ <wizard
+ id="org.eclipse.sensinact.studio.resource.presentation.ResourceModelWizardID"
+ name="%_UI_ResourceModelWizard_label"
+ class="org.eclipse.sensinact.studio.resource.presentation.ResourceModelWizard"
+ category="org.eclipse.emf.ecore.Wizard.category.ID"
+ icon="icons/full/obj16/ResourceModelFile.gif">
+ <description>%_UI_ResourceModelWizard_description</description>
+ <selection class="org.eclipse.core.resources.IResource"/>
+ </wizard>
+ </extension>
+
+ <extension point="org.eclipse.ui.editors">
+ <!-- @generated resource -->
+ <editor
+ id="org.eclipse.sensinact.studio.resource.presentation.ResourceEditorID"
+ name="%_UI_ResourceEditor_label"
+ icon="icons/full/obj16/ResourceModelFile.gif"
+ extensions="resource"
+ class="org.eclipse.sensinact.studio.resource.presentation.ResourceEditor"
+ contributorClass="org.eclipse.sensinact.studio.resource.presentation.ResourceActionBarContributor">
+ </editor>
+ </extension>
+
+</plugin>
diff --git a/services/org.eclipse.sensinact.studio.model.resource.editor/src/org/eclipse/sensinact/studio/resource/presentation/ResourceActionBarContributor.java b/services/org.eclipse.sensinact.studio.model.resource.editor/src/org/eclipse/sensinact/studio/resource/presentation/ResourceActionBarContributor.java
new file mode 100644
index 0000000..d0a9763
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.editor/src/org/eclipse/sensinact/studio/resource/presentation/ResourceActionBarContributor.java
@@ -0,0 +1,433 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource.presentation;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import org.eclipse.emf.common.ui.viewer.IViewerProvider;
+
+import org.eclipse.emf.edit.domain.EditingDomain;
+import org.eclipse.emf.edit.domain.IEditingDomainProvider;
+
+import org.eclipse.emf.edit.ui.action.ControlAction;
+import org.eclipse.emf.edit.ui.action.CreateChildAction;
+import org.eclipse.emf.edit.ui.action.CreateSiblingAction;
+import org.eclipse.emf.edit.ui.action.EditingDomainActionBarContributor;
+import org.eclipse.emf.edit.ui.action.LoadResourceAction;
+import org.eclipse.emf.edit.ui.action.ValidateAction;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.ActionContributionItem;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.action.IContributionItem;
+import org.eclipse.jface.action.IContributionManager;
+import org.eclipse.jface.action.IMenuListener;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.action.SubContributionItem;
+
+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.jface.viewers.Viewer;
+
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.PartInitException;
+
+/**
+ * This is the action bar contributor for the Resource model editor.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class ResourceActionBarContributor
+ extends EditingDomainActionBarContributor
+ implements ISelectionChangedListener {
+ /**
+ * This keeps track of the active editor.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected IEditorPart activeEditorPart;
+
+ /**
+ * This keeps track of the current selection provider.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected ISelectionProvider selectionProvider;
+
+ /**
+ * This action opens the Properties view.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected IAction showPropertiesViewAction =
+ new Action(ResourceEditorPlugin.INSTANCE.getString("_UI_ShowPropertiesView_menu_item")) {
+ @Override
+ public void run() {
+ try {
+ getPage().showView("org.eclipse.ui.views.PropertySheet");
+ }
+ catch (PartInitException exception) {
+ ResourceEditorPlugin.INSTANCE.log(exception);
+ }
+ }
+ };
+
+ /**
+ * This action refreshes the viewer of the current editor if the editor
+ * implements {@link org.eclipse.emf.common.ui.viewer.IViewerProvider}.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected IAction refreshViewerAction =
+ new Action(ResourceEditorPlugin.INSTANCE.getString("_UI_RefreshViewer_menu_item")) {
+ @Override
+ public boolean isEnabled() {
+ return activeEditorPart instanceof IViewerProvider;
+ }
+
+ @Override
+ public void run() {
+ if (activeEditorPart instanceof IViewerProvider) {
+ Viewer viewer = ((IViewerProvider)activeEditorPart).getViewer();
+ if (viewer != null) {
+ viewer.refresh();
+ }
+ }
+ }
+ };
+
+ /**
+ * This will contain one {@link org.eclipse.emf.edit.ui.action.CreateChildAction} corresponding to each descriptor
+ * generated for the current selection by the item provider.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected Collection<IAction> createChildActions;
+
+ /**
+ * This is the menu manager into which menu contribution items should be added for CreateChild actions.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected IMenuManager createChildMenuManager;
+
+ /**
+ * This will contain one {@link org.eclipse.emf.edit.ui.action.CreateSiblingAction} corresponding to each descriptor
+ * generated for the current selection by the item provider.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected Collection<IAction> createSiblingActions;
+
+ /**
+ * This is the menu manager into which menu contribution items should be added for CreateSibling actions.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected IMenuManager createSiblingMenuManager;
+
+ /**
+ * This creates an instance of the contributor.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public ResourceActionBarContributor() {
+ super(ADDITIONS_LAST_STYLE);
+ loadResourceAction = new LoadResourceAction();
+ validateAction = new ValidateAction();
+ controlAction = new ControlAction();
+ }
+
+ /**
+ * This adds Separators for editor additions to the tool bar.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void contributeToToolBar(IToolBarManager toolBarManager) {
+ toolBarManager.add(new Separator("resource-settings"));
+ toolBarManager.add(new Separator("resource-additions"));
+ }
+
+ /**
+ * This adds to the menu bar a menu and some separators for editor additions,
+ * as well as the sub-menus for object creation items.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void contributeToMenu(IMenuManager menuManager) {
+ super.contributeToMenu(menuManager);
+
+ IMenuManager submenuManager = new MenuManager(ResourceEditorPlugin.INSTANCE.getString("_UI_ResourceEditor_menu"), "org.eclipse.sensinact.studio.resourceMenuID");
+ menuManager.insertAfter("additions", submenuManager);
+ submenuManager.add(new Separator("settings"));
+ submenuManager.add(new Separator("actions"));
+ submenuManager.add(new Separator("additions"));
+ submenuManager.add(new Separator("additions-end"));
+
+ // Prepare for CreateChild item addition or removal.
+ //
+ createChildMenuManager = new MenuManager(ResourceEditorPlugin.INSTANCE.getString("_UI_CreateChild_menu_item"));
+ submenuManager.insertBefore("additions", createChildMenuManager);
+
+ // Prepare for CreateSibling item addition or removal.
+ //
+ createSiblingMenuManager = new MenuManager(ResourceEditorPlugin.INSTANCE.getString("_UI_CreateSibling_menu_item"));
+ submenuManager.insertBefore("additions", createSiblingMenuManager);
+
+ // Force an update because Eclipse hides empty menus now.
+ //
+ submenuManager.addMenuListener
+ (new IMenuListener() {
+ public void menuAboutToShow(IMenuManager menuManager) {
+ menuManager.updateAll(true);
+ }
+ });
+
+ addGlobalActions(submenuManager);
+ }
+
+ /**
+ * When the active editor changes, this remembers the change and registers with it as a selection provider.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void setActiveEditor(IEditorPart part) {
+ super.setActiveEditor(part);
+ activeEditorPart = part;
+
+ // Switch to the new selection provider.
+ //
+ if (selectionProvider != null) {
+ selectionProvider.removeSelectionChangedListener(this);
+ }
+ if (part == null) {
+ selectionProvider = null;
+ }
+ else {
+ selectionProvider = part.getSite().getSelectionProvider();
+ selectionProvider.addSelectionChangedListener(this);
+
+ // Fake a selection changed event to update the menus.
+ //
+ if (selectionProvider.getSelection() != null) {
+ selectionChanged(new SelectionChangedEvent(selectionProvider, selectionProvider.getSelection()));
+ }
+ }
+ }
+
+ /**
+ * This implements {@link org.eclipse.jface.viewers.ISelectionChangedListener},
+ * handling {@link org.eclipse.jface.viewers.SelectionChangedEvent}s by querying for the children and siblings
+ * that can be added to the selected object and updating the menus accordingly.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void selectionChanged(SelectionChangedEvent event) {
+ // Remove any menu items for old selection.
+ //
+ if (createChildMenuManager != null) {
+ depopulateManager(createChildMenuManager, createChildActions);
+ }
+ if (createSiblingMenuManager != null) {
+ depopulateManager(createSiblingMenuManager, createSiblingActions);
+ }
+
+ // Query the new selection for appropriate new child/sibling descriptors
+ //
+ Collection<?> newChildDescriptors = null;
+ Collection<?> newSiblingDescriptors = null;
+
+ ISelection selection = event.getSelection();
+ if (selection instanceof IStructuredSelection && ((IStructuredSelection)selection).size() == 1) {
+ Object object = ((IStructuredSelection)selection).getFirstElement();
+
+ EditingDomain domain = ((IEditingDomainProvider)activeEditorPart).getEditingDomain();
+
+ newChildDescriptors = domain.getNewChildDescriptors(object, null);
+ newSiblingDescriptors = domain.getNewChildDescriptors(null, object);
+ }
+
+ // Generate actions for selection; populate and redraw the menus.
+ //
+ createChildActions = generateCreateChildActions(newChildDescriptors, selection);
+ createSiblingActions = generateCreateSiblingActions(newSiblingDescriptors, selection);
+
+ if (createChildMenuManager != null) {
+ populateManager(createChildMenuManager, createChildActions, null);
+ createChildMenuManager.update(true);
+ }
+ if (createSiblingMenuManager != null) {
+ populateManager(createSiblingMenuManager, createSiblingActions, null);
+ createSiblingMenuManager.update(true);
+ }
+ }
+
+ /**
+ * This generates a {@link org.eclipse.emf.edit.ui.action.CreateChildAction} for each object in <code>descriptors</code>,
+ * and returns the collection of these actions.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected Collection<IAction> generateCreateChildActions(Collection<?> descriptors, ISelection selection) {
+ Collection<IAction> actions = new ArrayList<IAction>();
+ if (descriptors != null) {
+ for (Object descriptor : descriptors) {
+ actions.add(new CreateChildAction(activeEditorPart, selection, descriptor));
+ }
+ }
+ return actions;
+ }
+
+ /**
+ * This generates a {@link org.eclipse.emf.edit.ui.action.CreateSiblingAction} for each object in <code>descriptors</code>,
+ * and returns the collection of these actions.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected Collection<IAction> generateCreateSiblingActions(Collection<?> descriptors, ISelection selection) {
+ Collection<IAction> actions = new ArrayList<IAction>();
+ if (descriptors != null) {
+ for (Object descriptor : descriptors) {
+ actions.add(new CreateSiblingAction(activeEditorPart, selection, descriptor));
+ }
+ }
+ return actions;
+ }
+
+ /**
+ * This populates the specified <code>manager</code> with {@link org.eclipse.jface.action.ActionContributionItem}s
+ * based on the {@link org.eclipse.jface.action.IAction}s contained in the <code>actions</code> collection,
+ * by inserting them before the specified contribution item <code>contributionID</code>.
+ * If <code>contributionID</code> is <code>null</code>, they are simply added.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected void populateManager(IContributionManager manager, Collection<? extends IAction> actions, String contributionID) {
+ if (actions != null) {
+ for (IAction action : actions) {
+ if (contributionID != null) {
+ manager.insertBefore(contributionID, action);
+ }
+ else {
+ manager.add(action);
+ }
+ }
+ }
+ }
+
+ /**
+ * This removes from the specified <code>manager</code> all {@link org.eclipse.jface.action.ActionContributionItem}s
+ * based on the {@link org.eclipse.jface.action.IAction}s contained in the <code>actions</code> collection.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected void depopulateManager(IContributionManager manager, Collection<? extends IAction> actions) {
+ if (actions != null) {
+ IContributionItem[] items = manager.getItems();
+ for (int i = 0; i < items.length; i++) {
+ // Look into SubContributionItems
+ //
+ IContributionItem contributionItem = items[i];
+ while (contributionItem instanceof SubContributionItem) {
+ contributionItem = ((SubContributionItem)contributionItem).getInnerItem();
+ }
+
+ // Delete the ActionContributionItems with matching action.
+ //
+ if (contributionItem instanceof ActionContributionItem) {
+ IAction action = ((ActionContributionItem)contributionItem).getAction();
+ if (actions.contains(action)) {
+ manager.remove(contributionItem);
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * This populates the pop-up menu before it appears.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void menuAboutToShow(IMenuManager menuManager) {
+ super.menuAboutToShow(menuManager);
+ MenuManager submenuManager = null;
+
+ submenuManager = new MenuManager(ResourceEditorPlugin.INSTANCE.getString("_UI_CreateChild_menu_item"));
+ populateManager(submenuManager, createChildActions, null);
+ menuManager.insertBefore("edit", submenuManager);
+
+ submenuManager = new MenuManager(ResourceEditorPlugin.INSTANCE.getString("_UI_CreateSibling_menu_item"));
+ populateManager(submenuManager, createSiblingActions, null);
+ menuManager.insertBefore("edit", submenuManager);
+ }
+
+ /**
+ * This inserts global actions before the "additions-end" separator.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected void addGlobalActions(IMenuManager menuManager) {
+ menuManager.insertAfter("additions-end", new Separator("ui-actions"));
+ menuManager.insertAfter("ui-actions", showPropertiesViewAction);
+
+ refreshViewerAction.setEnabled(refreshViewerAction.isEnabled());
+ menuManager.insertAfter("ui-actions", refreshViewerAction);
+
+ super.addGlobalActions(menuManager);
+ }
+
+ /**
+ * This ensures that a delete action will clean up all references to deleted objects.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected boolean removeAllReferencesOnDelete() {
+ return true;
+ }
+
+}
diff --git a/services/org.eclipse.sensinact.studio.model.resource.editor/src/org/eclipse/sensinact/studio/resource/presentation/ResourceEditor.java b/services/org.eclipse.sensinact.studio.model.resource.editor/src/org/eclipse/sensinact/studio/resource/presentation/ResourceEditor.java
new file mode 100644
index 0000000..38b7955
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.editor/src/org/eclipse/sensinact/studio/resource/presentation/ResourceEditor.java
@@ -0,0 +1,1826 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource.presentation;
+
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.EventObject;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IMarker;
+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.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.NullProgressMonitor;
+
+import org.eclipse.jface.action.IMenuListener;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.IStatusLineManager;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.action.Separator;
+
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.dialogs.ProgressMonitorDialog;
+
+import org.eclipse.jface.util.LocalSelectionTransfer;
+
+import org.eclipse.jface.viewers.ColumnWeightData;
+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.ListViewer;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.jface.viewers.TableLayout;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.Viewer;
+
+import org.eclipse.swt.SWT;
+
+import org.eclipse.swt.custom.CTabFolder;
+
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.FileTransfer;
+import org.eclipse.swt.dnd.Transfer;
+
+import org.eclipse.swt.events.ControlAdapter;
+import org.eclipse.swt.events.ControlEvent;
+
+import org.eclipse.swt.graphics.Point;
+
+import org.eclipse.swt.layout.FillLayout;
+
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.swt.widgets.TreeColumn;
+
+import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IEditorSite;
+import org.eclipse.ui.IPartListener;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.PartInitException;
+
+import org.eclipse.ui.dialogs.SaveAsDialog;
+
+import org.eclipse.ui.ide.IGotoMarker;
+
+import org.eclipse.ui.part.FileEditorInput;
+import org.eclipse.ui.part.MultiPageEditorPart;
+
+import org.eclipse.ui.views.contentoutline.ContentOutline;
+import org.eclipse.ui.views.contentoutline.ContentOutlinePage;
+import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
+
+import org.eclipse.ui.views.properties.IPropertySheetPage;
+import org.eclipse.ui.views.properties.PropertySheet;
+import org.eclipse.ui.views.properties.PropertySheetPage;
+
+import org.eclipse.emf.common.command.BasicCommandStack;
+import org.eclipse.emf.common.command.Command;
+import org.eclipse.emf.common.command.CommandStack;
+import org.eclipse.emf.common.command.CommandStackListener;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.common.ui.MarkerHelper;
+import org.eclipse.emf.common.ui.ViewerPane;
+
+import org.eclipse.emf.common.ui.editor.ProblemEditorPart;
+
+import org.eclipse.emf.common.ui.viewer.IViewerProvider;
+
+import org.eclipse.emf.common.util.BasicDiagnostic;
+import org.eclipse.emf.common.util.Diagnostic;
+import org.eclipse.emf.common.util.URI;
+
+
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+
+import org.eclipse.emf.ecore.util.EContentAdapter;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+
+import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
+import org.eclipse.emf.edit.domain.EditingDomain;
+import org.eclipse.emf.edit.domain.IEditingDomainProvider;
+
+import org.eclipse.emf.edit.provider.AdapterFactoryItemDelegator;
+import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
+import org.eclipse.emf.edit.provider.ReflectiveItemProviderAdapterFactory;
+
+import org.eclipse.emf.edit.provider.resource.ResourceItemProviderAdapterFactory;
+
+import org.eclipse.emf.edit.ui.action.EditingDomainActionBarContributor;
+
+import org.eclipse.emf.edit.ui.celleditor.AdapterFactoryTreeEditor;
+
+import org.eclipse.emf.edit.ui.dnd.EditingDomainViewerDropAdapter;
+import org.eclipse.emf.edit.ui.dnd.LocalTransfer;
+import org.eclipse.emf.edit.ui.dnd.ViewerDragAdapter;
+
+import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
+import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
+import org.eclipse.emf.edit.ui.provider.UnwrappingSelectionProvider;
+
+import org.eclipse.emf.edit.ui.util.EditUIMarkerHelper;
+import org.eclipse.emf.edit.ui.util.EditUIUtil;
+
+import org.eclipse.emf.edit.ui.view.ExtendedPropertySheetPage;
+import org.eclipse.ui.actions.WorkspaceModifyOperation;
+
+
+/**
+ * This is an example of a Resource model editor.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class ResourceEditor
+ extends MultiPageEditorPart
+ implements IEditingDomainProvider, ISelectionProvider, IMenuListener, IViewerProvider, IGotoMarker {
+ /**
+ * This keeps track of the editing domain that is used to track all changes to the model.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected AdapterFactoryEditingDomain editingDomain;
+
+ /**
+ * This is the one adapter factory used for providing views of the model.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected ComposedAdapterFactory adapterFactory;
+
+ /**
+ * This is the content outline page.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected IContentOutlinePage contentOutlinePage;
+
+ /**
+ * This is a kludge...
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected IStatusLineManager contentOutlineStatusLineManager;
+
+ /**
+ * This is the content outline page's viewer.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected TreeViewer contentOutlineViewer;
+
+ /**
+ * This is the property sheet page.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected List<PropertySheetPage> propertySheetPages = new ArrayList<PropertySheetPage>();
+
+ /**
+ * This is the viewer that shadows the selection in the content outline.
+ * The parent relation must be correctly defined for this to work.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected TreeViewer selectionViewer;
+
+ /**
+ * This inverts the roll of parent and child in the content provider and show parents as a tree.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected TreeViewer parentViewer;
+
+ /**
+ * This shows how a tree view works.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected TreeViewer treeViewer;
+
+ /**
+ * This shows how a list view works.
+ * A list viewer doesn't support icons.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected ListViewer listViewer;
+
+ /**
+ * This shows how a table view works.
+ * A table can be used as a list with icons.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected TableViewer tableViewer;
+
+ /**
+ * This shows how a tree view with columns works.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected TreeViewer treeViewerWithColumns;
+
+ /**
+ * This keeps track of the active viewer pane, in the book.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected ViewerPane currentViewerPane;
+
+ /**
+ * This keeps track of the active content viewer, which may be either one of the viewers in the pages or the content outline viewer.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected Viewer currentViewer;
+
+ /**
+ * This listens to which ever viewer is active.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected ISelectionChangedListener selectionChangedListener;
+
+ /**
+ * This keeps track of all the {@link org.eclipse.jface.viewers.ISelectionChangedListener}s that are listening to this editor.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected Collection<ISelectionChangedListener> selectionChangedListeners = new ArrayList<ISelectionChangedListener>();
+
+ /**
+ * This keeps track of the selection of the editor as a whole.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected ISelection editorSelection = StructuredSelection.EMPTY;
+
+ /**
+ * The MarkerHelper is responsible for creating workspace resource markers presented
+ * in Eclipse's Problems View.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected MarkerHelper markerHelper = new EditUIMarkerHelper();
+
+ /**
+ * This listens for when the outline becomes active
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected IPartListener partListener =
+ new IPartListener() {
+ public void partActivated(IWorkbenchPart p) {
+ if (p instanceof ContentOutline) {
+ if (((ContentOutline)p).getCurrentPage() == contentOutlinePage) {
+ getActionBarContributor().setActiveEditor(ResourceEditor.this);
+
+ setCurrentViewer(contentOutlineViewer);
+ }
+ }
+ else if (p instanceof PropertySheet) {
+ if (propertySheetPages.contains(((PropertySheet)p).getCurrentPage())) {
+ getActionBarContributor().setActiveEditor(ResourceEditor.this);
+ handleActivate();
+ }
+ }
+ else if (p == ResourceEditor.this) {
+ handleActivate();
+ }
+ }
+ public void partBroughtToTop(IWorkbenchPart p) {
+ // Ignore.
+ }
+ public void partClosed(IWorkbenchPart p) {
+ // Ignore.
+ }
+ public void partDeactivated(IWorkbenchPart p) {
+ // Ignore.
+ }
+ public void partOpened(IWorkbenchPart p) {
+ // Ignore.
+ }
+ };
+
+ /**
+ * Resources that have been removed since last activation.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected Collection<Resource> removedResources = new ArrayList<Resource>();
+
+ /**
+ * Resources that have been changed since last activation.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected Collection<Resource> changedResources = new ArrayList<Resource>();
+
+ /**
+ * Resources that have been saved.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected Collection<Resource> savedResources = new ArrayList<Resource>();
+
+ /**
+ * Map to store the diagnostic associated with a resource.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected Map<Resource, Diagnostic> resourceToDiagnosticMap = new LinkedHashMap<Resource, Diagnostic>();
+
+ /**
+ * Controls whether the problem indication should be updated.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected boolean updateProblemIndication = true;
+
+ /**
+ * Adapter used to update the problem indication when resources are demanded loaded.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected EContentAdapter problemIndicationAdapter =
+ new EContentAdapter() {
+ @Override
+ public void notifyChanged(Notification notification) {
+ if (notification.getNotifier() instanceof Resource) {
+ switch (notification.getFeatureID(Resource.class)) {
+ case Resource.RESOURCE__IS_LOADED:
+ case Resource.RESOURCE__ERRORS:
+ case Resource.RESOURCE__WARNINGS: {
+ Resource resource = (Resource)notification.getNotifier();
+ Diagnostic diagnostic = analyzeResourceProblems(resource, null);
+ if (diagnostic.getSeverity() != Diagnostic.OK) {
+ resourceToDiagnosticMap.put(resource, diagnostic);
+ }
+ else {
+ resourceToDiagnosticMap.remove(resource);
+ }
+
+ if (updateProblemIndication) {
+ getSite().getShell().getDisplay().asyncExec
+ (new Runnable() {
+ public void run() {
+ updateProblemIndication();
+ }
+ });
+ }
+ break;
+ }
+ }
+ }
+ else {
+ super.notifyChanged(notification);
+ }
+ }
+
+ @Override
+ protected void setTarget(Resource target) {
+ basicSetTarget(target);
+ }
+
+ @Override
+ protected void unsetTarget(Resource target) {
+ basicUnsetTarget(target);
+ resourceToDiagnosticMap.remove(target);
+ if (updateProblemIndication) {
+ getSite().getShell().getDisplay().asyncExec
+ (new Runnable() {
+ public void run() {
+ updateProblemIndication();
+ }
+ });
+ }
+ }
+ };
+
+ /**
+ * This listens for workspace changes.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected IResourceChangeListener resourceChangeListener =
+ new IResourceChangeListener() {
+ public void resourceChanged(IResourceChangeEvent event) {
+ IResourceDelta delta = event.getDelta();
+ try {
+ class ResourceDeltaVisitor implements IResourceDeltaVisitor {
+ protected ResourceSet resourceSet = editingDomain.getResourceSet();
+ protected Collection<Resource> changedResources = new ArrayList<Resource>();
+ protected Collection<Resource> removedResources = new ArrayList<Resource>();
+
+ public boolean visit(IResourceDelta delta) {
+ if (delta.getResource().getType() == IResource.FILE) {
+ if (delta.getKind() == IResourceDelta.REMOVED ||
+ delta.getKind() == IResourceDelta.CHANGED && delta.getFlags() != IResourceDelta.MARKERS) {
+ Resource resource = resourceSet.getResource(URI.createPlatformResourceURI(delta.getFullPath().toString(), true), false);
+ if (resource != null) {
+ if (delta.getKind() == IResourceDelta.REMOVED) {
+ removedResources.add(resource);
+ }
+ else if (!savedResources.remove(resource)) {
+ changedResources.add(resource);
+ }
+ }
+ }
+ return false;
+ }
+
+ return true;
+ }
+
+ public Collection<Resource> getChangedResources() {
+ return changedResources;
+ }
+
+ public Collection<Resource> getRemovedResources() {
+ return removedResources;
+ }
+ }
+
+ final ResourceDeltaVisitor visitor = new ResourceDeltaVisitor();
+ delta.accept(visitor);
+
+ if (!visitor.getRemovedResources().isEmpty()) {
+ getSite().getShell().getDisplay().asyncExec
+ (new Runnable() {
+ public void run() {
+ removedResources.addAll(visitor.getRemovedResources());
+ if (!isDirty()) {
+ getSite().getPage().closeEditor(ResourceEditor.this, false);
+ }
+ }
+ });
+ }
+
+ if (!visitor.getChangedResources().isEmpty()) {
+ getSite().getShell().getDisplay().asyncExec
+ (new Runnable() {
+ public void run() {
+ changedResources.addAll(visitor.getChangedResources());
+ if (getSite().getPage().getActiveEditor() == ResourceEditor.this) {
+ handleActivate();
+ }
+ }
+ });
+ }
+ }
+ catch (CoreException exception) {
+ ResourceEditorPlugin.INSTANCE.log(exception);
+ }
+ }
+ };
+
+ /**
+ * Handles activation of the editor or it's associated views.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected void handleActivate() {
+ // Recompute the read only state.
+ //
+ if (editingDomain.getResourceToReadOnlyMap() != null) {
+ editingDomain.getResourceToReadOnlyMap().clear();
+
+ // Refresh any actions that may become enabled or disabled.
+ //
+ setSelection(getSelection());
+ }
+
+ if (!removedResources.isEmpty()) {
+ if (handleDirtyConflict()) {
+ getSite().getPage().closeEditor(ResourceEditor.this, false);
+ }
+ else {
+ removedResources.clear();
+ changedResources.clear();
+ savedResources.clear();
+ }
+ }
+ else if (!changedResources.isEmpty()) {
+ changedResources.removeAll(savedResources);
+ handleChangedResources();
+ changedResources.clear();
+ savedResources.clear();
+ }
+ }
+
+ /**
+ * Handles what to do with changed resources on activation.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected void handleChangedResources() {
+ if (!changedResources.isEmpty() && (!isDirty() || handleDirtyConflict())) {
+ if (isDirty()) {
+ changedResources.addAll(editingDomain.getResourceSet().getResources());
+ }
+ editingDomain.getCommandStack().flush();
+
+ updateProblemIndication = false;
+ for (Resource resource : changedResources) {
+ if (resource.isLoaded()) {
+ resource.unload();
+ try {
+ resource.load(Collections.EMPTY_MAP);
+ }
+ catch (IOException exception) {
+ if (!resourceToDiagnosticMap.containsKey(resource)) {
+ resourceToDiagnosticMap.put(resource, analyzeResourceProblems(resource, exception));
+ }
+ }
+ }
+ }
+
+ if (AdapterFactoryEditingDomain.isStale(editorSelection)) {
+ setSelection(StructuredSelection.EMPTY);
+ }
+
+ updateProblemIndication = true;
+ updateProblemIndication();
+ }
+ }
+
+ /**
+ * Updates the problems indication with the information described in the specified diagnostic.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected void updateProblemIndication() {
+ if (updateProblemIndication) {
+ BasicDiagnostic diagnostic =
+ new BasicDiagnostic
+ (Diagnostic.OK,
+ "org.eclipse.sensinact.studio.model.resource.editor",
+ 0,
+ null,
+ new Object [] { editingDomain.getResourceSet() });
+ for (Diagnostic childDiagnostic : resourceToDiagnosticMap.values()) {
+ if (childDiagnostic.getSeverity() != Diagnostic.OK) {
+ diagnostic.add(childDiagnostic);
+ }
+ }
+
+ int lastEditorPage = getPageCount() - 1;
+ if (lastEditorPage >= 0 && getEditor(lastEditorPage) instanceof ProblemEditorPart) {
+ ((ProblemEditorPart)getEditor(lastEditorPage)).setDiagnostic(diagnostic);
+ if (diagnostic.getSeverity() != Diagnostic.OK) {
+ setActivePage(lastEditorPage);
+ }
+ }
+ else if (diagnostic.getSeverity() != Diagnostic.OK) {
+ ProblemEditorPart problemEditorPart = new ProblemEditorPart();
+ problemEditorPart.setDiagnostic(diagnostic);
+ problemEditorPart.setMarkerHelper(markerHelper);
+ try {
+ addPage(++lastEditorPage, problemEditorPart, getEditorInput());
+ setPageText(lastEditorPage, problemEditorPart.getPartName());
+ setActivePage(lastEditorPage);
+ showTabs();
+ }
+ catch (PartInitException exception) {
+ ResourceEditorPlugin.INSTANCE.log(exception);
+ }
+ }
+
+ if (markerHelper.hasMarkers(editingDomain.getResourceSet())) {
+ markerHelper.deleteMarkers(editingDomain.getResourceSet());
+ if (diagnostic.getSeverity() != Diagnostic.OK) {
+ try {
+ markerHelper.createMarkers(diagnostic);
+ }
+ catch (CoreException exception) {
+ ResourceEditorPlugin.INSTANCE.log(exception);
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Shows a dialog that asks if conflicting changes should be discarded.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected boolean handleDirtyConflict() {
+ return
+ MessageDialog.openQuestion
+ (getSite().getShell(),
+ getString("_UI_FileConflict_label"),
+ getString("_WARN_FileConflict"));
+ }
+
+ /**
+ * This creates a model editor.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public ResourceEditor() {
+ super();
+ initializeEditingDomain();
+ }
+
+ /**
+ * This sets up the editing domain for the model editor.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected void initializeEditingDomain() {
+ // Create an adapter factory that yields item providers.
+ //
+ adapterFactory = new ComposedAdapterFactory(ComposedAdapterFactory.Descriptor.Registry.INSTANCE);
+
+ adapterFactory.addAdapterFactory(new ResourceItemProviderAdapterFactory());
+ adapterFactory.addAdapterFactory(new ResourceItemProviderAdapterFactory());
+ adapterFactory.addAdapterFactory(new ReflectiveItemProviderAdapterFactory());
+
+ // Create the command stack that will notify this editor as commands are executed.
+ //
+ BasicCommandStack commandStack = new BasicCommandStack();
+
+ // Add a listener to set the most recent command's affected objects to be the selection of the viewer with focus.
+ //
+ commandStack.addCommandStackListener
+ (new CommandStackListener() {
+ public void commandStackChanged(final EventObject event) {
+ getContainer().getDisplay().asyncExec
+ (new Runnable() {
+ public void run() {
+ firePropertyChange(IEditorPart.PROP_DIRTY);
+
+ // Try to select the affected objects.
+ //
+ Command mostRecentCommand = ((CommandStack)event.getSource()).getMostRecentCommand();
+ if (mostRecentCommand != null) {
+ setSelectionToViewer(mostRecentCommand.getAffectedObjects());
+ }
+ for (Iterator<PropertySheetPage> i = propertySheetPages.iterator(); i.hasNext(); ) {
+ PropertySheetPage propertySheetPage = i.next();
+ if (propertySheetPage.getControl().isDisposed()) {
+ i.remove();
+ }
+ else {
+ propertySheetPage.refresh();
+ }
+ }
+ }
+ });
+ }
+ });
+
+ // Create the editing domain with a special command stack.
+ //
+ editingDomain = new AdapterFactoryEditingDomain(adapterFactory, commandStack, new HashMap<Resource, Boolean>());
+ }
+
+ /**
+ * This is here for the listener to be able to call it.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected void firePropertyChange(int action) {
+ super.firePropertyChange(action);
+ }
+
+ /**
+ * This sets the selection into whichever viewer is active.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setSelectionToViewer(Collection<?> collection) {
+ final Collection<?> theSelection = collection;
+ // Make sure it's okay.
+ //
+ if (theSelection != null && !theSelection.isEmpty()) {
+ Runnable runnable =
+ new Runnable() {
+ public void run() {
+ // Try to select the items in the current content viewer of the editor.
+ //
+ if (currentViewer != null) {
+ currentViewer.setSelection(new StructuredSelection(theSelection.toArray()), true);
+ }
+ }
+ };
+ getSite().getShell().getDisplay().asyncExec(runnable);
+ }
+ }
+
+ /**
+ * This returns the editing domain as required by the {@link IEditingDomainProvider} interface.
+ * This is important for implementing the static methods of {@link AdapterFactoryEditingDomain}
+ * and for supporting {@link org.eclipse.emf.edit.ui.action.CommandAction}.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EditingDomain getEditingDomain() {
+ return editingDomain;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public class ReverseAdapterFactoryContentProvider extends AdapterFactoryContentProvider {
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public ReverseAdapterFactoryContentProvider(AdapterFactory adapterFactory) {
+ super(adapterFactory);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Object [] getElements(Object object) {
+ Object parent = super.getParent(object);
+ return (parent == null ? Collections.EMPTY_SET : Collections.singleton(parent)).toArray();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Object [] getChildren(Object object) {
+ Object parent = super.getParent(object);
+ return (parent == null ? Collections.EMPTY_SET : Collections.singleton(parent)).toArray();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public boolean hasChildren(Object object) {
+ Object parent = super.getParent(object);
+ return parent != null;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Object getParent(Object object) {
+ return null;
+ }
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setCurrentViewerPane(ViewerPane viewerPane) {
+ if (currentViewerPane != viewerPane) {
+ if (currentViewerPane != null) {
+ currentViewerPane.showFocus(false);
+ }
+ currentViewerPane = viewerPane;
+ }
+ setCurrentViewer(currentViewerPane.getViewer());
+ }
+
+ /**
+ * This makes sure that one content viewer, either for the current page or the outline view, if it has focus,
+ * is the current one.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setCurrentViewer(Viewer viewer) {
+ // If it is changing...
+ //
+ if (currentViewer != viewer) {
+ if (selectionChangedListener == null) {
+ // Create the listener on demand.
+ //
+ selectionChangedListener =
+ new ISelectionChangedListener() {
+ // This just notifies those things that are affected by the section.
+ //
+ public void selectionChanged(SelectionChangedEvent selectionChangedEvent) {
+ setSelection(selectionChangedEvent.getSelection());
+ }
+ };
+ }
+
+ // Stop listening to the old one.
+ //
+ if (currentViewer != null) {
+ currentViewer.removeSelectionChangedListener(selectionChangedListener);
+ }
+
+ // Start listening to the new one.
+ //
+ if (viewer != null) {
+ viewer.addSelectionChangedListener(selectionChangedListener);
+ }
+
+ // Remember it.
+ //
+ currentViewer = viewer;
+
+ // Set the editors selection based on the current viewer's selection.
+ //
+ setSelection(currentViewer == null ? StructuredSelection.EMPTY : currentViewer.getSelection());
+ }
+ }
+
+ /**
+ * This returns the viewer as required by the {@link IViewerProvider} interface.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public Viewer getViewer() {
+ return currentViewer;
+ }
+
+ /**
+ * This creates a context menu for the viewer and adds a listener as well registering the menu for extension.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected void createContextMenuFor(StructuredViewer viewer) {
+ MenuManager contextMenu = new MenuManager("#PopUp");
+ contextMenu.add(new Separator("additions"));
+ contextMenu.setRemoveAllWhenShown(true);
+ contextMenu.addMenuListener(this);
+ Menu menu= contextMenu.createContextMenu(viewer.getControl());
+ viewer.getControl().setMenu(menu);
+ getSite().registerContextMenu(contextMenu, new UnwrappingSelectionProvider(viewer));
+
+ int dndOperations = DND.DROP_COPY | DND.DROP_MOVE | DND.DROP_LINK;
+ Transfer[] transfers = new Transfer[] { LocalTransfer.getInstance(), LocalSelectionTransfer.getTransfer(), FileTransfer.getInstance() };
+ viewer.addDragSupport(dndOperations, transfers, new ViewerDragAdapter(viewer));
+ viewer.addDropSupport(dndOperations, transfers, new EditingDomainViewerDropAdapter(editingDomain, viewer));
+ }
+
+ /**
+ * This is the method called to load a resource into the editing domain's resource set based on the editor's input.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void createModel() {
+ URI resourceURI = EditUIUtil.getURI(getEditorInput(), editingDomain.getResourceSet().getURIConverter());
+ Exception exception = null;
+ Resource resource = null;
+ try {
+ // Load the resource through the editing domain.
+ //
+ resource = editingDomain.getResourceSet().getResource(resourceURI, true);
+ }
+ catch (Exception e) {
+ exception = e;
+ resource = editingDomain.getResourceSet().getResource(resourceURI, false);
+ }
+
+ Diagnostic diagnostic = analyzeResourceProblems(resource, exception);
+ if (diagnostic.getSeverity() != Diagnostic.OK) {
+ resourceToDiagnosticMap.put(resource, analyzeResourceProblems(resource, exception));
+ }
+ editingDomain.getResourceSet().eAdapters().add(problemIndicationAdapter);
+ }
+
+ /**
+ * Returns a diagnostic describing the errors and warnings listed in the resource
+ * and the specified exception (if any).
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public Diagnostic analyzeResourceProblems(Resource resource, Exception exception) {
+ boolean hasErrors = !resource.getErrors().isEmpty();
+ if (hasErrors || !resource.getWarnings().isEmpty()) {
+ BasicDiagnostic basicDiagnostic =
+ new BasicDiagnostic
+ (hasErrors ? Diagnostic.ERROR : Diagnostic.WARNING,
+ "org.eclipse.sensinact.studio.model.resource.editor",
+ 0,
+ getString("_UI_CreateModelError_message", resource.getURI()),
+ new Object [] { exception == null ? (Object)resource : exception });
+ basicDiagnostic.merge(EcoreUtil.computeDiagnostic(resource, true));
+ return basicDiagnostic;
+ }
+ else if (exception != null) {
+ return
+ new BasicDiagnostic
+ (Diagnostic.ERROR,
+ "org.eclipse.sensinact.studio.model.resource.editor",
+ 0,
+ getString("_UI_CreateModelError_message", resource.getURI()),
+ new Object[] { exception });
+ }
+ else {
+ return Diagnostic.OK_INSTANCE;
+ }
+ }
+
+ /**
+ * This is the method used by the framework to install your own controls.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void createPages() {
+ // Creates the model from the editor input
+ //
+ createModel();
+
+ // Only creates the other pages if there is something that can be edited
+ //
+ if (!getEditingDomain().getResourceSet().getResources().isEmpty()) {
+ // Create a page for the selection tree view.
+ //
+ {
+ ViewerPane viewerPane =
+ new ViewerPane(getSite().getPage(), ResourceEditor.this) {
+ @Override
+ public Viewer createViewer(Composite composite) {
+ Tree tree = new Tree(composite, SWT.MULTI);
+ TreeViewer newTreeViewer = new TreeViewer(tree);
+ return newTreeViewer;
+ }
+ @Override
+ public void requestActivation() {
+ super.requestActivation();
+ setCurrentViewerPane(this);
+ }
+ };
+ viewerPane.createControl(getContainer());
+
+ selectionViewer = (TreeViewer)viewerPane.getViewer();
+ selectionViewer.setContentProvider(new AdapterFactoryContentProvider(adapterFactory));
+
+ selectionViewer.setLabelProvider(new AdapterFactoryLabelProvider(adapterFactory));
+ selectionViewer.setInput(editingDomain.getResourceSet());
+ selectionViewer.setSelection(new StructuredSelection(editingDomain.getResourceSet().getResources().get(0)), true);
+ viewerPane.setTitle(editingDomain.getResourceSet());
+
+ new AdapterFactoryTreeEditor(selectionViewer.getTree(), adapterFactory);
+
+ createContextMenuFor(selectionViewer);
+ int pageIndex = addPage(viewerPane.getControl());
+ setPageText(pageIndex, getString("_UI_SelectionPage_label"));
+ }
+
+ // Create a page for the parent tree view.
+ //
+ {
+ ViewerPane viewerPane =
+ new ViewerPane(getSite().getPage(), ResourceEditor.this) {
+ @Override
+ public Viewer createViewer(Composite composite) {
+ Tree tree = new Tree(composite, SWT.MULTI);
+ TreeViewer newTreeViewer = new TreeViewer(tree);
+ return newTreeViewer;
+ }
+ @Override
+ public void requestActivation() {
+ super.requestActivation();
+ setCurrentViewerPane(this);
+ }
+ };
+ viewerPane.createControl(getContainer());
+
+ parentViewer = (TreeViewer)viewerPane.getViewer();
+ parentViewer.setAutoExpandLevel(30);
+ parentViewer.setContentProvider(new ReverseAdapterFactoryContentProvider(adapterFactory));
+ parentViewer.setLabelProvider(new AdapterFactoryLabelProvider(adapterFactory));
+
+ createContextMenuFor(parentViewer);
+ int pageIndex = addPage(viewerPane.getControl());
+ setPageText(pageIndex, getString("_UI_ParentPage_label"));
+ }
+
+ // This is the page for the list viewer
+ //
+ {
+ ViewerPane viewerPane =
+ new ViewerPane(getSite().getPage(), ResourceEditor.this) {
+ @Override
+ public Viewer createViewer(Composite composite) {
+ return new ListViewer(composite);
+ }
+ @Override
+ public void requestActivation() {
+ super.requestActivation();
+ setCurrentViewerPane(this);
+ }
+ };
+ viewerPane.createControl(getContainer());
+ listViewer = (ListViewer)viewerPane.getViewer();
+ listViewer.setContentProvider(new AdapterFactoryContentProvider(adapterFactory));
+ listViewer.setLabelProvider(new AdapterFactoryLabelProvider(adapterFactory));
+
+ createContextMenuFor(listViewer);
+ int pageIndex = addPage(viewerPane.getControl());
+ setPageText(pageIndex, getString("_UI_ListPage_label"));
+ }
+
+ // This is the page for the tree viewer
+ //
+ {
+ ViewerPane viewerPane =
+ new ViewerPane(getSite().getPage(), ResourceEditor.this) {
+ @Override
+ public Viewer createViewer(Composite composite) {
+ return new TreeViewer(composite);
+ }
+ @Override
+ public void requestActivation() {
+ super.requestActivation();
+ setCurrentViewerPane(this);
+ }
+ };
+ viewerPane.createControl(getContainer());
+ treeViewer = (TreeViewer)viewerPane.getViewer();
+ treeViewer.setContentProvider(new AdapterFactoryContentProvider(adapterFactory));
+ treeViewer.setLabelProvider(new AdapterFactoryLabelProvider(adapterFactory));
+
+ new AdapterFactoryTreeEditor(treeViewer.getTree(), adapterFactory);
+
+ createContextMenuFor(treeViewer);
+ int pageIndex = addPage(viewerPane.getControl());
+ setPageText(pageIndex, getString("_UI_TreePage_label"));
+ }
+
+ // This is the page for the table viewer.
+ //
+ {
+ ViewerPane viewerPane =
+ new ViewerPane(getSite().getPage(), ResourceEditor.this) {
+ @Override
+ public Viewer createViewer(Composite composite) {
+ return new TableViewer(composite);
+ }
+ @Override
+ public void requestActivation() {
+ super.requestActivation();
+ setCurrentViewerPane(this);
+ }
+ };
+ viewerPane.createControl(getContainer());
+ tableViewer = (TableViewer)viewerPane.getViewer();
+
+ Table table = tableViewer.getTable();
+ TableLayout layout = new TableLayout();
+ table.setLayout(layout);
+ table.setHeaderVisible(true);
+ table.setLinesVisible(true);
+
+ TableColumn objectColumn = new TableColumn(table, SWT.NONE);
+ layout.addColumnData(new ColumnWeightData(3, 100, true));
+ objectColumn.setText(getString("_UI_ObjectColumn_label"));
+ objectColumn.setResizable(true);
+
+ TableColumn selfColumn = new TableColumn(table, SWT.NONE);
+ layout.addColumnData(new ColumnWeightData(2, 100, true));
+ selfColumn.setText(getString("_UI_SelfColumn_label"));
+ selfColumn.setResizable(true);
+
+ tableViewer.setColumnProperties(new String [] {"a", "b"});
+ tableViewer.setContentProvider(new AdapterFactoryContentProvider(adapterFactory));
+ tableViewer.setLabelProvider(new AdapterFactoryLabelProvider(adapterFactory));
+
+ createContextMenuFor(tableViewer);
+ int pageIndex = addPage(viewerPane.getControl());
+ setPageText(pageIndex, getString("_UI_TablePage_label"));
+ }
+
+ // This is the page for the table tree viewer.
+ //
+ {
+ ViewerPane viewerPane =
+ new ViewerPane(getSite().getPage(), ResourceEditor.this) {
+ @Override
+ public Viewer createViewer(Composite composite) {
+ return new TreeViewer(composite);
+ }
+ @Override
+ public void requestActivation() {
+ super.requestActivation();
+ setCurrentViewerPane(this);
+ }
+ };
+ viewerPane.createControl(getContainer());
+
+ treeViewerWithColumns = (TreeViewer)viewerPane.getViewer();
+
+ Tree tree = treeViewerWithColumns.getTree();
+ tree.setLayoutData(new FillLayout());
+ tree.setHeaderVisible(true);
+ tree.setLinesVisible(true);
+
+ TreeColumn objectColumn = new TreeColumn(tree, SWT.NONE);
+ objectColumn.setText(getString("_UI_ObjectColumn_label"));
+ objectColumn.setResizable(true);
+ objectColumn.setWidth(250);
+
+ TreeColumn selfColumn = new TreeColumn(tree, SWT.NONE);
+ selfColumn.setText(getString("_UI_SelfColumn_label"));
+ selfColumn.setResizable(true);
+ selfColumn.setWidth(200);
+
+ treeViewerWithColumns.setColumnProperties(new String [] {"a", "b"});
+ treeViewerWithColumns.setContentProvider(new AdapterFactoryContentProvider(adapterFactory));
+ treeViewerWithColumns.setLabelProvider(new AdapterFactoryLabelProvider(adapterFactory));
+
+ createContextMenuFor(treeViewerWithColumns);
+ int pageIndex = addPage(viewerPane.getControl());
+ setPageText(pageIndex, getString("_UI_TreeWithColumnsPage_label"));
+ }
+
+ getSite().getShell().getDisplay().asyncExec
+ (new Runnable() {
+ public void run() {
+ setActivePage(0);
+ }
+ });
+ }
+
+ // Ensures that this editor will only display the page's tab
+ // area if there are more than one page
+ //
+ getContainer().addControlListener
+ (new ControlAdapter() {
+ boolean guard = false;
+ @Override
+ public void controlResized(ControlEvent event) {
+ if (!guard) {
+ guard = true;
+ hideTabs();
+ guard = false;
+ }
+ }
+ });
+
+ getSite().getShell().getDisplay().asyncExec
+ (new Runnable() {
+ public void run() {
+ updateProblemIndication();
+ }
+ });
+ }
+
+ /**
+ * If there is just one page in the multi-page editor part,
+ * this hides the single tab at the bottom.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected void hideTabs() {
+ if (getPageCount() <= 1) {
+ setPageText(0, "");
+ if (getContainer() instanceof CTabFolder) {
+ ((CTabFolder)getContainer()).setTabHeight(1);
+ Point point = getContainer().getSize();
+ getContainer().setSize(point.x, point.y + 6);
+ }
+ }
+ }
+
+ /**
+ * If there is more than one page in the multi-page editor part,
+ * this shows the tabs at the bottom.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected void showTabs() {
+ if (getPageCount() > 1) {
+ setPageText(0, getString("_UI_SelectionPage_label"));
+ if (getContainer() instanceof CTabFolder) {
+ ((CTabFolder)getContainer()).setTabHeight(SWT.DEFAULT);
+ Point point = getContainer().getSize();
+ getContainer().setSize(point.x, point.y - 6);
+ }
+ }
+ }
+
+ /**
+ * This is used to track the active viewer.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected void pageChange(int pageIndex) {
+ super.pageChange(pageIndex);
+
+ if (contentOutlinePage != null) {
+ handleContentOutlineSelection(contentOutlinePage.getSelection());
+ }
+ }
+
+ /**
+ * This is how the framework determines which interfaces we implement.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @SuppressWarnings("rawtypes")
+ @Override
+ public Object getAdapter(Class key) {
+ if (key.equals(IContentOutlinePage.class)) {
+ return showOutlineView() ? getContentOutlinePage() : null;
+ }
+ else if (key.equals(IPropertySheetPage.class)) {
+ return getPropertySheetPage();
+ }
+ else if (key.equals(IGotoMarker.class)) {
+ return this;
+ }
+ else {
+ return super.getAdapter(key);
+ }
+ }
+
+ /**
+ * This accesses a cached version of the content outliner.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public IContentOutlinePage getContentOutlinePage() {
+ if (contentOutlinePage == null) {
+ // The content outline is just a tree.
+ //
+ class MyContentOutlinePage extends ContentOutlinePage {
+ @Override
+ public void createControl(Composite parent) {
+ super.createControl(parent);
+ contentOutlineViewer = getTreeViewer();
+ contentOutlineViewer.addSelectionChangedListener(this);
+
+ // Set up the tree viewer.
+ //
+ contentOutlineViewer.setContentProvider(new AdapterFactoryContentProvider(adapterFactory));
+ contentOutlineViewer.setLabelProvider(new AdapterFactoryLabelProvider(adapterFactory));
+ contentOutlineViewer.setInput(editingDomain.getResourceSet());
+
+ // Make sure our popups work.
+ //
+ createContextMenuFor(contentOutlineViewer);
+
+ if (!editingDomain.getResourceSet().getResources().isEmpty()) {
+ // Select the root object in the view.
+ //
+ contentOutlineViewer.setSelection(new StructuredSelection(editingDomain.getResourceSet().getResources().get(0)), true);
+ }
+ }
+
+ @Override
+ public void makeContributions(IMenuManager menuManager, IToolBarManager toolBarManager, IStatusLineManager statusLineManager) {
+ super.makeContributions(menuManager, toolBarManager, statusLineManager);
+ contentOutlineStatusLineManager = statusLineManager;
+ }
+
+ @Override
+ public void setActionBars(IActionBars actionBars) {
+ super.setActionBars(actionBars);
+ getActionBarContributor().shareGlobalActions(this, actionBars);
+ }
+ }
+
+ contentOutlinePage = new MyContentOutlinePage();
+
+ // Listen to selection so that we can handle it is a special way.
+ //
+ contentOutlinePage.addSelectionChangedListener
+ (new ISelectionChangedListener() {
+ // This ensures that we handle selections correctly.
+ //
+ public void selectionChanged(SelectionChangedEvent event) {
+ handleContentOutlineSelection(event.getSelection());
+ }
+ });
+ }
+
+ return contentOutlinePage;
+ }
+
+ /**
+ * This accesses a cached version of the property sheet.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public IPropertySheetPage getPropertySheetPage() {
+ PropertySheetPage propertySheetPage =
+ new ExtendedPropertySheetPage(editingDomain) {
+ @Override
+ public void setSelectionToViewer(List<?> selection) {
+ ResourceEditor.this.setSelectionToViewer(selection);
+ ResourceEditor.this.setFocus();
+ }
+
+ @Override
+ public void setActionBars(IActionBars actionBars) {
+ super.setActionBars(actionBars);
+ getActionBarContributor().shareGlobalActions(this, actionBars);
+ }
+ };
+ propertySheetPage.setPropertySourceProvider(new AdapterFactoryContentProvider(adapterFactory));
+ propertySheetPages.add(propertySheetPage);
+
+ return propertySheetPage;
+ }
+
+ /**
+ * This deals with how we want selection in the outliner to affect the other views.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void handleContentOutlineSelection(ISelection selection) {
+ if (currentViewerPane != null && !selection.isEmpty() && selection instanceof IStructuredSelection) {
+ Iterator<?> selectedElements = ((IStructuredSelection)selection).iterator();
+ if (selectedElements.hasNext()) {
+ // Get the first selected element.
+ //
+ Object selectedElement = selectedElements.next();
+
+ // If it's the selection viewer, then we want it to select the same selection as this selection.
+ //
+ if (currentViewerPane.getViewer() == selectionViewer) {
+ ArrayList<Object> selectionList = new ArrayList<Object>();
+ selectionList.add(selectedElement);
+ while (selectedElements.hasNext()) {
+ selectionList.add(selectedElements.next());
+ }
+
+ // Set the selection to the widget.
+ //
+ selectionViewer.setSelection(new StructuredSelection(selectionList));
+ }
+ else {
+ // Set the input to the widget.
+ //
+ if (currentViewerPane.getViewer().getInput() != selectedElement) {
+ currentViewerPane.getViewer().setInput(selectedElement);
+ currentViewerPane.setTitle(selectedElement);
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * This is for implementing {@link IEditorPart} and simply tests the command stack.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public boolean isDirty() {
+ return ((BasicCommandStack)editingDomain.getCommandStack()).isSaveNeeded();
+ }
+
+ /**
+ * This is for implementing {@link IEditorPart} and simply saves the model file.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void doSave(IProgressMonitor progressMonitor) {
+ // Save only resources that have actually changed.
+ //
+ final Map<Object, Object> saveOptions = new HashMap<Object, Object>();
+ saveOptions.put(Resource.OPTION_SAVE_ONLY_IF_CHANGED, Resource.OPTION_SAVE_ONLY_IF_CHANGED_MEMORY_BUFFER);
+ saveOptions.put(Resource.OPTION_LINE_DELIMITER, Resource.OPTION_LINE_DELIMITER_UNSPECIFIED);
+
+ // Do the work within an operation because this is a long running activity that modifies the workbench.
+ //
+ WorkspaceModifyOperation operation =
+ new WorkspaceModifyOperation() {
+ // This is the method that gets invoked when the operation runs.
+ //
+ @Override
+ public void execute(IProgressMonitor monitor) {
+ // Save the resources to the file system.
+ //
+ boolean first = true;
+ for (Resource resource : editingDomain.getResourceSet().getResources()) {
+ if ((first || !resource.getContents().isEmpty() || isPersisted(resource)) && !editingDomain.isReadOnly(resource)) {
+ try {
+ long timeStamp = resource.getTimeStamp();
+ resource.save(saveOptions);
+ if (resource.getTimeStamp() != timeStamp) {
+ savedResources.add(resource);
+ }
+ }
+ catch (Exception exception) {
+ resourceToDiagnosticMap.put(resource, analyzeResourceProblems(resource, exception));
+ }
+ first = false;
+ }
+ }
+ }
+ };
+
+ updateProblemIndication = false;
+ try {
+ // This runs the options, and shows progress.
+ //
+ new ProgressMonitorDialog(getSite().getShell()).run(true, false, operation);
+
+ // Refresh the necessary state.
+ //
+ ((BasicCommandStack)editingDomain.getCommandStack()).saveIsDone();
+ firePropertyChange(IEditorPart.PROP_DIRTY);
+ }
+ catch (Exception exception) {
+ // Something went wrong that shouldn't.
+ //
+ ResourceEditorPlugin.INSTANCE.log(exception);
+ }
+ updateProblemIndication = true;
+ updateProblemIndication();
+ }
+
+ /**
+ * This returns whether something has been persisted to the URI of the specified resource.
+ * The implementation uses the URI converter from the editor's resource set to try to open an input stream.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected boolean isPersisted(Resource resource) {
+ boolean result = false;
+ try {
+ InputStream stream = editingDomain.getResourceSet().getURIConverter().createInputStream(resource.getURI());
+ if (stream != null) {
+ result = true;
+ stream.close();
+ }
+ }
+ catch (IOException e) {
+ // Ignore
+ }
+ return result;
+ }
+
+ /**
+ * This always returns true because it is not currently supported.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public boolean isSaveAsAllowed() {
+ return true;
+ }
+
+ /**
+ * This also changes the editor's input.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void doSaveAs() {
+ SaveAsDialog saveAsDialog = new SaveAsDialog(getSite().getShell());
+ saveAsDialog.open();
+ IPath path = saveAsDialog.getResult();
+ if (path != null) {
+ IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(path);
+ if (file != null) {
+ doSaveAs(URI.createPlatformResourceURI(file.getFullPath().toString(), true), new FileEditorInput(file));
+ }
+ }
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected void doSaveAs(URI uri, IEditorInput editorInput) {
+ (editingDomain.getResourceSet().getResources().get(0)).setURI(uri);
+ setInputWithNotify(editorInput);
+ setPartName(editorInput.getName());
+ IProgressMonitor progressMonitor =
+ getActionBars().getStatusLineManager() != null ?
+ getActionBars().getStatusLineManager().getProgressMonitor() :
+ new NullProgressMonitor();
+ doSave(progressMonitor);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void gotoMarker(IMarker marker) {
+ List<?> targetObjects = markerHelper.getTargetObjects(editingDomain, marker);
+ if (!targetObjects.isEmpty()) {
+ setSelectionToViewer(targetObjects);
+ }
+ }
+
+ /**
+ * This is called during startup.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void init(IEditorSite site, IEditorInput editorInput) {
+ setSite(site);
+ setInputWithNotify(editorInput);
+ setPartName(editorInput.getName());
+ site.setSelectionProvider(this);
+ site.getPage().addPartListener(partListener);
+ ResourcesPlugin.getWorkspace().addResourceChangeListener(resourceChangeListener, IResourceChangeEvent.POST_CHANGE);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void setFocus() {
+ if (currentViewerPane != null) {
+ currentViewerPane.setFocus();
+ }
+ else {
+ getControl(getActivePage()).setFocus();
+ }
+ }
+
+ /**
+ * This implements {@link org.eclipse.jface.viewers.ISelectionProvider}.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void addSelectionChangedListener(ISelectionChangedListener listener) {
+ selectionChangedListeners.add(listener);
+ }
+
+ /**
+ * This implements {@link org.eclipse.jface.viewers.ISelectionProvider}.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void removeSelectionChangedListener(ISelectionChangedListener listener) {
+ selectionChangedListeners.remove(listener);
+ }
+
+ /**
+ * This implements {@link org.eclipse.jface.viewers.ISelectionProvider} to return this editor's overall selection.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public ISelection getSelection() {
+ return editorSelection;
+ }
+
+ /**
+ * This implements {@link org.eclipse.jface.viewers.ISelectionProvider} to set this editor's overall selection.
+ * Calling this result will notify the listeners.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setSelection(ISelection selection) {
+ editorSelection = selection;
+
+ for (ISelectionChangedListener listener : selectionChangedListeners) {
+ listener.selectionChanged(new SelectionChangedEvent(this, selection));
+ }
+ setStatusLineManager(selection);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setStatusLineManager(ISelection selection) {
+ IStatusLineManager statusLineManager = currentViewer != null && currentViewer == contentOutlineViewer ?
+ contentOutlineStatusLineManager : getActionBars().getStatusLineManager();
+
+ if (statusLineManager != null) {
+ if (selection instanceof IStructuredSelection) {
+ Collection<?> collection = ((IStructuredSelection)selection).toList();
+ switch (collection.size()) {
+ case 0: {
+ statusLineManager.setMessage(getString("_UI_NoObjectSelected"));
+ break;
+ }
+ case 1: {
+ String text = new AdapterFactoryItemDelegator(adapterFactory).getText(collection.iterator().next());
+ statusLineManager.setMessage(getString("_UI_SingleObjectSelected", text));
+ break;
+ }
+ default: {
+ statusLineManager.setMessage(getString("_UI_MultiObjectSelected", Integer.toString(collection.size())));
+ break;
+ }
+ }
+ }
+ else {
+ statusLineManager.setMessage("");
+ }
+ }
+ }
+
+ /**
+ * This looks up a string in the plugin's plugin.properties file.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ private static String getString(String key) {
+ return ResourceEditorPlugin.INSTANCE.getString(key);
+ }
+
+ /**
+ * This looks up a string in plugin.properties, making a substitution.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ private static String getString(String key, Object s1) {
+ return ResourceEditorPlugin.INSTANCE.getString(key, new Object [] { s1 });
+ }
+
+ /**
+ * This implements {@link org.eclipse.jface.action.IMenuListener} to help fill the context menus with contributions from the Edit menu.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void menuAboutToShow(IMenuManager menuManager) {
+ ((IMenuListener)getEditorSite().getActionBarContributor()).menuAboutToShow(menuManager);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EditingDomainActionBarContributor getActionBarContributor() {
+ return (EditingDomainActionBarContributor)getEditorSite().getActionBarContributor();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public IActionBars getActionBars() {
+ return getActionBarContributor().getActionBars();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public AdapterFactory getAdapterFactory() {
+ return adapterFactory;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void dispose() {
+ updateProblemIndication = false;
+
+ ResourcesPlugin.getWorkspace().removeResourceChangeListener(resourceChangeListener);
+
+ getSite().getPage().removePartListener(partListener);
+
+ adapterFactory.dispose();
+
+ if (getActionBarContributor().getActiveEditor() == this) {
+ getActionBarContributor().setActiveEditor(null);
+ }
+
+ for (PropertySheetPage propertySheetPage : propertySheetPages) {
+ propertySheetPage.dispose();
+ }
+
+ if (contentOutlinePage != null) {
+ contentOutlinePage.dispose();
+ }
+
+ super.dispose();
+ }
+
+ /**
+ * Returns whether the outline view should be presented to the user.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected boolean showOutlineView() {
+ return true;
+ }
+}
diff --git a/services/org.eclipse.sensinact.studio.model.resource.editor/src/org/eclipse/sensinact/studio/resource/presentation/ResourceEditorPlugin.java b/services/org.eclipse.sensinact.studio.model.resource.editor/src/org/eclipse/sensinact/studio/resource/presentation/ResourceEditorPlugin.java
new file mode 100644
index 0000000..3bd0467
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.editor/src/org/eclipse/sensinact/studio/resource/presentation/ResourceEditorPlugin.java
@@ -0,0 +1,101 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource.presentation;
+
+import org.eclipse.emf.common.EMFPlugin;
+
+import org.eclipse.emf.common.ui.EclipseUIPlugin;
+
+import org.eclipse.emf.common.util.ResourceLocator;
+
+/**
+ * This is the central singleton for the Resource editor plugin.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public final class ResourceEditorPlugin extends EMFPlugin {
+ /**
+ * Keep track of the singleton.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public static final ResourceEditorPlugin INSTANCE = new ResourceEditorPlugin();
+
+ /**
+ * Keep track of the singleton.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ private static Implementation plugin;
+
+ /**
+ * Create the instance.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public ResourceEditorPlugin() {
+ super
+ (new ResourceLocator [] {
+ });
+ }
+
+ /**
+ * Returns the singleton instance of the Eclipse plugin.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the singleton instance.
+ * @generated
+ */
+ @Override
+ public ResourceLocator getPluginResourceLocator() {
+ return plugin;
+ }
+
+ /**
+ * Returns the singleton instance of the Eclipse plugin.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the singleton instance.
+ * @generated
+ */
+ public static Implementation getPlugin() {
+ return plugin;
+ }
+
+ /**
+ * The actual implementation of the Eclipse <b>Plugin</b>.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public static class Implementation extends EclipseUIPlugin {
+ /**
+ * Creates an instance.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public Implementation() {
+ super();
+
+ // Remember the static instance.
+ //
+ plugin = this;
+ }
+ }
+
+}
diff --git a/services/org.eclipse.sensinact.studio.model.resource.editor/src/org/eclipse/sensinact/studio/resource/presentation/ResourceModelWizard.java b/services/org.eclipse.sensinact.studio.model.resource.editor/src/org/eclipse/sensinact/studio/resource/presentation/ResourceModelWizard.java
new file mode 100644
index 0000000..19d5aac
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.editor/src/org/eclipse/sensinact/studio/resource/presentation/ResourceModelWizard.java
@@ -0,0 +1,637 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource.presentation;
+
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.MissingResourceException;
+import java.util.StringTokenizer;
+
+import org.eclipse.emf.common.CommonPlugin;
+
+import org.eclipse.emf.common.util.URI;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EClassifier;
+
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+
+import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
+
+import org.eclipse.emf.ecore.EObject;
+
+import org.eclipse.emf.ecore.xmi.XMLResource;
+
+import org.eclipse.emf.edit.ui.provider.ExtendedImageRegistry;
+
+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.IResource;
+import org.eclipse.core.resources.ResourcesPlugin;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+
+import org.eclipse.jface.dialogs.MessageDialog;
+
+import org.eclipse.jface.viewers.IStructuredSelection;
+
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.jface.wizard.WizardPage;
+
+import org.eclipse.swt.SWT;
+
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.ModifyEvent;
+
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+
+import org.eclipse.ui.INewWizard;
+import org.eclipse.ui.IWorkbench;
+
+import org.eclipse.ui.actions.WorkspaceModifyOperation;
+
+import org.eclipse.ui.dialogs.WizardNewFileCreationPage;
+
+import org.eclipse.ui.part.FileEditorInput;
+import org.eclipse.ui.part.ISetSelectionTarget;
+
+import org.eclipse.sensinact.studio.resource.ResourceFactory;
+import org.eclipse.sensinact.studio.resource.ResourcePackage;
+import org.eclipse.sensinact.studio.resource.provider.ResourceEditPlugin;
+
+
+import org.eclipse.core.runtime.Path;
+
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PartInitException;
+
+
+/**
+ * This is a simple wizard for creating a new model file.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class ResourceModelWizard extends Wizard implements INewWizard {
+ /**
+ * The supported extensions for created files.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public static final List<String> FILE_EXTENSIONS =
+ Collections.unmodifiableList(Arrays.asList(ResourceEditorPlugin.INSTANCE.getString("_UI_ResourceEditorFilenameExtensions").split("\\s*,\\s*")));
+
+ /**
+ * A formatted list of supported file extensions, suitable for display.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public static final String FORMATTED_FILE_EXTENSIONS =
+ ResourceEditorPlugin.INSTANCE.getString("_UI_ResourceEditorFilenameExtensions").replaceAll("\\s*,\\s*", ", ");
+
+ /**
+ * This caches an instance of the model package.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected ResourcePackage resourcePackage = ResourcePackage.eINSTANCE;
+
+ /**
+ * This caches an instance of the model factory.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected ResourceFactory resourceFactory = resourcePackage.getResourceFactory();
+
+ /**
+ * This is the file creation page.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected ResourceModelWizardNewFileCreationPage newFileCreationPage;
+
+ /**
+ * This is the initial object creation page.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected ResourceModelWizardInitialObjectCreationPage initialObjectCreationPage;
+
+ /**
+ * Remember the selection during initialization for populating the default container.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected IStructuredSelection selection;
+
+ /**
+ * Remember the workbench during initialization.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected IWorkbench workbench;
+
+ /**
+ * Caches the names of the types that can be created as the root object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected List<String> initialObjectNames;
+
+ /**
+ * This just records the information.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void init(IWorkbench workbench, IStructuredSelection selection) {
+ this.workbench = workbench;
+ this.selection = selection;
+ setWindowTitle(ResourceEditorPlugin.INSTANCE.getString("_UI_Wizard_label"));
+ setDefaultPageImageDescriptor(ExtendedImageRegistry.INSTANCE.getImageDescriptor(ResourceEditorPlugin.INSTANCE.getImage("full/wizban/NewResource")));
+ }
+
+ /**
+ * Returns the names of the types that can be created as the root object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected Collection<String> getInitialObjectNames() {
+ if (initialObjectNames == null) {
+ initialObjectNames = new ArrayList<String>();
+ for (EClassifier eClassifier : resourcePackage.getEClassifiers()) {
+ if (eClassifier instanceof EClass) {
+ EClass eClass = (EClass)eClassifier;
+ if (!eClass.isAbstract()) {
+ initialObjectNames.add(eClass.getName());
+ }
+ }
+ }
+ Collections.sort(initialObjectNames, CommonPlugin.INSTANCE.getComparator());
+ }
+ return initialObjectNames;
+ }
+
+ /**
+ * Create a new model.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected EObject createInitialModel() {
+ EClass eClass = (EClass)resourcePackage.getEClassifier(initialObjectCreationPage.getInitialObjectName());
+ EObject rootObject = resourceFactory.create(eClass);
+ return rootObject;
+ }
+
+ /**
+ * Do the work after everything is specified.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public boolean performFinish() {
+ try {
+ // Remember the file.
+ //
+ final IFile modelFile = getModelFile();
+
+ // Do the work within an operation.
+ //
+ WorkspaceModifyOperation operation =
+ new WorkspaceModifyOperation() {
+ @Override
+ protected void execute(IProgressMonitor progressMonitor) {
+ try {
+ // Create a resource set
+ //
+ ResourceSet resourceSet = new ResourceSetImpl();
+
+ // Get the URI of the model file.
+ //
+ URI fileURI = URI.createPlatformResourceURI(modelFile.getFullPath().toString(), true);
+
+ // Create a resource for this file.
+ //
+ Resource resource = resourceSet.createResource(fileURI);
+
+ // Add the initial model object to the contents.
+ //
+ EObject rootObject = createInitialModel();
+ if (rootObject != null) {
+ resource.getContents().add(rootObject);
+ }
+
+ // Save the contents of the resource to the file system.
+ //
+ Map<Object, Object> options = new HashMap<Object, Object>();
+ options.put(XMLResource.OPTION_ENCODING, initialObjectCreationPage.getEncoding());
+ resource.save(options);
+ }
+ catch (Exception exception) {
+ ResourceEditorPlugin.INSTANCE.log(exception);
+ }
+ finally {
+ progressMonitor.done();
+ }
+ }
+ };
+
+ getContainer().run(false, false, operation);
+
+ // Select the new file resource in the current view.
+ //
+ IWorkbenchWindow workbenchWindow = workbench.getActiveWorkbenchWindow();
+ IWorkbenchPage page = workbenchWindow.getActivePage();
+ final IWorkbenchPart activePart = page.getActivePart();
+ if (activePart instanceof ISetSelectionTarget) {
+ final ISelection targetSelection = new StructuredSelection(modelFile);
+ getShell().getDisplay().asyncExec
+ (new Runnable() {
+ public void run() {
+ ((ISetSelectionTarget)activePart).selectReveal(targetSelection);
+ }
+ });
+ }
+
+ // Open an editor on the new file.
+ //
+ try {
+ page.openEditor
+ (new FileEditorInput(modelFile),
+ workbench.getEditorRegistry().getDefaultEditor(modelFile.getFullPath().toString()).getId());
+ }
+ catch (PartInitException exception) {
+ MessageDialog.openError(workbenchWindow.getShell(), ResourceEditorPlugin.INSTANCE.getString("_UI_OpenEditorError_label"), exception.getMessage());
+ return false;
+ }
+
+ return true;
+ }
+ catch (Exception exception) {
+ ResourceEditorPlugin.INSTANCE.log(exception);
+ return false;
+ }
+ }
+
+ /**
+ * This is the one page of the wizard.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public class ResourceModelWizardNewFileCreationPage extends WizardNewFileCreationPage {
+ /**
+ * Pass in the selection.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public ResourceModelWizardNewFileCreationPage(String pageId, IStructuredSelection selection) {
+ super(pageId, selection);
+ }
+
+ /**
+ * The framework calls this to see if the file is correct.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected boolean validatePage() {
+ if (super.validatePage()) {
+ String extension = new Path(getFileName()).getFileExtension();
+ if (extension == null || !FILE_EXTENSIONS.contains(extension)) {
+ String key = FILE_EXTENSIONS.size() > 1 ? "_WARN_FilenameExtensions" : "_WARN_FilenameExtension";
+ setErrorMessage(ResourceEditorPlugin.INSTANCE.getString(key, new Object [] { FORMATTED_FILE_EXTENSIONS }));
+ return false;
+ }
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public IFile getModelFile() {
+ return ResourcesPlugin.getWorkspace().getRoot().getFile(getContainerFullPath().append(getFileName()));
+ }
+ }
+
+ /**
+ * This is the page where the type of object to create is selected.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public class ResourceModelWizardInitialObjectCreationPage extends WizardPage {
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected Combo initialObjectField;
+
+ /**
+ * @generated
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ */
+ protected List<String> encodings;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected Combo encodingField;
+
+ /**
+ * Pass in the selection.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public ResourceModelWizardInitialObjectCreationPage(String pageId) {
+ super(pageId);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void createControl(Composite parent) {
+ Composite composite = new Composite(parent, SWT.NONE); {
+ GridLayout layout = new GridLayout();
+ layout.numColumns = 1;
+ layout.verticalSpacing = 12;
+ composite.setLayout(layout);
+
+ GridData data = new GridData();
+ data.verticalAlignment = GridData.FILL;
+ data.grabExcessVerticalSpace = true;
+ data.horizontalAlignment = GridData.FILL;
+ composite.setLayoutData(data);
+ }
+
+ Label containerLabel = new Label(composite, SWT.LEFT);
+ {
+ containerLabel.setText(ResourceEditorPlugin.INSTANCE.getString("_UI_ModelObject"));
+
+ GridData data = new GridData();
+ data.horizontalAlignment = GridData.FILL;
+ containerLabel.setLayoutData(data);
+ }
+
+ initialObjectField = new Combo(composite, SWT.BORDER);
+ {
+ GridData data = new GridData();
+ data.horizontalAlignment = GridData.FILL;
+ data.grabExcessHorizontalSpace = true;
+ initialObjectField.setLayoutData(data);
+ }
+
+ for (String objectName : getInitialObjectNames()) {
+ initialObjectField.add(getLabel(objectName));
+ }
+
+ if (initialObjectField.getItemCount() == 1) {
+ initialObjectField.select(0);
+ }
+ initialObjectField.addModifyListener(validator);
+
+ Label encodingLabel = new Label(composite, SWT.LEFT);
+ {
+ encodingLabel.setText(ResourceEditorPlugin.INSTANCE.getString("_UI_XMLEncoding"));
+
+ GridData data = new GridData();
+ data.horizontalAlignment = GridData.FILL;
+ encodingLabel.setLayoutData(data);
+ }
+ encodingField = new Combo(composite, SWT.BORDER);
+ {
+ GridData data = new GridData();
+ data.horizontalAlignment = GridData.FILL;
+ data.grabExcessHorizontalSpace = true;
+ encodingField.setLayoutData(data);
+ }
+
+ for (String encoding : getEncodings()) {
+ encodingField.add(encoding);
+ }
+
+ encodingField.select(0);
+ encodingField.addModifyListener(validator);
+
+ setPageComplete(validatePage());
+ setControl(composite);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected ModifyListener validator =
+ new ModifyListener() {
+ public void modifyText(ModifyEvent e) {
+ setPageComplete(validatePage());
+ }
+ };
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected boolean validatePage() {
+ return getInitialObjectName() != null && getEncodings().contains(encodingField.getText());
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void setVisible(boolean visible) {
+ super.setVisible(visible);
+ if (visible) {
+ if (initialObjectField.getItemCount() == 1) {
+ initialObjectField.clearSelection();
+ encodingField.setFocus();
+ }
+ else {
+ encodingField.clearSelection();
+ initialObjectField.setFocus();
+ }
+ }
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public String getInitialObjectName() {
+ String label = initialObjectField.getText();
+
+ for (String name : getInitialObjectNames()) {
+ if (getLabel(name).equals(label)) {
+ return name;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public String getEncoding() {
+ return encodingField.getText();
+ }
+
+ /**
+ * Returns the label for the specified type name.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected String getLabel(String typeName) {
+ try {
+ return ResourceEditPlugin.INSTANCE.getString("_UI_" + typeName + "_type");
+ }
+ catch(MissingResourceException mre) {
+ ResourceEditorPlugin.INSTANCE.log(mre);
+ }
+ return typeName;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected Collection<String> getEncodings() {
+ if (encodings == null) {
+ encodings = new ArrayList<String>();
+ for (StringTokenizer stringTokenizer = new StringTokenizer(ResourceEditorPlugin.INSTANCE.getString("_UI_XMLEncodingChoices")); stringTokenizer.hasMoreTokens(); ) {
+ encodings.add(stringTokenizer.nextToken());
+ }
+ }
+ return encodings;
+ }
+ }
+
+ /**
+ * The framework calls this to create the contents of the wizard.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void addPages() {
+ // Create a page, set the title, and the initial model file name.
+ //
+ newFileCreationPage = new ResourceModelWizardNewFileCreationPage("Whatever", selection);
+ newFileCreationPage.setTitle(ResourceEditorPlugin.INSTANCE.getString("_UI_ResourceModelWizard_label"));
+ newFileCreationPage.setDescription(ResourceEditorPlugin.INSTANCE.getString("_UI_ResourceModelWizard_description"));
+ newFileCreationPage.setFileName(ResourceEditorPlugin.INSTANCE.getString("_UI_ResourceEditorFilenameDefaultBase") + "." + FILE_EXTENSIONS.get(0));
+ addPage(newFileCreationPage);
+
+ // Try and get the resource selection to determine a current directory for the file dialog.
+ //
+ if (selection != null && !selection.isEmpty()) {
+ // Get the resource...
+ //
+ Object selectedElement = selection.iterator().next();
+ if (selectedElement instanceof IResource) {
+ // Get the resource parent, if its a file.
+ //
+ IResource selectedResource = (IResource)selectedElement;
+ if (selectedResource.getType() == IResource.FILE) {
+ selectedResource = selectedResource.getParent();
+ }
+
+ // This gives us a directory...
+ //
+ if (selectedResource instanceof IFolder || selectedResource instanceof IProject) {
+ // Set this for the container.
+ //
+ newFileCreationPage.setContainerFullPath(selectedResource.getFullPath());
+
+ // Make up a unique new name here.
+ //
+ String defaultModelBaseFilename = ResourceEditorPlugin.INSTANCE.getString("_UI_ResourceEditorFilenameDefaultBase");
+ String defaultModelFilenameExtension = FILE_EXTENSIONS.get(0);
+ String modelFilename = defaultModelBaseFilename + "." + defaultModelFilenameExtension;
+ for (int i = 1; ((IContainer)selectedResource).findMember(modelFilename) != null; ++i) {
+ modelFilename = defaultModelBaseFilename + i + "." + defaultModelFilenameExtension;
+ }
+ newFileCreationPage.setFileName(modelFilename);
+ }
+ }
+ }
+ initialObjectCreationPage = new ResourceModelWizardInitialObjectCreationPage("Whatever2");
+ initialObjectCreationPage.setTitle(ResourceEditorPlugin.INSTANCE.getString("_UI_ResourceModelWizard_label"));
+ initialObjectCreationPage.setDescription(ResourceEditorPlugin.INSTANCE.getString("_UI_Wizard_initial_object_description"));
+ addPage(initialObjectCreationPage);
+ }
+
+ /**
+ * Get the file from the page.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public IFile getModelFile() {
+ return newFileCreationPage.getModelFile();
+ }
+
+}
diff --git a/services/org.eclipse.sensinact.studio.model.resource.tests/META-INF/MANIFEST.MF b/services/org.eclipse.sensinact.studio.model.resource.tests/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..330af72
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.tests/META-INF/MANIFEST.MF
@@ -0,0 +1,15 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-SymbolicName: org.eclipse.sensinact.studio.model.resource.tests;singleton:=true
+Bundle-Version: 1.0.0.qualifier
+Bundle-ClassPath: .
+Bundle-Vendor: %providerName
+Bundle-Localization: plugin
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Export-Package: org.eclipse.sensinact.studio.resource.tests
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.sensinact.studio.model.resource;visibility:=reexport,
+ org.eclipse.emf.ecore.xmi;visibility:=reexport,
+ org.junit;visibility:=reexport
+Bundle-ActivationPolicy: lazy
diff --git a/services/org.eclipse.sensinact.studio.model.resource.tests/about.html b/services/org.eclipse.sensinact.studio.model.resource.tests/about.html
new file mode 100644
index 0000000..3b39f88
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.tests/about.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"><head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 5, 2006</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+
+</body></html>
\ No newline at end of file
diff --git a/services/org.eclipse.sensinact.studio.model.resource.tests/build.properties b/services/org.eclipse.sensinact.studio.model.resource.tests/build.properties
new file mode 100644
index 0000000..6586009
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.tests/build.properties
@@ -0,0 +1,19 @@
+#
+# Copyright (c) 2017 CEA.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+# CEA - initial API and implementation and/or initial documentation
+#
+
+#
+
+bin.includes = .,\
+ META-INF/,\
+ plugin.properties
+jars.compile.order = .
+source.. = src/
+output.. = bin/
diff --git a/services/org.eclipse.sensinact.studio.model.resource.tests/plugin.properties b/services/org.eclipse.sensinact.studio.model.resource.tests/plugin.properties
new file mode 100644
index 0000000..b5a7fd9
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.tests/plugin.properties
@@ -0,0 +1,15 @@
+#
+# Copyright (c) 2017 CEA.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+# CEA - initial API and implementation and/or initial documentation
+#
+
+#
+
+pluginName = Resource Tests
+providerName = www.example.org
diff --git a/services/org.eclipse.sensinact.studio.model.resource.tests/src/org/eclipse/sensinact/studio/resource/tests/AccessMethodTest.java b/services/org.eclipse.sensinact.studio.model.resource.tests/src/org/eclipse/sensinact/studio/resource/tests/AccessMethodTest.java
new file mode 100644
index 0000000..bcf1b41
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.tests/src/org/eclipse/sensinact/studio/resource/tests/AccessMethodTest.java
@@ -0,0 +1,99 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource.tests;
+
+import junit.framework.TestCase;
+
+import junit.textui.TestRunner;
+
+import org.eclipse.sensinact.studio.resource.AccessMethod;
+import org.eclipse.sensinact.studio.resource.ResourceFactory;
+
+/**
+ * <!-- begin-user-doc -->
+ * A test case for the model object '<em><b>Access Method</b></em>'.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class AccessMethodTest extends TestCase {
+
+ /**
+ * The fixture for this Access Method test case.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected AccessMethod fixture = null;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public static void main(String[] args) {
+ TestRunner.run(AccessMethodTest.class);
+ }
+
+ /**
+ * Constructs a new Access Method test case with the given name.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public AccessMethodTest(String name) {
+ super(name);
+ }
+
+ /**
+ * Sets the fixture for this Access Method test case.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected void setFixture(AccessMethod fixture) {
+ this.fixture = fixture;
+ }
+
+ /**
+ * Returns the fixture for this Access Method test case.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected AccessMethod getFixture() {
+ return fixture;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see junit.framework.TestCase#setUp()
+ * @generated
+ */
+ @Override
+ protected void setUp() throws Exception {
+ setFixture(ResourceFactory.eINSTANCE.createAccessMethod());
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see junit.framework.TestCase#tearDown()
+ * @generated
+ */
+ @Override
+ protected void tearDown() throws Exception {
+ setFixture(null);
+ }
+
+} //AccessMethodTest
diff --git a/services/org.eclipse.sensinact.studio.model.resource.tests/src/org/eclipse/sensinact/studio/resource/tests/ActionTest.java b/services/org.eclipse.sensinact.studio.model.resource.tests/src/org/eclipse/sensinact/studio/resource/tests/ActionTest.java
new file mode 100644
index 0000000..784ee68
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.tests/src/org/eclipse/sensinact/studio/resource/tests/ActionTest.java
@@ -0,0 +1,80 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource.tests;
+
+import junit.textui.TestRunner;
+
+import org.eclipse.sensinact.studio.resource.Action;
+import org.eclipse.sensinact.studio.resource.ResourceFactory;
+
+/**
+ * <!-- begin-user-doc -->
+ * A test case for the model object '<em><b>Action</b></em>'.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class ActionTest extends ResourceTest {
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public static void main(String[] args) {
+ TestRunner.run(ActionTest.class);
+ }
+
+ /**
+ * Constructs a new Action test case with the given name.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public ActionTest(String name) {
+ super(name);
+ }
+
+ /**
+ * Returns the fixture for this Action test case.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected Action getFixture() {
+ return (Action)fixture;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see junit.framework.TestCase#setUp()
+ * @generated
+ */
+ @Override
+ protected void setUp() throws Exception {
+ setFixture(ResourceFactory.eINSTANCE.createAction());
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see junit.framework.TestCase#tearDown()
+ * @generated
+ */
+ @Override
+ protected void tearDown() throws Exception {
+ setFixture(null);
+ }
+
+} //ActionTest
diff --git a/services/org.eclipse.sensinact.studio.model.resource.tests/src/org/eclipse/sensinact/studio/resource/tests/AttributeTest.java b/services/org.eclipse.sensinact.studio.model.resource.tests/src/org/eclipse/sensinact/studio/resource/tests/AttributeTest.java
new file mode 100644
index 0000000..b903b75
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.tests/src/org/eclipse/sensinact/studio/resource/tests/AttributeTest.java
@@ -0,0 +1,80 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource.tests;
+
+import junit.textui.TestRunner;
+
+import org.eclipse.sensinact.studio.resource.Attribute;
+import org.eclipse.sensinact.studio.resource.ResourceFactory;
+
+/**
+ * <!-- begin-user-doc -->
+ * A test case for the model object '<em><b>Attribute</b></em>'.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class AttributeTest extends TypedElementTest {
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public static void main(String[] args) {
+ TestRunner.run(AttributeTest.class);
+ }
+
+ /**
+ * Constructs a new Attribute test case with the given name.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public AttributeTest(String name) {
+ super(name);
+ }
+
+ /**
+ * Returns the fixture for this Attribute test case.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected Attribute getFixture() {
+ return (Attribute)fixture;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see junit.framework.TestCase#setUp()
+ * @generated
+ */
+ @Override
+ protected void setUp() throws Exception {
+ setFixture(ResourceFactory.eINSTANCE.createAttribute());
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see junit.framework.TestCase#tearDown()
+ * @generated
+ */
+ @Override
+ protected void tearDown() throws Exception {
+ setFixture(null);
+ }
+
+} //AttributeTest
diff --git a/services/org.eclipse.sensinact.studio.model.resource.tests/src/org/eclipse/sensinact/studio/resource/tests/DeviceTest.java b/services/org.eclipse.sensinact.studio.model.resource.tests/src/org/eclipse/sensinact/studio/resource/tests/DeviceTest.java
new file mode 100644
index 0000000..afa60b5
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.tests/src/org/eclipse/sensinact/studio/resource/tests/DeviceTest.java
@@ -0,0 +1,80 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource.tests;
+
+import junit.textui.TestRunner;
+
+import org.eclipse.sensinact.studio.resource.Device;
+import org.eclipse.sensinact.studio.resource.ResourceFactory;
+
+/**
+ * <!-- begin-user-doc -->
+ * A test case for the model object '<em><b>Device</b></em>'.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class DeviceTest extends NamedElementTest {
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public static void main(String[] args) {
+ TestRunner.run(DeviceTest.class);
+ }
+
+ /**
+ * Constructs a new Device test case with the given name.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DeviceTest(String name) {
+ super(name);
+ }
+
+ /**
+ * Returns the fixture for this Device test case.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected Device getFixture() {
+ return (Device)fixture;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see junit.framework.TestCase#setUp()
+ * @generated
+ */
+ @Override
+ protected void setUp() throws Exception {
+ setFixture(ResourceFactory.eINSTANCE.createDevice());
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see junit.framework.TestCase#tearDown()
+ * @generated
+ */
+ @Override
+ protected void tearDown() throws Exception {
+ setFixture(null);
+ }
+
+} //DeviceTest
diff --git a/services/org.eclipse.sensinact.studio.model.resource.tests/src/org/eclipse/sensinact/studio/resource/tests/GatewayTest.java b/services/org.eclipse.sensinact.studio.model.resource.tests/src/org/eclipse/sensinact/studio/resource/tests/GatewayTest.java
new file mode 100644
index 0000000..e565e8e
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.tests/src/org/eclipse/sensinact/studio/resource/tests/GatewayTest.java
@@ -0,0 +1,80 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource.tests;
+
+import junit.textui.TestRunner;
+
+import org.eclipse.sensinact.studio.resource.Gateway;
+import org.eclipse.sensinact.studio.resource.ResourceFactory;
+
+/**
+ * <!-- begin-user-doc -->
+ * A test case for the model object '<em><b>Gateway</b></em>'.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class GatewayTest extends NamedElementTest {
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public static void main(String[] args) {
+ TestRunner.run(GatewayTest.class);
+ }
+
+ /**
+ * Constructs a new Gateway test case with the given name.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public GatewayTest(String name) {
+ super(name);
+ }
+
+ /**
+ * Returns the fixture for this Gateway test case.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected Gateway getFixture() {
+ return (Gateway)fixture;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see junit.framework.TestCase#setUp()
+ * @generated
+ */
+ @Override
+ protected void setUp() throws Exception {
+ setFixture(ResourceFactory.eINSTANCE.createGateway());
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see junit.framework.TestCase#tearDown()
+ * @generated
+ */
+ @Override
+ protected void tearDown() throws Exception {
+ setFixture(null);
+ }
+
+} //GatewayTest
diff --git a/services/org.eclipse.sensinact.studio.model.resource.tests/src/org/eclipse/sensinact/studio/resource/tests/MetadataTest.java b/services/org.eclipse.sensinact.studio.model.resource.tests/src/org/eclipse/sensinact/studio/resource/tests/MetadataTest.java
new file mode 100644
index 0000000..6b5e15d
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.tests/src/org/eclipse/sensinact/studio/resource/tests/MetadataTest.java
@@ -0,0 +1,80 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource.tests;
+
+import junit.textui.TestRunner;
+
+import org.eclipse.sensinact.studio.resource.Metadata;
+import org.eclipse.sensinact.studio.resource.ResourceFactory;
+
+/**
+ * <!-- begin-user-doc -->
+ * A test case for the model object '<em><b>Metadata</b></em>'.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class MetadataTest extends TypedElementTest {
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public static void main(String[] args) {
+ TestRunner.run(MetadataTest.class);
+ }
+
+ /**
+ * Constructs a new Metadata test case with the given name.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public MetadataTest(String name) {
+ super(name);
+ }
+
+ /**
+ * Returns the fixture for this Metadata test case.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected Metadata getFixture() {
+ return (Metadata)fixture;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see junit.framework.TestCase#setUp()
+ * @generated
+ */
+ @Override
+ protected void setUp() throws Exception {
+ setFixture(ResourceFactory.eINSTANCE.createMetadata());
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see junit.framework.TestCase#tearDown()
+ * @generated
+ */
+ @Override
+ protected void tearDown() throws Exception {
+ setFixture(null);
+ }
+
+} //MetadataTest
diff --git a/services/org.eclipse.sensinact.studio.model.resource.tests/src/org/eclipse/sensinact/studio/resource/tests/NamedElementTest.java b/services/org.eclipse.sensinact.studio.model.resource.tests/src/org/eclipse/sensinact/studio/resource/tests/NamedElementTest.java
new file mode 100644
index 0000000..9d60c92
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.tests/src/org/eclipse/sensinact/studio/resource/tests/NamedElementTest.java
@@ -0,0 +1,99 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource.tests;
+
+import junit.framework.TestCase;
+
+import junit.textui.TestRunner;
+
+import org.eclipse.sensinact.studio.resource.NamedElement;
+import org.eclipse.sensinact.studio.resource.ResourceFactory;
+
+/**
+ * <!-- begin-user-doc -->
+ * A test case for the model object '<em><b>Named Element</b></em>'.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class NamedElementTest extends TestCase {
+
+ /**
+ * The fixture for this Named Element test case.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected NamedElement fixture = null;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public static void main(String[] args) {
+ TestRunner.run(NamedElementTest.class);
+ }
+
+ /**
+ * Constructs a new Named Element test case with the given name.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public NamedElementTest(String name) {
+ super(name);
+ }
+
+ /**
+ * Sets the fixture for this Named Element test case.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected void setFixture(NamedElement fixture) {
+ this.fixture = fixture;
+ }
+
+ /**
+ * Returns the fixture for this Named Element test case.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected NamedElement getFixture() {
+ return fixture;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see junit.framework.TestCase#setUp()
+ * @generated
+ */
+ @Override
+ protected void setUp() throws Exception {
+ setFixture(ResourceFactory.eINSTANCE.createNamedElement());
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see junit.framework.TestCase#tearDown()
+ * @generated
+ */
+ @Override
+ protected void tearDown() throws Exception {
+ setFixture(null);
+ }
+
+} //NamedElementTest
diff --git a/services/org.eclipse.sensinact.studio.model.resource.tests/src/org/eclipse/sensinact/studio/resource/tests/ParameterTest.java b/services/org.eclipse.sensinact.studio.model.resource.tests/src/org/eclipse/sensinact/studio/resource/tests/ParameterTest.java
new file mode 100644
index 0000000..89827f8
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.tests/src/org/eclipse/sensinact/studio/resource/tests/ParameterTest.java
@@ -0,0 +1,80 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource.tests;
+
+import junit.textui.TestRunner;
+
+import org.eclipse.sensinact.studio.resource.Parameter;
+import org.eclipse.sensinact.studio.resource.ResourceFactory;
+
+/**
+ * <!-- begin-user-doc -->
+ * A test case for the model object '<em><b>Parameter</b></em>'.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class ParameterTest extends TypedElementTest {
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public static void main(String[] args) {
+ TestRunner.run(ParameterTest.class);
+ }
+
+ /**
+ * Constructs a new Parameter test case with the given name.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public ParameterTest(String name) {
+ super(name);
+ }
+
+ /**
+ * Returns the fixture for this Parameter test case.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected Parameter getFixture() {
+ return (Parameter)fixture;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see junit.framework.TestCase#setUp()
+ * @generated
+ */
+ @Override
+ protected void setUp() throws Exception {
+ setFixture(ResourceFactory.eINSTANCE.createParameter());
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see junit.framework.TestCase#tearDown()
+ * @generated
+ */
+ @Override
+ protected void tearDown() throws Exception {
+ setFixture(null);
+ }
+
+} //ParameterTest
diff --git a/services/org.eclipse.sensinact.studio.model.resource.tests/src/org/eclipse/sensinact/studio/resource/tests/PropertyTest.java b/services/org.eclipse.sensinact.studio.model.resource.tests/src/org/eclipse/sensinact/studio/resource/tests/PropertyTest.java
new file mode 100644
index 0000000..26ffaf1
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.tests/src/org/eclipse/sensinact/studio/resource/tests/PropertyTest.java
@@ -0,0 +1,80 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource.tests;
+
+import junit.textui.TestRunner;
+
+import org.eclipse.sensinact.studio.resource.Property;
+import org.eclipse.sensinact.studio.resource.ResourceFactory;
+
+/**
+ * <!-- begin-user-doc -->
+ * A test case for the model object '<em><b>Property</b></em>'.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class PropertyTest extends ResourceTest {
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public static void main(String[] args) {
+ TestRunner.run(PropertyTest.class);
+ }
+
+ /**
+ * Constructs a new Property test case with the given name.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public PropertyTest(String name) {
+ super(name);
+ }
+
+ /**
+ * Returns the fixture for this Property test case.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected Property getFixture() {
+ return (Property)fixture;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see junit.framework.TestCase#setUp()
+ * @generated
+ */
+ @Override
+ protected void setUp() throws Exception {
+ setFixture(ResourceFactory.eINSTANCE.createProperty());
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see junit.framework.TestCase#tearDown()
+ * @generated
+ */
+ @Override
+ protected void tearDown() throws Exception {
+ setFixture(null);
+ }
+
+} //PropertyTest
diff --git a/services/org.eclipse.sensinact.studio.model.resource.tests/src/org/eclipse/sensinact/studio/resource/tests/ResourceAllTests.java b/services/org.eclipse.sensinact.studio.model.resource.tests/src/org/eclipse/sensinact/studio/resource/tests/ResourceAllTests.java
new file mode 100644
index 0000000..97b5822
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.tests/src/org/eclipse/sensinact/studio/resource/tests/ResourceAllTests.java
@@ -0,0 +1,57 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource.tests;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import junit.textui.TestRunner;
+
+/**
+ * <!-- begin-user-doc -->
+ * A test suite for the '<em><b>Resource</b></em>' model.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class ResourceAllTests extends TestSuite {
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public static void main(String[] args) {
+ TestRunner.run(suite());
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public static Test suite() {
+ TestSuite suite = new ResourceAllTests("Resource Tests");
+ suite.addTest(ResourceTests.suite());
+ return suite;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public ResourceAllTests(String name) {
+ super(name);
+ }
+
+} //ResourceAllTests
diff --git a/services/org.eclipse.sensinact.studio.model.resource.tests/src/org/eclipse/sensinact/studio/resource/tests/ResourceExample.java b/services/org.eclipse.sensinact.studio.model.resource.tests/src/org/eclipse/sensinact/studio/resource/tests/ResourceExample.java
new file mode 100644
index 0000000..d78077f
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.tests/src/org/eclipse/sensinact/studio/resource/tests/ResourceExample.java
@@ -0,0 +1,131 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource.tests;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.eclipse.emf.common.util.Diagnostic;
+import org.eclipse.emf.common.util.URI;
+
+import org.eclipse.emf.ecore.EObject;
+
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+
+import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
+
+import org.eclipse.emf.ecore.util.Diagnostician;
+
+import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl;
+
+import org.eclipse.sensinact.studio.resource.ResourceFactory;
+import org.eclipse.sensinact.studio.resource.ResourcePackage;
+import org.eclipse.sensinact.studio.resource.Studio;
+
+/**
+ * <!-- begin-user-doc -->
+ * A sample utility for the '<em><b>resource</b></em>' package.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class ResourceExample {
+ /**
+ * <!-- begin-user-doc -->
+ * Load all the argument file paths or URIs as instances of the model.
+ * <!-- end-user-doc -->
+ * @param args the file paths or URIs.
+ * @generated
+ */
+ public static void main(String[] args) {
+ // Create a resource set to hold the resources.
+ //
+ ResourceSet resourceSet = new ResourceSetImpl();
+
+ // Register the appropriate resource factory to handle all file extensions.
+ //
+ resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put
+ (Resource.Factory.Registry.DEFAULT_EXTENSION,
+ new XMIResourceFactoryImpl());
+
+ // Register the package to ensure it is available during loading.
+ //
+ resourceSet.getPackageRegistry().put
+ (ResourcePackage.eNS_URI,
+ ResourcePackage.eINSTANCE);
+
+ // If there are no arguments, emit an appropriate usage message.
+ //
+ if (args.length == 0) {
+ System.out.println("Enter a list of file paths or URIs that have content like this:");
+ try {
+ Resource resource = resourceSet.createResource(URI.createURI("http:///My.resource"));
+ Studio root = ResourceFactory.eINSTANCE.createStudio();
+ resource.getContents().add(root);
+ resource.save(System.out, null);
+ }
+ catch (IOException exception) {
+ exception.printStackTrace();
+ }
+ }
+ else {
+ // Iterate over all the arguments.
+ //
+ for (int i = 0; i < args.length; ++i) {
+ // Construct the URI for the instance file.
+ // The argument is treated as a file path only if it denotes an existing file.
+ // Otherwise, it's directly treated as a URL.
+ //
+ File file = new File(args[i]);
+ URI uri = file.isFile() ? URI.createFileURI(file.getAbsolutePath()): URI.createURI(args[i]);
+
+ try {
+ // Demand load resource for this file.
+ //
+ Resource resource = resourceSet.getResource(uri, true);
+ System.out.println("Loaded " + uri);
+
+ // Validate the contents of the loaded resource.
+ //
+ for (EObject eObject : resource.getContents()) {
+ Diagnostic diagnostic = Diagnostician.INSTANCE.validate(eObject);
+ if (diagnostic.getSeverity() != Diagnostic.OK) {
+ printDiagnostic(diagnostic, "");
+ }
+ }
+ }
+ catch (RuntimeException exception) {
+ System.out.println("Problem loading " + uri);
+ exception.printStackTrace();
+ }
+ }
+ }
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * Prints diagnostics with indentation.
+ * <!-- end-user-doc -->
+ * @param diagnostic the diagnostic to print.
+ * @param indent the indentation for printing.
+ * @generated
+ */
+ protected static void printDiagnostic(Diagnostic diagnostic, String indent) {
+ System.out.print(indent);
+ System.out.println(diagnostic.getMessage());
+ for (Diagnostic child : diagnostic.getChildren()) {
+ printDiagnostic(child, indent + " ");
+ }
+ }
+
+} //ResourceExample
diff --git a/services/org.eclipse.sensinact.studio.model.resource.tests/src/org/eclipse/sensinact/studio/resource/tests/ResourceTest.java b/services/org.eclipse.sensinact.studio.model.resource.tests/src/org/eclipse/sensinact/studio/resource/tests/ResourceTest.java
new file mode 100644
index 0000000..4168403
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.tests/src/org/eclipse/sensinact/studio/resource/tests/ResourceTest.java
@@ -0,0 +1,99 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource.tests;
+
+import junit.textui.TestRunner;
+
+import org.eclipse.sensinact.studio.resource.Resource;
+import org.eclipse.sensinact.studio.resource.ResourceFactory;
+
+/**
+ * <!-- begin-user-doc -->
+ * A test case for the model object '<em><b>Resource</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following operations are tested:
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.resource.Resource#getAccessMethod(org.eclipse.sensinact.studio.resource.AccessMethodType) <em>Get Access Method</em>}</li>
+ * </ul>
+ * </p>
+ * @generated
+ */
+public class ResourceTest extends NamedElementTest {
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public static void main(String[] args) {
+ TestRunner.run(ResourceTest.class);
+ }
+
+ /**
+ * Constructs a new Resource test case with the given name.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public ResourceTest(String name) {
+ super(name);
+ }
+
+ /**
+ * Returns the fixture for this Resource test case.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected Resource getFixture() {
+ return (Resource)fixture;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see junit.framework.TestCase#setUp()
+ * @generated
+ */
+ @Override
+ protected void setUp() throws Exception {
+ setFixture(ResourceFactory.eINSTANCE.createResource());
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see junit.framework.TestCase#tearDown()
+ * @generated
+ */
+ @Override
+ protected void tearDown() throws Exception {
+ setFixture(null);
+ }
+
+ /**
+ * Tests the '{@link org.eclipse.sensinact.studio.resource.Resource#getAccessMethod(org.eclipse.sensinact.studio.resource.AccessMethodType) <em>Get Access Method</em>}' operation.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.resource.Resource#getAccessMethod(org.eclipse.sensinact.studio.resource.AccessMethodType)
+ * @generated
+ */
+ public void testGetAccessMethod__AccessMethodType() {
+ // TODO: implement this operation test method
+ // Ensure that you remove @generated or mark it @generated NOT
+ fail();
+ }
+
+} //ResourceTest
diff --git a/services/org.eclipse.sensinact.studio.model.resource.tests/src/org/eclipse/sensinact/studio/resource/tests/ResourceTests.java b/services/org.eclipse.sensinact.studio.model.resource.tests/src/org/eclipse/sensinact/studio/resource/tests/ResourceTests.java
new file mode 100644
index 0000000..73a3c1c
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.tests/src/org/eclipse/sensinact/studio/resource/tests/ResourceTests.java
@@ -0,0 +1,61 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource.tests;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import junit.textui.TestRunner;
+
+/**
+ * <!-- begin-user-doc -->
+ * A test suite for the '<em><b>resource</b></em>' package.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class ResourceTests extends TestSuite {
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public static void main(String[] args) {
+ TestRunner.run(suite());
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public static Test suite() {
+ TestSuite suite = new ResourceTests("resource Tests");
+ suite.addTestSuite(ResourceTest.class);
+ suite.addTestSuite(PropertyTest.class);
+ suite.addTestSuite(SensorDataTest.class);
+ suite.addTestSuite(StateVariableTest.class);
+ suite.addTestSuite(ActionTest.class);
+ return suite;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public ResourceTests(String name) {
+ super(name);
+ }
+
+} //ResourceTests
diff --git a/services/org.eclipse.sensinact.studio.model.resource.tests/src/org/eclipse/sensinact/studio/resource/tests/SensorDataTest.java b/services/org.eclipse.sensinact.studio.model.resource.tests/src/org/eclipse/sensinact/studio/resource/tests/SensorDataTest.java
new file mode 100644
index 0000000..8c4ae2f
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.tests/src/org/eclipse/sensinact/studio/resource/tests/SensorDataTest.java
@@ -0,0 +1,80 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource.tests;
+
+import junit.textui.TestRunner;
+
+import org.eclipse.sensinact.studio.resource.ResourceFactory;
+import org.eclipse.sensinact.studio.resource.SensorData;
+
+/**
+ * <!-- begin-user-doc -->
+ * A test case for the model object '<em><b>Sensor Data</b></em>'.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class SensorDataTest extends ResourceTest {
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public static void main(String[] args) {
+ TestRunner.run(SensorDataTest.class);
+ }
+
+ /**
+ * Constructs a new Sensor Data test case with the given name.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public SensorDataTest(String name) {
+ super(name);
+ }
+
+ /**
+ * Returns the fixture for this Sensor Data test case.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected SensorData getFixture() {
+ return (SensorData)fixture;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see junit.framework.TestCase#setUp()
+ * @generated
+ */
+ @Override
+ protected void setUp() throws Exception {
+ setFixture(ResourceFactory.eINSTANCE.createSensorData());
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see junit.framework.TestCase#tearDown()
+ * @generated
+ */
+ @Override
+ protected void tearDown() throws Exception {
+ setFixture(null);
+ }
+
+} //SensorDataTest
diff --git a/services/org.eclipse.sensinact.studio.model.resource.tests/src/org/eclipse/sensinact/studio/resource/tests/ServiceTest.java b/services/org.eclipse.sensinact.studio.model.resource.tests/src/org/eclipse/sensinact/studio/resource/tests/ServiceTest.java
new file mode 100644
index 0000000..07b1225
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.tests/src/org/eclipse/sensinact/studio/resource/tests/ServiceTest.java
@@ -0,0 +1,80 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource.tests;
+
+import junit.textui.TestRunner;
+
+import org.eclipse.sensinact.studio.resource.ResourceFactory;
+import org.eclipse.sensinact.studio.resource.Service;
+
+/**
+ * <!-- begin-user-doc -->
+ * A test case for the model object '<em><b>Service</b></em>'.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class ServiceTest extends NamedElementTest {
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public static void main(String[] args) {
+ TestRunner.run(ServiceTest.class);
+ }
+
+ /**
+ * Constructs a new Service test case with the given name.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public ServiceTest(String name) {
+ super(name);
+ }
+
+ /**
+ * Returns the fixture for this Service test case.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected Service getFixture() {
+ return (Service)fixture;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see junit.framework.TestCase#setUp()
+ * @generated
+ */
+ @Override
+ protected void setUp() throws Exception {
+ setFixture(ResourceFactory.eINSTANCE.createService());
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see junit.framework.TestCase#tearDown()
+ * @generated
+ */
+ @Override
+ protected void tearDown() throws Exception {
+ setFixture(null);
+ }
+
+} //ServiceTest
diff --git a/services/org.eclipse.sensinact.studio.model.resource.tests/src/org/eclipse/sensinact/studio/resource/tests/StateVariableTest.java b/services/org.eclipse.sensinact.studio.model.resource.tests/src/org/eclipse/sensinact/studio/resource/tests/StateVariableTest.java
new file mode 100644
index 0000000..74582e2
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.tests/src/org/eclipse/sensinact/studio/resource/tests/StateVariableTest.java
@@ -0,0 +1,80 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource.tests;
+
+import junit.textui.TestRunner;
+
+import org.eclipse.sensinact.studio.resource.ResourceFactory;
+import org.eclipse.sensinact.studio.resource.StateVariable;
+
+/**
+ * <!-- begin-user-doc -->
+ * A test case for the model object '<em><b>State Variable</b></em>'.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class StateVariableTest extends ResourceTest {
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public static void main(String[] args) {
+ TestRunner.run(StateVariableTest.class);
+ }
+
+ /**
+ * Constructs a new State Variable test case with the given name.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public StateVariableTest(String name) {
+ super(name);
+ }
+
+ /**
+ * Returns the fixture for this State Variable test case.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected StateVariable getFixture() {
+ return (StateVariable)fixture;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see junit.framework.TestCase#setUp()
+ * @generated
+ */
+ @Override
+ protected void setUp() throws Exception {
+ setFixture(ResourceFactory.eINSTANCE.createStateVariable());
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see junit.framework.TestCase#tearDown()
+ * @generated
+ */
+ @Override
+ protected void tearDown() throws Exception {
+ setFixture(null);
+ }
+
+} //StateVariableTest
diff --git a/services/org.eclipse.sensinact.studio.model.resource.tests/src/org/eclipse/sensinact/studio/resource/tests/StudioTest.java b/services/org.eclipse.sensinact.studio.model.resource.tests/src/org/eclipse/sensinact/studio/resource/tests/StudioTest.java
new file mode 100644
index 0000000..9a9bed5
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.tests/src/org/eclipse/sensinact/studio/resource/tests/StudioTest.java
@@ -0,0 +1,99 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource.tests;
+
+import junit.framework.TestCase;
+
+import junit.textui.TestRunner;
+
+import org.eclipse.sensinact.studio.resource.ResourceFactory;
+import org.eclipse.sensinact.studio.resource.Studio;
+
+/**
+ * <!-- begin-user-doc -->
+ * A test case for the model object '<em><b>Studio</b></em>'.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class StudioTest extends TestCase {
+
+ /**
+ * The fixture for this Studio test case.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected Studio fixture = null;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public static void main(String[] args) {
+ TestRunner.run(StudioTest.class);
+ }
+
+ /**
+ * Constructs a new Studio test case with the given name.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public StudioTest(String name) {
+ super(name);
+ }
+
+ /**
+ * Sets the fixture for this Studio test case.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected void setFixture(Studio fixture) {
+ this.fixture = fixture;
+ }
+
+ /**
+ * Returns the fixture for this Studio test case.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected Studio getFixture() {
+ return fixture;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see junit.framework.TestCase#setUp()
+ * @generated
+ */
+ @Override
+ protected void setUp() throws Exception {
+ setFixture(ResourceFactory.eINSTANCE.createStudio());
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see junit.framework.TestCase#tearDown()
+ * @generated
+ */
+ @Override
+ protected void tearDown() throws Exception {
+ setFixture(null);
+ }
+
+} //StudioTest
diff --git a/services/org.eclipse.sensinact.studio.model.resource.tests/src/org/eclipse/sensinact/studio/resource/tests/TypedElementTest.java b/services/org.eclipse.sensinact.studio.model.resource.tests/src/org/eclipse/sensinact/studio/resource/tests/TypedElementTest.java
new file mode 100644
index 0000000..fe41940
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource.tests/src/org/eclipse/sensinact/studio/resource/tests/TypedElementTest.java
@@ -0,0 +1,80 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource.tests;
+
+import junit.textui.TestRunner;
+
+import org.eclipse.sensinact.studio.resource.ResourceFactory;
+import org.eclipse.sensinact.studio.resource.TypedElement;
+
+/**
+ * <!-- begin-user-doc -->
+ * A test case for the model object '<em><b>Typed Element</b></em>'.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class TypedElementTest extends NamedElementTest {
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public static void main(String[] args) {
+ TestRunner.run(TypedElementTest.class);
+ }
+
+ /**
+ * Constructs a new Typed Element test case with the given name.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public TypedElementTest(String name) {
+ super(name);
+ }
+
+ /**
+ * Returns the fixture for this Typed Element test case.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected TypedElement getFixture() {
+ return (TypedElement)fixture;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see junit.framework.TestCase#setUp()
+ * @generated
+ */
+ @Override
+ protected void setUp() throws Exception {
+ setFixture(ResourceFactory.eINSTANCE.createTypedElement());
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see junit.framework.TestCase#tearDown()
+ * @generated
+ */
+ @Override
+ protected void tearDown() throws Exception {
+ setFixture(null);
+ }
+
+} //TypedElementTest
diff --git a/services/org.eclipse.sensinact.studio.model.resource/META-INF/MANIFEST.MF b/services/org.eclipse.sensinact.studio.model.resource/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..95d6a33
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource/META-INF/MANIFEST.MF
@@ -0,0 +1,21 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-SymbolicName: org.eclipse.sensinact.studio.model.resource;singleton:=true
+Bundle-Version: 1.0.0.qualifier
+Bundle-ClassPath: .
+Bundle-Vendor: %providerName
+Bundle-Localization: plugin
+Bundle-RequiredExecutionEnvironment: JavaSE-1.7
+Export-Package: org.eclipse.sensinact.studio.resource,
+ org.eclipse.sensinact.studio.resource.impl,
+ org.eclipse.sensinact.studio.resource.util,
+ org.eclipse.sensinact.studio.model.resource.utils
+Require-Bundle: org.eclipse.emf.ecore.xmi;visibility:=reexport,
+ org.eclipse.emf.transaction,
+ org.json,
+ org.restlet,
+ org.eclipse.core.runtime,
+ org.eclipse.emf.ecore;visibility:=reexport,
+ org.eclipse.sensinact.studio.preferences
+Bundle-ActivationPolicy: lazy
diff --git a/services/org.eclipse.sensinact.studio.model.resource/about.html b/services/org.eclipse.sensinact.studio.model.resource/about.html
new file mode 100644
index 0000000..3b39f88
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource/about.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"><head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 5, 2006</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+
+</body></html>
\ No newline at end of file
diff --git a/services/org.eclipse.sensinact.studio.model.resource/build.properties b/services/org.eclipse.sensinact.studio.model.resource/build.properties
new file mode 100644
index 0000000..e1e480e
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource/build.properties
@@ -0,0 +1,25 @@
+#
+# Copyright (c) 2017 CEA.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+# CEA - initial API and implementation and/or initial documentation
+#
+
+source.. = src/,\
+ src-gen/
+bin.includes = plugin.xml,\
+ .,\
+ src-gen/,\
+ models/,\
+ .project,\
+ plugin.properties,\
+ .classpath,\
+ build.properties,\
+ META-INF/,\
+ .settings/,\
+ bin/
+output.. = bin/
diff --git a/services/org.eclipse.sensinact.studio.model.resource/models/resource.aird b/services/org.eclipse.sensinact.studio.model.resource/models/resource.aird
new file mode 100644
index 0000000..e4faac9
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource/models/resource.aird
@@ -0,0 +1,1476 @@
+<?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/description/1.1.0" xmlns:description_1="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:viewpoint="http://www.eclipse.org/sirius/1.1.0" xsi:schemaLocation="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="_4ocfQJKFEeW9FdUPGRS2og" selectedViews="_5Jn5sJKFEeW9FdUPGRS2og _77ZdwJKFEeW9FdUPGRS2og _77kc4JKFEeW9FdUPGRS2og _79qHkJKFEeW9FdUPGRS2og" version="8.1.1">
+ <models xmi:type="ecore:EPackage" href="resource.ecore#/"/>
+ <models xmi:type="ecore:EPackage" href="http://www.eclipse.org/emf/2002/Ecore#/"/>
+ <ownedViews xmi:type="viewpoint:DRepresentationContainer" xmi:id="_5Jn5sJKFEeW9FdUPGRS2og" initialized="true">
+ <ownedRepresentations xmi:type="diagram:DSemanticDiagram" xmi:id="_5YZVgJKFEeW9FdUPGRS2og" name="resource class diagram">
+ <ownedAnnotationEntries xmi:type="description:AnnotationEntry" xmi:id="_5ZBAkJKFEeW9FdUPGRS2og" source="GMF_DIAGRAMS">
+ <data xmi:type="notation:Diagram" xmi:id="_5ZBAkZKFEeW9FdUPGRS2og" type="Sirius" element="_5YZVgJKFEeW9FdUPGRS2og" measurementUnit="Pixel">
+ <children xmi:type="notation:Node" xmi:id="_5aQWsJKFEeW9FdUPGRS2og" type="2001" element="_5YZVgZKFEeW9FdUPGRS2og">
+ <children xmi:type="notation:Node" xmi:id="_5a86QJKFEeW9FdUPGRS2og" type="5002">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_5a9hUJKFEeW9FdUPGRS2og" y="5"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_76zn4JKFEeW9FdUPGRS2og" type="3005" element="_5YZVgpKFEeW9FdUPGRS2og">
+ <styles xmi:type="notation:ShapeStyle" xmi:id="_76zn4ZKFEeW9FdUPGRS2og" fontName="Cantarell"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_76zn4pKFEeW9FdUPGRS2og"/>
+ </children>
+ <styles xmi:type="notation:ShapeStyle" xmi:id="_5aQWsZKFEeW9FdUPGRS2og" fontName="Cantarell" fontHeight="8"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_5aQWspKFEeW9FdUPGRS2og" width="672" height="67"/>
+ </children>
+ <styles xmi:type="notation:DiagramStyle" xmi:id="_5ZBAkpKFEeW9FdUPGRS2og"/>
+ </data>
+ </ownedAnnotationEntries>
+ <ownedDiagramElements xmi:type="diagram:DNode" xmi:id="_5YZVgZKFEeW9FdUPGRS2og" width="-1" height="-1">
+ <target xmi:type="ecore:EPackage" href="resource.ecore#/"/>
+ <semanticElements xmi:type="ecore:EPackage" href="resource.ecore#/"/>
+ <ownedStyle xmi:type="diagram:WorkspaceImage" xmi:id="_5YZVgpKFEeW9FdUPGRS2og" showIcon="false" labelPosition="node" workspacePath="/org.eclipse.emf.ecoretools.design/icons/full/back/empty.svg">
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_5YZVg5KFEeW9FdUPGRS2og"/>
+ <description xmi:type="style:WorkspaceImageDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@nodeMappings[name='Empty%20Diagram']/@style"/>
+ <borderColor xmi:type="viewpoint:RGBValues" xmi:id="_5YZVhJKFEeW9FdUPGRS2og"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@nodeMappings[name='Empty%20Diagram']"/>
+ </ownedDiagramElements>
+ <description xmi:type="description_1: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="_5YZVhZKFEeW9FdUPGRS2og"/>
+ <activatedLayers xmi:type="description_1:Layer" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer"/>
+ <activatedLayers xmi:type="description_1: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_1: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_1: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="resource.ecore#/"/>
+ </ownedRepresentations>
+ <ownedRepresentations xmi:type="diagram:DSemanticDiagram" xmi:id="_77Gi0JKFEeW9FdUPGRS2og" name="ecore class diagram">
+ <ownedAnnotationEntries xmi:type="description:AnnotationEntry" xmi:id="_77Gi1pKFEeW9FdUPGRS2og" source="GMF_DIAGRAMS">
+ <data xmi:type="notation:Diagram" xmi:id="_77Gi15KFEeW9FdUPGRS2og" type="Sirius" element="_77Gi0JKFEeW9FdUPGRS2og" measurementUnit="Pixel">
+ <children xmi:type="notation:Node" xmi:id="_77HJ4JKFEeW9FdUPGRS2og" type="2001" element="_77Gi0ZKFEeW9FdUPGRS2og">
+ <children xmi:type="notation:Node" xmi:id="_77HJ45KFEeW9FdUPGRS2og" type="5002">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_77HJ5JKFEeW9FdUPGRS2og" y="5"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_77Hw8JKFEeW9FdUPGRS2og" type="3005" element="_77Gi0pKFEeW9FdUPGRS2og">
+ <styles xmi:type="notation:ShapeStyle" xmi:id="_77Hw8ZKFEeW9FdUPGRS2og" fontName="Cantarell"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_77Hw8pKFEeW9FdUPGRS2og"/>
+ </children>
+ <styles xmi:type="notation:ShapeStyle" xmi:id="_77HJ4ZKFEeW9FdUPGRS2og" fontName="Cantarell" fontHeight="8"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_77HJ4pKFEeW9FdUPGRS2og" width="672" height="67"/>
+ </children>
+ <styles xmi:type="notation:DiagramStyle" xmi:id="_77Gi2JKFEeW9FdUPGRS2og"/>
+ </data>
+ </ownedAnnotationEntries>
+ <ownedDiagramElements xmi:type="diagram:DNode" xmi:id="_77Gi0ZKFEeW9FdUPGRS2og" width="-1" height="-1">
+ <target xmi:type="ecore:EPackage" href="http://www.eclipse.org/emf/2002/Ecore#/"/>
+ <semanticElements xmi:type="ecore:EPackage" href="http://www.eclipse.org/emf/2002/Ecore#/"/>
+ <ownedStyle xmi:type="diagram:WorkspaceImage" xmi:id="_77Gi0pKFEeW9FdUPGRS2og" showIcon="false" labelPosition="node" workspacePath="/org.eclipse.emf.ecoretools.design/icons/full/back/empty.svg">
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_77Gi05KFEeW9FdUPGRS2og"/>
+ <description xmi:type="style:WorkspaceImageDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@nodeMappings[name='Empty%20Diagram']/@style"/>
+ <borderColor xmi:type="viewpoint:RGBValues" xmi:id="_77Gi1JKFEeW9FdUPGRS2og"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@nodeMappings[name='Empty%20Diagram']"/>
+ </ownedDiagramElements>
+ <description xmi:type="description_1: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="_77Gi1ZKFEeW9FdUPGRS2og"/>
+ <activatedLayers xmi:type="description_1:Layer" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer"/>
+ <activatedLayers xmi:type="description_1: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_1: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_1: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="http://www.eclipse.org/emf/2002/Ecore#/"/>
+ </ownedRepresentations>
+ <ownedRepresentations xmi:type="diagram:DSemanticDiagram" xmi:id="_IOoJ8JKGEeW9FdUPGRS2og" name="resource class diagram">
+ <ownedAnnotationEntries xmi:type="description:AnnotationEntry" xmi:id="_IOoxAJKGEeW9FdUPGRS2og" source="GMF_DIAGRAMS">
+ <data xmi:type="notation:Diagram" xmi:id="_IOoxAZKGEeW9FdUPGRS2og" type="Sirius" element="_IOoJ8JKGEeW9FdUPGRS2og" measurementUnit="Pixel">
+ <children xmi:type="notation:Node" xmi:id="_M_QnYJKGEeW9FdUPGRS2og" type="2003" element="_M8r0gJKGEeW9FdUPGRS2og">
+ <children xmi:type="notation:Node" xmi:id="_M_R1gJKGEeW9FdUPGRS2og" type="5007"/>
+ <children xmi:type="notation:Node" xmi:id="_M_TqsJKGEeW9FdUPGRS2og" type="7004">
+ <children xmi:type="notation:Node" xmi:id="_M_hGEJKGEeW9FdUPGRS2og" type="3010" element="_M-E7oJKGEeW9FdUPGRS2og">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_M_hGEZKGEeW9FdUPGRS2og"/>
+ </children>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_M_TqsZKGEeW9FdUPGRS2og"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_M_TqspKGEeW9FdUPGRS2og"/>
+ </children>
+ <styles xmi:type="notation:ShapeStyle" xmi:id="_M_QnYZKGEeW9FdUPGRS2og" fontName="Cantarell" fontHeight="8"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_M_QnYpKGEeW9FdUPGRS2og" x="960" y="190"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_M_U40JKGEeW9FdUPGRS2og" type="2003" element="_M80XYJKGEeW9FdUPGRS2og">
+ <children xmi:type="notation:Node" xmi:id="_M_U405KGEeW9FdUPGRS2og" type="5007"/>
+ <children xmi:type="notation:Node" xmi:id="_M_Vf4JKGEeW9FdUPGRS2og" type="7004">
+ <children xmi:type="notation:Node" xmi:id="_M_htIJKGEeW9FdUPGRS2og" type="3010" element="_M-TlIJKGEeW9FdUPGRS2og">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_M_htIZKGEeW9FdUPGRS2og"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_M_htIpKGEeW9FdUPGRS2og" type="3010" element="_M-UzQJKGEeW9FdUPGRS2og">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_M_htI5KGEeW9FdUPGRS2og"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_M_htJJKGEeW9FdUPGRS2og" type="3010" element="_M-VaUJKGEeW9FdUPGRS2og">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_M_htJZKGEeW9FdUPGRS2og"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_M_iUMJKGEeW9FdUPGRS2og" type="3010" element="_M-WBYJKGEeW9FdUPGRS2og">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_M_iUMZKGEeW9FdUPGRS2og"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_M_iUMpKGEeW9FdUPGRS2og" type="3010" element="_M-WocJKGEeW9FdUPGRS2og">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_M_iUM5KGEeW9FdUPGRS2og"/>
+ </children>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_M_Vf4ZKGEeW9FdUPGRS2og"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_M_Vf4pKGEeW9FdUPGRS2og"/>
+ </children>
+ <styles xmi:type="notation:ShapeStyle" xmi:id="_M_U40ZKGEeW9FdUPGRS2og" fontName="Cantarell" fontHeight="8"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_M_U40pKGEeW9FdUPGRS2og" x="1025" y="65"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_M_Vf45KGEeW9FdUPGRS2og" type="2003" element="_M82zoJKGEeW9FdUPGRS2og">
+ <children xmi:type="notation:Node" xmi:id="_M_WG8JKGEeW9FdUPGRS2og" type="5007"/>
+ <children xmi:type="notation:Node" xmi:id="_M_WG8ZKGEeW9FdUPGRS2og" type="7004">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_M_WG8pKGEeW9FdUPGRS2og"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_M_WG85KGEeW9FdUPGRS2og"/>
+ </children>
+ <styles xmi:type="notation:ShapeStyle" xmi:id="_M_Vf5JKGEeW9FdUPGRS2og" fontName="Cantarell" fontHeight="8"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_M_Vf5ZKGEeW9FdUPGRS2og" x="465" y="740"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_M_WG9JKGEeW9FdUPGRS2og" type="2003" element="_M8528JKGEeW9FdUPGRS2og">
+ <children xmi:type="notation:Node" xmi:id="_M_WuAJKGEeW9FdUPGRS2og" type="5007"/>
+ <children xmi:type="notation:Node" xmi:id="_M_WuAZKGEeW9FdUPGRS2og" type="7004">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_M_WuApKGEeW9FdUPGRS2og"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_M_WuA5KGEeW9FdUPGRS2og"/>
+ </children>
+ <styles xmi:type="notation:ShapeStyle" xmi:id="_M_WG9ZKGEeW9FdUPGRS2og" fontName="Cantarell" fontHeight="8"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_M_WG9pKGEeW9FdUPGRS2og" x="1495" y="380"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_M_XVEJKGEeW9FdUPGRS2og" type="2003" element="_M886QJKGEeW9FdUPGRS2og">
+ <children xmi:type="notation:Node" xmi:id="_M_X8IJKGEeW9FdUPGRS2og" type="5007"/>
+ <children xmi:type="notation:Node" xmi:id="_M_X8IZKGEeW9FdUPGRS2og" type="7004">
+ <children xmi:type="notation:Node" xmi:id="_M_i7QJKGEeW9FdUPGRS2og" type="3010" element="_M-ImAJKGEeW9FdUPGRS2og">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_M_i7QZKGEeW9FdUPGRS2og"/>
+ </children>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_M_X8IpKGEeW9FdUPGRS2og"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_M_X8I5KGEeW9FdUPGRS2og"/>
+ </children>
+ <styles xmi:type="notation:ShapeStyle" xmi:id="_M_XVEZKGEeW9FdUPGRS2og" fontName="Cantarell" fontHeight="8"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_M_XVEpKGEeW9FdUPGRS2og" x="280" y="380"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_M_YjMJKGEeW9FdUPGRS2og" type="2003" element="_M8_WgJKGEeW9FdUPGRS2og">
+ <children xmi:type="notation:Node" xmi:id="_M_ZKQJKGEeW9FdUPGRS2og" type="5007"/>
+ <children xmi:type="notation:Node" xmi:id="_M_ZKQZKGEeW9FdUPGRS2og" type="7004">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_M_ZKQpKGEeW9FdUPGRS2og"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_M_ZKQ5KGEeW9FdUPGRS2og"/>
+ </children>
+ <styles xmi:type="notation:ShapeStyle" xmi:id="_M_YjMZKGEeW9FdUPGRS2og" fontName="Cantarell" fontHeight="8"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_M_YjMpKGEeW9FdUPGRS2og" x="-190" y="375"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_M_ZKRJKGEeW9FdUPGRS2og" type="2003" element="_M9BywJKGEeW9FdUPGRS2og">
+ <children xmi:type="notation:Node" xmi:id="_M_ZxUJKGEeW9FdUPGRS2og" type="5007"/>
+ <children xmi:type="notation:Node" xmi:id="_M_ZxUZKGEeW9FdUPGRS2og" type="7004">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_M_ZxUpKGEeW9FdUPGRS2og"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_M_ZxU5KGEeW9FdUPGRS2og"/>
+ </children>
+ <styles xmi:type="notation:ShapeStyle" xmi:id="_M_ZKRZKGEeW9FdUPGRS2og" fontName="Cantarell" fontHeight="8"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_M_ZKRpKGEeW9FdUPGRS2og" x="1875" y="370"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_M_ZxVJKGEeW9FdUPGRS2og" type="2003" element="_M9EPAJKGEeW9FdUPGRS2og">
+ <children xmi:type="notation:Node" xmi:id="_M_aYYJKGEeW9FdUPGRS2og" type="5007"/>
+ <children xmi:type="notation:Node" xmi:id="_M_aYYZKGEeW9FdUPGRS2og" type="7004">
+ <children xmi:type="notation:Node" xmi:id="_M_jiUJKGEeW9FdUPGRS2og" type="3010" element="_M-KbMJKGEeW9FdUPGRS2og">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_M_jiUZKGEeW9FdUPGRS2og"/>
+ </children>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_M_aYYpKGEeW9FdUPGRS2og"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_M_aYY5KGEeW9FdUPGRS2og"/>
+ </children>
+ <styles xmi:type="notation:ShapeStyle" xmi:id="_M_ZxVZKGEeW9FdUPGRS2og" fontName="Cantarell" fontHeight="8"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_M_ZxVpKGEeW9FdUPGRS2og" x="505" y="-255"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_M_a_cJKGEeW9FdUPGRS2og" type="2003" element="_M9GrQJKGEeW9FdUPGRS2og">
+ <children xmi:type="notation:Node" xmi:id="_M_a_c5KGEeW9FdUPGRS2og" type="5007"/>
+ <children xmi:type="notation:Node" xmi:id="_M_bmgJKGEeW9FdUPGRS2og" type="7004">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_M_bmgZKGEeW9FdUPGRS2og"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_M_bmgpKGEeW9FdUPGRS2og"/>
+ </children>
+ <styles xmi:type="notation:ShapeStyle" xmi:id="_M_a_cZKGEeW9FdUPGRS2og" fontName="Cantarell" fontHeight="8"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_M_a_cpKGEeW9FdUPGRS2og" x="1370" y="195"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_M_bmg5KGEeW9FdUPGRS2og" type="2003" element="_M9JHgJKGEeW9FdUPGRS2og">
+ <children xmi:type="notation:Node" xmi:id="_M_cNkJKGEeW9FdUPGRS2og" type="5007"/>
+ <children xmi:type="notation:Node" xmi:id="_M_cNkZKGEeW9FdUPGRS2og" type="7004">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_M_cNkpKGEeW9FdUPGRS2og"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_M_cNk5KGEeW9FdUPGRS2og"/>
+ </children>
+ <styles xmi:type="notation:ShapeStyle" xmi:id="_M_bmhJKGEeW9FdUPGRS2og" fontName="Cantarell" fontHeight="8"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_M_bmhZKGEeW9FdUPGRS2og" x="860" y="740"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_M_cNlJKGEeW9FdUPGRS2og" type="2003" element="_M9LjwJKGEeW9FdUPGRS2og">
+ <children xmi:type="notation:Node" xmi:id="_M_c0oJKGEeW9FdUPGRS2og" type="5007"/>
+ <children xmi:type="notation:Node" xmi:id="_M_c0oZKGEeW9FdUPGRS2og" type="7004">
+ <children xmi:type="notation:Node" xmi:id="_M_jiUpKGEeW9FdUPGRS2og" type="3010" element="_M-MQYJKGEeW9FdUPGRS2og">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_M_jiU5KGEeW9FdUPGRS2og"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_M_kJYJKGEeW9FdUPGRS2og" type="3010" element="_M-NegJKGEeW9FdUPGRS2og">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_M_kJYZKGEeW9FdUPGRS2og"/>
+ </children>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_M_c0opKGEeW9FdUPGRS2og"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_M_c0o5KGEeW9FdUPGRS2og"/>
+ </children>
+ <styles xmi:type="notation:ShapeStyle" xmi:id="_M_cNlZKGEeW9FdUPGRS2og" fontName="Cantarell" fontHeight="8"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_M_cNlpKGEeW9FdUPGRS2og" x="730" y="390"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_M_dbsJKGEeW9FdUPGRS2og" type="2003" element="_M9OAAJKGEeW9FdUPGRS2og">
+ <children xmi:type="notation:Node" xmi:id="_M_dbs5KGEeW9FdUPGRS2og" type="5007"/>
+ <children xmi:type="notation:Node" xmi:id="_M_eCwJKGEeW9FdUPGRS2og" type="7004">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_M_eCwZKGEeW9FdUPGRS2og"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_M_eCwpKGEeW9FdUPGRS2og"/>
+ </children>
+ <styles xmi:type="notation:ShapeStyle" xmi:id="_M_dbsZKGEeW9FdUPGRS2og" fontName="Cantarell" fontHeight="8"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_M_dbspKGEeW9FdUPGRS2og" x="995" y="740"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_M_eCw5KGEeW9FdUPGRS2og" type="2003" element="_M9QcQJKGEeW9FdUPGRS2og">
+ <children xmi:type="notation:Node" xmi:id="_M_ep0JKGEeW9FdUPGRS2og" type="5007"/>
+ <children xmi:type="notation:Node" xmi:id="_M_ep0ZKGEeW9FdUPGRS2og" type="7004">
+ <children xmi:type="notation:Node" xmi:id="_M_kJYpKGEeW9FdUPGRS2og" type="3010" element="_M-P6wJKGEeW9FdUPGRS2og">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_M_kJY5KGEeW9FdUPGRS2og"/>
+ </children>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_M_ep0pKGEeW9FdUPGRS2og"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_M_ep05KGEeW9FdUPGRS2og"/>
+ </children>
+ <styles xmi:type="notation:ShapeStyle" xmi:id="_M_eCxJKGEeW9FdUPGRS2og" fontName="Cantarell" fontHeight="8"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_M_eCxZKGEeW9FdUPGRS2og" x="515" y="385"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_M_ep1JKGEeW9FdUPGRS2og" type="2003" element="_M9SRcJKGEeW9FdUPGRS2og">
+ <children xmi:type="notation:Node" xmi:id="_M_fQ4JKGEeW9FdUPGRS2og" type="5007"/>
+ <children xmi:type="notation:Node" xmi:id="_M_fQ4ZKGEeW9FdUPGRS2og" type="7004">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_M_fQ4pKGEeW9FdUPGRS2og"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_M_fQ45KGEeW9FdUPGRS2og"/>
+ </children>
+ <styles xmi:type="notation:ShapeStyle" xmi:id="_M_ep1ZKGEeW9FdUPGRS2og" fontName="Cantarell" fontHeight="8"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_M_ep1pKGEeW9FdUPGRS2og" x="730" y="740"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_M_f38JKGEeW9FdUPGRS2og" type="2003" element="_M9VUwJKGEeW9FdUPGRS2og">
+ <children xmi:type="notation:Node" xmi:id="_M_f385KGEeW9FdUPGRS2og" type="5007"/>
+ <children xmi:type="notation:Node" xmi:id="_M_f39JKGEeW9FdUPGRS2og" type="7004">
+ <children xmi:type="notation:Node" xmi:id="_M_kwcJKGEeW9FdUPGRS2og" type="3010" element="_M-RI4JKGEeW9FdUPGRS2og">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_M_kwcZKGEeW9FdUPGRS2og"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_M_kwcpKGEeW9FdUPGRS2og" type="3010" element="_M-SXAJKGEeW9FdUPGRS2og">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_M_kwc5KGEeW9FdUPGRS2og"/>
+ </children>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_M_f39ZKGEeW9FdUPGRS2og"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_M_f39pKGEeW9FdUPGRS2og"/>
+ </children>
+ <styles xmi:type="notation:ShapeStyle" xmi:id="_M_f38ZKGEeW9FdUPGRS2og" fontName="Cantarell" fontHeight="8"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_M_f38pKGEeW9FdUPGRS2og" x="1485" y="-255"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_V0JSgJKIEeW9FdUPGRS2og" type="2003" element="_VzDGUJKIEeW9FdUPGRS2og">
+ <children xmi:type="notation:Node" xmi:id="_V0KgoJKIEeW9FdUPGRS2og" type="5007"/>
+ <children xmi:type="notation:Node" xmi:id="_V0KgoZKIEeW9FdUPGRS2og" type="7004">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_V0KgopKIEeW9FdUPGRS2og"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_V0Kgo5KIEeW9FdUPGRS2og"/>
+ </children>
+ <styles xmi:type="notation:ShapeStyle" xmi:id="_V0JSgZKIEeW9FdUPGRS2og" fontName="Cantarell" fontHeight="8"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_V0J5kJKIEeW9FdUPGRS2og" x="65" y="375" width="120" height="100"/>
+ </children>
+ <styles xmi:type="notation:DiagramStyle" xmi:id="_IOoxApKGEeW9FdUPGRS2og"/>
+ <edges xmi:type="notation:Edge" xmi:id="_M_q3EJKGEeW9FdUPGRS2og" type="4001" element="_M-d9MJKGEeW9FdUPGRS2og" source="_M_QnYJKGEeW9FdUPGRS2og" target="_M_a_cJKGEeW9FdUPGRS2og">
+ <children xmi:type="notation:Node" xmi:id="_M_sFMJKGEeW9FdUPGRS2og" type="6001">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_M_sFMZKGEeW9FdUPGRS2og" y="-10"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_M_ssQJKGEeW9FdUPGRS2og" type="6002">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_M_ssQZKGEeW9FdUPGRS2og" y="10"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_M_ssQpKGEeW9FdUPGRS2og" type="6003">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_M_ssQ5KGEeW9FdUPGRS2og" y="10"/>
+ </children>
+ <styles xmi:type="notation:ConnectorStyle" xmi:id="_M_q3EZKGEeW9FdUPGRS2og" routing="Rectilinear" jumpLinkStatus="Above"/>
+ <styles xmi:type="notation:FontStyle" xmi:id="_M_q3EpKGEeW9FdUPGRS2og" fontColor="7490599" fontName="Cantarell" fontHeight="8"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_M_q3E5KGEeW9FdUPGRS2og" points="[920, 194, 920, 194]$[1160, 434, 1160, 434]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_M_yy4JKGEeW9FdUPGRS2og" id="(0.5,0.5)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_M_yy4ZKGEeW9FdUPGRS2og" id="(0.5,0.5)"/>
+ </edges>
+ <edges xmi:type="notation:Edge" xmi:id="_M_zZ8JKGEeW9FdUPGRS2og" type="4001" element="_M-jcwJKGEeW9FdUPGRS2og" source="_M_cNlJKGEeW9FdUPGRS2og" target="_M_WG9JKGEeW9FdUPGRS2og">
+ <children xmi:type="notation:Node" xmi:id="_M_0BAJKGEeW9FdUPGRS2og" type="6001">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_M_0BAZKGEeW9FdUPGRS2og" y="-10"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_M_0BApKGEeW9FdUPGRS2og" type="6002">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_M_0BA5KGEeW9FdUPGRS2og" y="10"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_M_0BBJKGEeW9FdUPGRS2og" type="6003">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_M_0BBZKGEeW9FdUPGRS2og" y="10"/>
+ </children>
+ <styles xmi:type="notation:ConnectorStyle" xmi:id="_M_zZ8ZKGEeW9FdUPGRS2og" routing="Rectilinear" jumpLinkStatus="Above"/>
+ <styles xmi:type="notation:FontStyle" xmi:id="_M_zZ8pKGEeW9FdUPGRS2og" fontColor="7490599" fontName="Cantarell" fontHeight="8"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_M_zZ85KGEeW9FdUPGRS2og" points="[1220, 494, 1220, 494]$[1010, 284, 1010, 284]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_M_0oEJKGEeW9FdUPGRS2og" id="(0.5,0.5)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_M_0oEZKGEeW9FdUPGRS2og" id="(0.5,0.5)"/>
+ </edges>
+ <edges xmi:type="notation:Edge" xmi:id="_M_0oEpKGEeW9FdUPGRS2og" type="4001" element="_M-lR8JKGEeW9FdUPGRS2og" source="_M_cNlJKGEeW9FdUPGRS2og" target="_M_QnYJKGEeW9FdUPGRS2og">
+ <children xmi:type="notation:Node" xmi:id="_M_1PIJKGEeW9FdUPGRS2og" type="6001">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_M_1PIZKGEeW9FdUPGRS2og" y="-10"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_M_1PIpKGEeW9FdUPGRS2og" type="6002">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_M_1PI5KGEeW9FdUPGRS2og" y="10"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_M_1PJJKGEeW9FdUPGRS2og" type="6003">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_M_1PJZKGEeW9FdUPGRS2og" y="10"/>
+ </children>
+ <styles xmi:type="notation:ConnectorStyle" xmi:id="_M_0oE5KGEeW9FdUPGRS2og" routing="Rectilinear" jumpLinkStatus="Above"/>
+ <styles xmi:type="notation:FontStyle" xmi:id="_M_0oFJKGEeW9FdUPGRS2og" fontColor="7490599" fontName="Cantarell" fontHeight="8"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_M_0oFZKGEeW9FdUPGRS2og" points="[98, -49, -42, 151]$[98, -105, -42, 95]$[106, -105, -34, 95]$[106, -151, -34, 49]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_M_12MJKGEeW9FdUPGRS2og" id="(0.5,0.5)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_M_12MZKGEeW9FdUPGRS2og" id="(0.2648648648648649,0.94)"/>
+ </edges>
+ <edges xmi:type="notation:Edge" xmi:id="_M_12MpKGEeW9FdUPGRS2og" type="4001" element="_M-mgEJKGEeW9FdUPGRS2og" source="_M_WG9JKGEeW9FdUPGRS2og" target="_M_ZKRJKGEeW9FdUPGRS2og">
+ <children xmi:type="notation:Node" xmi:id="_M_2dQJKGEeW9FdUPGRS2og" type="6001">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_M_2dQZKGEeW9FdUPGRS2og" y="-10"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_M_2dQpKGEeW9FdUPGRS2og" type="6002">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_M_2dQ5KGEeW9FdUPGRS2og" y="10"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_M_2dRJKGEeW9FdUPGRS2og" type="6003">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_M_2dRZKGEeW9FdUPGRS2og" y="10"/>
+ </children>
+ <styles xmi:type="notation:ConnectorStyle" xmi:id="_M_12M5KGEeW9FdUPGRS2og" routing="Rectilinear" jumpLinkStatus="Above"/>
+ <styles xmi:type="notation:FontStyle" xmi:id="_M_12NJKGEeW9FdUPGRS2og" fontColor="7490599" fontName="Cantarell" fontHeight="8"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_M_12NZKGEeW9FdUPGRS2og" points="[1010, 284, 1010, 284]$[1100, 374, 1100, 374]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_M_3EUJKGEeW9FdUPGRS2og" id="(0.5,0.5)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_M_3EUZKGEeW9FdUPGRS2og" id="(0.5,0.5)"/>
+ </edges>
+ <edges xmi:type="notation:Edge" xmi:id="_M_3EUpKGEeW9FdUPGRS2og" type="4001" element="_M-nuMJKGEeW9FdUPGRS2og" source="_M_XVEJKGEeW9FdUPGRS2og" target="_M_eCw5KGEeW9FdUPGRS2og">
+ <children xmi:type="notation:Node" xmi:id="_M_3EVpKGEeW9FdUPGRS2og" type="6001">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_M_3EV5KGEeW9FdUPGRS2og" y="-10"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_M_3rYJKGEeW9FdUPGRS2og" type="6002">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_M_3rYZKGEeW9FdUPGRS2og" y="10"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_M_3rYpKGEeW9FdUPGRS2og" type="6003">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_M_3rY5KGEeW9FdUPGRS2og" y="10"/>
+ </children>
+ <styles xmi:type="notation:ConnectorStyle" xmi:id="_M_3EU5KGEeW9FdUPGRS2og" routing="Rectilinear" jumpLinkStatus="Above"/>
+ <styles xmi:type="notation:FontStyle" xmi:id="_M_3EVJKGEeW9FdUPGRS2og" fontColor="7490599" fontName="Cantarell" fontHeight="8"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_M_3EVZKGEeW9FdUPGRS2og" points="[1040, 314, 1040, 314]$[1280, 554, 1280, 554]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_M_3rZJKGEeW9FdUPGRS2og" id="(0.5,0.5)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_M_4ScJKGEeW9FdUPGRS2og" id="(0.5,0.5)"/>
+ </edges>
+ <edges xmi:type="notation:Edge" xmi:id="_M_5gkJKGEeW9FdUPGRS2og" type="4001" element="_M-qxgJKGEeW9FdUPGRS2og" source="_M_eCw5KGEeW9FdUPGRS2og" target="_M_cNlJKGEeW9FdUPGRS2og">
+ <children xmi:type="notation:Node" xmi:id="_M_5glJKGEeW9FdUPGRS2og" type="6001">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_M_5glZKGEeW9FdUPGRS2og" y="-10"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_M_5glpKGEeW9FdUPGRS2og" type="6002">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_M_5gl5KGEeW9FdUPGRS2og" y="10"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_M_6HoJKGEeW9FdUPGRS2og" type="6003">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_M_6HoZKGEeW9FdUPGRS2og" y="10"/>
+ </children>
+ <styles xmi:type="notation:ConnectorStyle" xmi:id="_M_5gkZKGEeW9FdUPGRS2og" routing="Rectilinear" jumpLinkStatus="Above"/>
+ <styles xmi:type="notation:FontStyle" xmi:id="_M_5gkpKGEeW9FdUPGRS2og" fontColor="7490599" fontName="Cantarell" fontHeight="8"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_M_5gk5KGEeW9FdUPGRS2og" points="[1280, 554, 1280, 554]$[1220, 494, 1220, 494]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_M_6HopKGEeW9FdUPGRS2og" id="(0.5,0.5)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_M_6Ho5KGEeW9FdUPGRS2og" id="(0.5,0.5)"/>
+ </edges>
+ <edges xmi:type="notation:Edge" xmi:id="_M_6HpJKGEeW9FdUPGRS2og" type="4001" element="_M-tNwJKGEeW9FdUPGRS2og" source="_M_Vf45KGEeW9FdUPGRS2og" target="_M_cNlJKGEeW9FdUPGRS2og">
+ <children xmi:type="notation:Node" xmi:id="_M_6usJKGEeW9FdUPGRS2og" type="6001">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_M_6usZKGEeW9FdUPGRS2og" y="-10"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_M_6uspKGEeW9FdUPGRS2og" type="6002">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_M_6us5KGEeW9FdUPGRS2og" y="10"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_M_6utJKGEeW9FdUPGRS2og" type="6003">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_M_6utZKGEeW9FdUPGRS2og" y="10"/>
+ </children>
+ <styles xmi:type="notation:ConnectorStyle" xmi:id="_M_6HpZKGEeW9FdUPGRS2og" routing="Rectilinear"/>
+ <styles xmi:type="notation:FontStyle" xmi:id="_M_6HppKGEeW9FdUPGRS2og" fontName="Cantarell" fontHeight="8"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_M_6Hp5KGEeW9FdUPGRS2og" points="[19, -49, -329, 254]$[19, -174, -329, 129]$[236, -174, -112, 129]$[236, -301, -112, 2]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_M_7VwJKGEeW9FdUPGRS2og" id="(0.5,0.5)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_M_7VwZKGEeW9FdUPGRS2og" id="(0.4554140127388535,0.98)"/>
+ </edges>
+ <edges xmi:type="notation:Edge" xmi:id="_M_8j4pKGEeW9FdUPGRS2og" type="4001" element="_M-vqAJKGEeW9FdUPGRS2og" source="_M_WG9JKGEeW9FdUPGRS2og" target="_M_f38JKGEeW9FdUPGRS2og">
+ <children xmi:type="notation:Node" xmi:id="_M_9K8JKGEeW9FdUPGRS2og" type="6001">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_M_9K8ZKGEeW9FdUPGRS2og" y="-10"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_M_9K8pKGEeW9FdUPGRS2og" type="6002">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_M_9K85KGEeW9FdUPGRS2og" y="10"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_M_9K9JKGEeW9FdUPGRS2og" type="6003">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_M_9K9ZKGEeW9FdUPGRS2og" y="10"/>
+ </children>
+ <styles xmi:type="notation:ConnectorStyle" xmi:id="_M_8j45KGEeW9FdUPGRS2og" routing="Rectilinear"/>
+ <styles xmi:type="notation:FontStyle" xmi:id="_M_8j5JKGEeW9FdUPGRS2og" fontName="Cantarell" fontHeight="8"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_M_8j5ZKGEeW9FdUPGRS2og" points="[-15, -49, 13, 543]$[-15, -586, 13, 6]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_M_9yAJKGEeW9FdUPGRS2og" id="(0.5,0.5)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_M_9yAZKGEeW9FdUPGRS2og" id="(0.5666666666666667,0.94)"/>
+ </edges>
+ <edges xmi:type="notation:Edge" xmi:id="_M_9yApKGEeW9FdUPGRS2og" type="4001" element="_M-w4IJKGEeW9FdUPGRS2og" source="_M_XVEJKGEeW9FdUPGRS2og" target="_M_ZxVJKGEeW9FdUPGRS2og">
+ <children xmi:type="notation:Node" xmi:id="_M_-ZEJKGEeW9FdUPGRS2og" type="6001">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_M_-ZEZKGEeW9FdUPGRS2og" y="-10"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_M_-ZEpKGEeW9FdUPGRS2og" type="6002">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_M_-ZE5KGEeW9FdUPGRS2og" y="10"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_M_-ZFJKGEeW9FdUPGRS2og" type="6003">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_M_-ZFZKGEeW9FdUPGRS2og" y="10"/>
+ </children>
+ <styles xmi:type="notation:ConnectorStyle" xmi:id="_M_9yA5KGEeW9FdUPGRS2og" routing="Rectilinear"/>
+ <styles xmi:type="notation:FontStyle" xmi:id="_M_9yBJKGEeW9FdUPGRS2og" fontName="Cantarell" fontHeight="8"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_M_9yBZKGEeW9FdUPGRS2og" points="[15, -49, -170, 544]$[15, -318, -170, 275]$[202, -318, 17, 275]$[202, -586, 17, 7]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_M__AIJKGEeW9FdUPGRS2og" id="(0.5,0.5)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_M__AIZKGEeW9FdUPGRS2og" id="(0.24166666666666667,0.93)"/>
+ </edges>
+ <edges xmi:type="notation:Edge" xmi:id="_NAAOQpKGEeW9FdUPGRS2og" type="4001" element="_M-ytVpKGEeW9FdUPGRS2og" source="_M_ZKRJKGEeW9FdUPGRS2og" target="_M_f38JKGEeW9FdUPGRS2og">
+ <children xmi:type="notation:Node" xmi:id="_NAAORpKGEeW9FdUPGRS2og" type="6001">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_NAAOR5KGEeW9FdUPGRS2og" y="-10"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_NAA1UJKGEeW9FdUPGRS2og" type="6002">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_NAA1UZKGEeW9FdUPGRS2og" y="10"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_NAA1UpKGEeW9FdUPGRS2og" type="6003">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_NAA1U5KGEeW9FdUPGRS2og" y="10"/>
+ </children>
+ <styles xmi:type="notation:ConnectorStyle" xmi:id="_NAAOQ5KGEeW9FdUPGRS2og" routing="Rectilinear"/>
+ <styles xmi:type="notation:FontStyle" xmi:id="_NAAORJKGEeW9FdUPGRS2og" fontName="Cantarell" fontHeight="8"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_NAAORZKGEeW9FdUPGRS2og" points="[-9, -49, 416, 576]$[-9, -409, 416, 216]$[-379, -409, 46, 216]$[-379, -576, 46, 49]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_NAA1VJKGEeW9FdUPGRS2og" id="(0.5,0.5)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_NAA1VZKGEeW9FdUPGRS2og" id="(0.5,0.5)"/>
+ </edges>
+ <edges xmi:type="notation:Edge" xmi:id="_NACDdJKGEeW9FdUPGRS2og" type="4001" element="_M-1JkJKGEeW9FdUPGRS2og" source="_M_a_cJKGEeW9FdUPGRS2og" target="_M_f38JKGEeW9FdUPGRS2og">
+ <children xmi:type="notation:Node" xmi:id="_NACqgpKGEeW9FdUPGRS2og" type="6001">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_NACqg5KGEeW9FdUPGRS2og" y="-10"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_NACqhJKGEeW9FdUPGRS2og" type="6002">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_NACqhZKGEeW9FdUPGRS2og" y="10"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_NACqhpKGEeW9FdUPGRS2og" type="6003">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_NACqh5KGEeW9FdUPGRS2og" y="10"/>
+ </children>
+ <styles xmi:type="notation:ConnectorStyle" xmi:id="_NACDdZKGEeW9FdUPGRS2og" routing="Rectilinear"/>
+ <styles xmi:type="notation:FontStyle" xmi:id="_NACqgJKGEeW9FdUPGRS2og" fontName="Cantarell" fontHeight="8"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_NACqgZKGEeW9FdUPGRS2og" points="[-13, -49, -83, 359]$[-13, -240, -83, 168]$[91, -240, 21, 168]$[91, -401, 21, 7]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_NADRkJKGEeW9FdUPGRS2og" id="(0.5,0.5)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_NADRkZKGEeW9FdUPGRS2og" id="(0.125,0.93)"/>
+ </edges>
+ <edges xmi:type="notation:Edge" xmi:id="_NAD4oJKGEeW9FdUPGRS2og" type="4001" element="_M-2XsJKGEeW9FdUPGRS2og" source="_M_bmg5KGEeW9FdUPGRS2og" target="_M_cNlJKGEeW9FdUPGRS2og">
+ <children xmi:type="notation:Node" xmi:id="_NAEfsJKGEeW9FdUPGRS2og" type="6001">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_NAEfsZKGEeW9FdUPGRS2og" y="-10"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_NAFGwJKGEeW9FdUPGRS2og" type="6002">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_NAFGwZKGEeW9FdUPGRS2og" y="10"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_NAFGwpKGEeW9FdUPGRS2og" type="6003">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_NAFGw5KGEeW9FdUPGRS2og" y="10"/>
+ </children>
+ <styles xmi:type="notation:ConnectorStyle" xmi:id="_NAD4oZKGEeW9FdUPGRS2og" routing="Rectilinear"/>
+ <styles xmi:type="notation:FontStyle" xmi:id="_NAD4opKGEeW9FdUPGRS2og" fontName="Cantarell" fontHeight="8"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_NAD4o5KGEeW9FdUPGRS2og" points="[1, -49, -54, 277]$[1, -301, -54, 25]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_NAFt0JKGEeW9FdUPGRS2og" id="(0.5,0.5)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_NAFt0ZKGEeW9FdUPGRS2og" id="(0.7834394904458599,0.75)"/>
+ </edges>
+ <edges xmi:type="notation:Edge" xmi:id="_NAFt0pKGEeW9FdUPGRS2og" type="4001" element="_M-3l0JKGEeW9FdUPGRS2og" source="_M_cNlJKGEeW9FdUPGRS2og" target="_M_ZxVJKGEeW9FdUPGRS2og">
+ <children xmi:type="notation:Node" xmi:id="_NAGU4JKGEeW9FdUPGRS2og" type="6001">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_NAGU4ZKGEeW9FdUPGRS2og" y="-10"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_NAGU4pKGEeW9FdUPGRS2og" type="6002">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_NAGU45KGEeW9FdUPGRS2og" y="10"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_NAGU5JKGEeW9FdUPGRS2og" type="6003">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_NAGU5ZKGEeW9FdUPGRS2og" y="10"/>
+ </children>
+ <styles xmi:type="notation:ConnectorStyle" xmi:id="_NAFt05KGEeW9FdUPGRS2og" routing="Rectilinear"/>
+ <styles xmi:type="notation:FontStyle" xmi:id="_NAFt1JKGEeW9FdUPGRS2og" fontName="Cantarell" fontHeight="8"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_NAFt1ZKGEeW9FdUPGRS2og" points="[24, -49, 29, 645]$[24, -596, 29, 98]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_NAG78JKGEeW9FdUPGRS2og" id="(0.5,0.5)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_NAG78ZKGEeW9FdUPGRS2og" id="(0.8083333333333333,0.91)"/>
+ </edges>
+ <edges xmi:type="notation:Edge" xmi:id="_NAG78pKGEeW9FdUPGRS2og" type="4001" element="_M-4z8JKGEeW9FdUPGRS2og" source="_M_dbsJKGEeW9FdUPGRS2og" target="_M_cNlJKGEeW9FdUPGRS2og">
+ <children xmi:type="notation:Node" xmi:id="_NAHjAJKGEeW9FdUPGRS2og" type="6001">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_NAHjAZKGEeW9FdUPGRS2og" y="-10"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_NAHjApKGEeW9FdUPGRS2og" type="6002">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_NAHjA5KGEeW9FdUPGRS2og" y="10"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_NAHjBJKGEeW9FdUPGRS2og" type="6003">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_NAHjBZKGEeW9FdUPGRS2og" y="10"/>
+ </children>
+ <styles xmi:type="notation:ConnectorStyle" xmi:id="_NAG785KGEeW9FdUPGRS2og" routing="Rectilinear"/>
+ <styles xmi:type="notation:FontStyle" xmi:id="_NAG79JKGEeW9FdUPGRS2og" fontName="Cantarell" fontHeight="8"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_NAG79ZKGEeW9FdUPGRS2og" points="[-29, -49, 14, 350]$[-29, -301, 14, 98]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_NAIKEJKGEeW9FdUPGRS2og" id="(0.5,0.5)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_NAIKEZKGEeW9FdUPGRS2og" id="(0.9012738853503185,0.0)"/>
+ </edges>
+ <edges xmi:type="notation:Edge" xmi:id="_NAIKEpKGEeW9FdUPGRS2og" type="4001" element="_M-5bBpKGEeW9FdUPGRS2og" source="_M_eCw5KGEeW9FdUPGRS2og" target="_M_ZxVJKGEeW9FdUPGRS2og">
+ <children xmi:type="notation:Node" xmi:id="_NAIxIJKGEeW9FdUPGRS2og" type="6001">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_NAIxIZKGEeW9FdUPGRS2og" y="-10"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_NAIxIpKGEeW9FdUPGRS2og" type="6002">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_NAIxI5KGEeW9FdUPGRS2og" y="10"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_NAIxJJKGEeW9FdUPGRS2og" type="6003">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_NAIxJZKGEeW9FdUPGRS2og" y="10"/>
+ </children>
+ <styles xmi:type="notation:ConnectorStyle" xmi:id="_NAIKE5KGEeW9FdUPGRS2og" routing="Rectilinear"/>
+ <styles xmi:type="notation:FontStyle" xmi:id="_NAIKFJKGEeW9FdUPGRS2og" fontName="Cantarell" fontHeight="8"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_NAIKFZKGEeW9FdUPGRS2og" points="[-3, -49, 16, 545]$[-3, -591, 16, 3]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_NAJYMJKGEeW9FdUPGRS2og" id="(0.5,0.5)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_NAJYMZKGEeW9FdUPGRS2og" id="(0.5083333333333333,0.97)"/>
+ </edges>
+ <edges xmi:type="notation:Edge" xmi:id="_NAJYMpKGEeW9FdUPGRS2og" type="4001" element="_M-6pIJKGEeW9FdUPGRS2og" source="_M_ep1JKGEeW9FdUPGRS2og" target="_M_cNlJKGEeW9FdUPGRS2og">
+ <children xmi:type="notation:Node" xmi:id="_NAJ_QJKGEeW9FdUPGRS2og" type="6001">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_NAJ_QZKGEeW9FdUPGRS2og" y="-10"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_NAJ_QpKGEeW9FdUPGRS2og" type="6002">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_NAJ_Q5KGEeW9FdUPGRS2og" y="10"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_NAJ_RJKGEeW9FdUPGRS2og" type="6003">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_NAJ_RZKGEeW9FdUPGRS2og" y="10"/>
+ </children>
+ <styles xmi:type="notation:ConnectorStyle" xmi:id="_NAJYM5KGEeW9FdUPGRS2og" routing="Rectilinear"/>
+ <styles xmi:type="notation:FontStyle" xmi:id="_NAJYNJKGEeW9FdUPGRS2og" fontName="Cantarell" fontHeight="8"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_NAJYNZKGEeW9FdUPGRS2og" points="[16, -49, -81, 301]$[16, -301, -81, 49]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_NAKmUJKGEeW9FdUPGRS2og" id="(0.5,0.5)"/>
+ </edges>
+ <edges xmi:type="notation:Edge" xmi:id="_NAKmUpKGEeW9FdUPGRS2og" type="4001" element="_M-8eUJKGEeW9FdUPGRS2og" source="_M_Vf45KGEeW9FdUPGRS2og" target="_M_ep1JKGEeW9FdUPGRS2og">
+ <children xmi:type="notation:Node" xmi:id="_NAKmVpKGEeW9FdUPGRS2og" type="6001">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_NAKmV5KGEeW9FdUPGRS2og" y="-10"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_NALNYJKGEeW9FdUPGRS2og" type="6002">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_NALNYZKGEeW9FdUPGRS2og" x="17" y="14"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_NALNYpKGEeW9FdUPGRS2og" type="6003">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_NALNY5KGEeW9FdUPGRS2og" x="-7" y="14"/>
+ </children>
+ <styles xmi:type="notation:ConnectorStyle" xmi:id="_NAKmU5KGEeW9FdUPGRS2og" routing="Rectilinear" jumpLinkStatus="Above"/>
+ <styles xmi:type="notation:FontStyle" xmi:id="_NAKmVJKGEeW9FdUPGRS2og" fontName="Cantarell" fontHeight="8"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_NAKmVZKGEeW9FdUPGRS2og" points="[980, 254, 980, 254]$[1310, 584, 1310, 584]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_NALNZJKGEeW9FdUPGRS2og" id="(0.5,0.5)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_NALNZZKGEeW9FdUPGRS2og" id="(0.5,0.5)"/>
+ </edges>
+ <edges xmi:type="notation:Edge" xmi:id="_bJF98JKIEeW9FdUPGRS2og" type="4001" element="_bI5JoJKIEeW9FdUPGRS2og" source="_V0JSgJKIEeW9FdUPGRS2og" target="_M_ZxVJKGEeW9FdUPGRS2og">
+ <children xmi:type="notation:Node" xmi:id="_bJGlAJKIEeW9FdUPGRS2og" type="6001">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_bJGlAZKIEeW9FdUPGRS2og" y="-10"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_bJGlApKIEeW9FdUPGRS2og" type="6002">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_bJGlA5KIEeW9FdUPGRS2og" y="10"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_bJHMEJKIEeW9FdUPGRS2og" type="6003">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_bJHMEZKIEeW9FdUPGRS2og" y="10"/>
+ </children>
+ <styles xmi:type="notation:ConnectorStyle" xmi:id="_bJF98ZKIEeW9FdUPGRS2og" routing="Rectilinear"/>
+ <styles xmi:type="notation:FontStyle" xmi:id="_bJF98pKIEeW9FdUPGRS2og" fontName="Cantarell" fontHeight="8"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_bJF985KIEeW9FdUPGRS2og" points="[-16, -49, -422, 583]$[-16, -380, -422, 252]$[400, -380, -6, 252]$[400, -581, -6, 51]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_bJSyQJKIEeW9FdUPGRS2og" id="(0.5,0.5)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_bJSyQZKIEeW9FdUPGRS2og" id="(0.21666666666666667,0.48)"/>
+ </edges>
+ <edges xmi:type="notation:Edge" xmi:id="_hJn9AJKIEeW9FdUPGRS2og" type="4001" element="_M-pjYJKGEeW9FdUPGRS2og" source="_V0JSgJKIEeW9FdUPGRS2og" target="_M_XVEJKGEeW9FdUPGRS2og">
+ <children xmi:type="notation:Node" xmi:id="_hJokEJKIEeW9FdUPGRS2og" type="6001">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_hJokEZKIEeW9FdUPGRS2og" y="-10"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_hJokEpKIEeW9FdUPGRS2og" type="6002">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_hJpLIJKIEeW9FdUPGRS2og" y="10"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_hJpLIZKIEeW9FdUPGRS2og" type="6003">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_hJpLIpKIEeW9FdUPGRS2og" y="10"/>
+ </children>
+ <styles xmi:type="notation:ConnectorStyle" xmi:id="_hJn9AZKIEeW9FdUPGRS2og" routing="Rectilinear" jumpLinkStatus="Above"/>
+ <styles xmi:type="notation:FontStyle" xmi:id="_hJn9ApKIEeW9FdUPGRS2og" fontColor="7490599" fontName="Cantarell" fontHeight="8"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_hJn9A5KIEeW9FdUPGRS2og" points="[168, 200, 168, 200]$[280, 380, 280, 380]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_hJpyMJKIEeW9FdUPGRS2og" id="(0.5,0.5)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_hJpyMZKIEeW9FdUPGRS2og" id="(0.5,0.5)"/>
+ </edges>
+ <edges xmi:type="notation:Edge" xmi:id="_o6ssoJKIEeW9FdUPGRS2og" type="4001" element="_o5lSUJKIEeW9FdUPGRS2og" source="_M_YjMJKGEeW9FdUPGRS2og" target="_V0JSgJKIEeW9FdUPGRS2og">
+ <children xmi:type="notation:Node" xmi:id="_o6tTsJKIEeW9FdUPGRS2og" type="6001">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_o6tTsZKIEeW9FdUPGRS2og" y="-10"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_o6t6wJKIEeW9FdUPGRS2og" type="6002">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_o6t6wZKIEeW9FdUPGRS2og" y="10"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_o6t6wpKIEeW9FdUPGRS2og" type="6003">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_o6t6w5KIEeW9FdUPGRS2og" y="10"/>
+ </children>
+ <styles xmi:type="notation:ConnectorStyle" xmi:id="_o6ssoZKIEeW9FdUPGRS2og" routing="Rectilinear" jumpLinkStatus="Above"/>
+ <styles xmi:type="notation:FontStyle" xmi:id="_o6ssopKIEeW9FdUPGRS2og" fontColor="7490599" fontName="Cantarell" fontHeight="8"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_o6sso5KIEeW9FdUPGRS2og" points="[59, 0, -196, 0]$[196, 0, -59, 0]"/>
+ </edges>
+ <edges xmi:type="notation:Edge" xmi:id="_T15LMJKKEeW9FdUPGRS2og" type="4001" element="_T1rv0JKKEeW9FdUPGRS2og" source="_M_f38JKGEeW9FdUPGRS2og" target="_M_ZxVJKGEeW9FdUPGRS2og">
+ <children xmi:type="notation:Node" xmi:id="_T15yQJKKEeW9FdUPGRS2og" type="6001">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_T15yQZKKEeW9FdUPGRS2og" y="-10"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_T15yQpKKEeW9FdUPGRS2og" type="6002">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_T15yQ5KKEeW9FdUPGRS2og" y="10"/>
+ </children>
+ <children xmi:type="notation:Node" xmi:id="_T16ZUJKKEeW9FdUPGRS2og" type="6003">
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_T16ZUZKKEeW9FdUPGRS2og" y="10"/>
+ </children>
+ <styles xmi:type="notation:ConnectorStyle" xmi:id="_T15LMZKKEeW9FdUPGRS2og" routing="Rectilinear"/>
+ <styles xmi:type="notation:FontStyle" xmi:id="_T15LMpKKEeW9FdUPGRS2og" fontName="Cantarell" fontHeight="8"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_T15LM5KKEeW9FdUPGRS2og" points="[-1, 49, 724, 44]$[-1, 11, 724, 6]$[-724, 11, 1, 6]$[-724, 54, 1, 49]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_T16ZUpKKEeW9FdUPGRS2og" id="(0.5,0.5)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_T16ZU5KKEeW9FdUPGRS2og" id="(0.5,0.5)"/>
+ </edges>
+ </data>
+ </ownedAnnotationEntries>
+ <ownedAnnotationEntries xmi:type="description:AnnotationEntry" xmi:id="_M-fLUJKGEeW9FdUPGRS2og" source="DANNOTATION_CUSTOMIZATION_KEY">
+ <data xmi:type="diagram:ComputedStyleDescriptionRegistry" xmi:id="_M-fyYJKGEeW9FdUPGRS2og">
+ <computedStyleDescriptions xmi:type="style:EdgeStyleDescription" xmi:id="_M-hAgZKGEeW9FdUPGRS2og" sourceArrow="FillDiamond" sizeComputationExpression="1" routingStyle="manhattan">
+ <strokeColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+ <centerLabelStyleDescription xmi:type="style:CenterLabelStyleDescription" xmi:id="_M-hAgpKGEeW9FdUPGRS2og" showIcon="false" labelExpression="service:render">
+ <labelColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+ </centerLabelStyleDescription>
+ <endLabelStyleDescription xmi:type="style:EndLabelStyleDescription" xmi:id="_M-hAg5KGEeW9FdUPGRS2og" labelSize="6" showIcon="false" labelExpression="service:eKeysLabel">
+ <labelColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='dark_blue']"/>
+ </endLabelStyleDescription>
+ </computedStyleDescriptions>
+ <computedStyleDescriptions xmi:type="style:EdgeStyleDescription" xmi:id="_M-kD0pKGEeW9FdUPGRS2og" sourceArrow="FillDiamond" sizeComputationExpression="1" routingStyle="manhattan">
+ <strokeColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+ <centerLabelStyleDescription xmi:type="style:CenterLabelStyleDescription" xmi:id="_M-kD05KGEeW9FdUPGRS2og" showIcon="false" labelExpression="service:render">
+ <labelColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+ </centerLabelStyleDescription>
+ <endLabelStyleDescription xmi:type="style:EndLabelStyleDescription" xmi:id="_M-kD1JKGEeW9FdUPGRS2og" labelSize="6" showIcon="false" labelExpression="service:eKeysLabel">
+ <labelColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='dark_blue']"/>
+ </endLabelStyleDescription>
+ </computedStyleDescriptions>
+ <computedStyleDescriptions xmi:type="style:EdgeStyleDescription" xmi:id="_M-l5ApKGEeW9FdUPGRS2og" sourceArrow="FillDiamond" sizeComputationExpression="1" routingStyle="manhattan">
+ <strokeColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+ <centerLabelStyleDescription xmi:type="style:CenterLabelStyleDescription" xmi:id="_M-l5A5KGEeW9FdUPGRS2og" showIcon="false" labelExpression="service:render">
+ <labelColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+ </centerLabelStyleDescription>
+ <endLabelStyleDescription xmi:type="style:EndLabelStyleDescription" xmi:id="_M-l5BJKGEeW9FdUPGRS2og" labelSize="6" showIcon="false" labelExpression="service:eKeysLabel">
+ <labelColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='dark_blue']"/>
+ </endLabelStyleDescription>
+ </computedStyleDescriptions>
+ <computedStyleDescriptions xmi:type="style:EdgeStyleDescription" xmi:id="_M-nHIpKGEeW9FdUPGRS2og" sourceArrow="FillDiamond" sizeComputationExpression="1" routingStyle="manhattan">
+ <strokeColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+ <centerLabelStyleDescription xmi:type="style:CenterLabelStyleDescription" xmi:id="_M-nHI5KGEeW9FdUPGRS2og" showIcon="false" labelExpression="service:render">
+ <labelColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+ </centerLabelStyleDescription>
+ <endLabelStyleDescription xmi:type="style:EndLabelStyleDescription" xmi:id="_M-nHJJKGEeW9FdUPGRS2og" labelSize="6" showIcon="false" labelExpression="service:eKeysLabel">
+ <labelColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='dark_blue']"/>
+ </endLabelStyleDescription>
+ </computedStyleDescriptions>
+ <computedStyleDescriptions xmi:type="style:EdgeStyleDescription" xmi:id="_M-oVQpKGEeW9FdUPGRS2og" sourceArrow="FillDiamond" sizeComputationExpression="1" routingStyle="manhattan">
+ <strokeColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+ <centerLabelStyleDescription xmi:type="style:CenterLabelStyleDescription" xmi:id="_M-oVQ5KGEeW9FdUPGRS2og" showIcon="false" labelExpression="service:render">
+ <labelColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+ </centerLabelStyleDescription>
+ <endLabelStyleDescription xmi:type="style:EndLabelStyleDescription" xmi:id="_M-oVRJKGEeW9FdUPGRS2og" labelSize="6" showIcon="false" labelExpression="service:eKeysLabel">
+ <labelColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='dark_blue']"/>
+ </endLabelStyleDescription>
+ </computedStyleDescriptions>
+ <computedStyleDescriptions xmi:type="style:EdgeStyleDescription" xmi:id="_M-rYkpKGEeW9FdUPGRS2og" sourceArrow="FillDiamond" sizeComputationExpression="1" routingStyle="manhattan">
+ <strokeColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+ <centerLabelStyleDescription xmi:type="style:CenterLabelStyleDescription" xmi:id="_M-rYk5KGEeW9FdUPGRS2og" showIcon="false" labelExpression="service:render">
+ <labelColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+ </centerLabelStyleDescription>
+ <endLabelStyleDescription xmi:type="style:EndLabelStyleDescription" xmi:id="_M-rYlJKGEeW9FdUPGRS2og" labelSize="6" showIcon="false" labelExpression="service:eKeysLabel">
+ <labelColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='dark_blue']"/>
+ </endLabelStyleDescription>
+ </computedStyleDescriptions>
+ <computedStyleDescriptions xmi:type="style:EdgeStyleDescription" xmi:id="_hKwlcpKIEeW9FdUPGRS2og" sourceArrow="FillDiamond" sizeComputationExpression="1" routingStyle="manhattan">
+ <strokeColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+ <centerLabelStyleDescription xmi:type="style:CenterLabelStyleDescription" xmi:id="_hKwlc5KIEeW9FdUPGRS2og" showIcon="false" labelExpression="service:render">
+ <labelColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+ </centerLabelStyleDescription>
+ <endLabelStyleDescription xmi:type="style:EndLabelStyleDescription" xmi:id="_hKwldJKIEeW9FdUPGRS2og" labelSize="6" showIcon="false" labelExpression="service:eKeysLabel">
+ <labelColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='dark_blue']"/>
+ </endLabelStyleDescription>
+ </computedStyleDescriptions>
+ <computedStyleDescriptions xmi:type="style:EdgeStyleDescription" xmi:id="_Pj4Y4pKJEeW9FdUPGRS2og" sourceArrow="FillDiamond" sizeComputationExpression="1" routingStyle="manhattan">
+ <strokeColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+ <centerLabelStyleDescription xmi:type="style:CenterLabelStyleDescription" xmi:id="_Pj4Y45KJEeW9FdUPGRS2og" showIcon="false" labelExpression="service:render">
+ <labelColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+ </centerLabelStyleDescription>
+ <endLabelStyleDescription xmi:type="style:EndLabelStyleDescription" xmi:id="_Pj4Y5JKJEeW9FdUPGRS2og" labelSize="6" showIcon="false" labelExpression="service:eKeysLabel">
+ <labelColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='dark_blue']"/>
+ </endLabelStyleDescription>
+ </computedStyleDescriptions>
+ <cache xmi:type="diagram:DiagramElementMapping2ModelElement" xmi:id="_M-gZcJKGEeW9FdUPGRS2og">
+ <key xmi:type="description_1: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="_M-gZcZKGEeW9FdUPGRS2og">
+ <key xmi:type="ecore:EReference" href="resource.ecore#//AccessMethod/parameter"/>
+ <value xmi:type="diagram:ViewVariable2ContainerVariable" xmi:id="_M-hAgJKGEeW9FdUPGRS2og" key="_M-d9MJKGEeW9FdUPGRS2og">
+ <value xmi:type="diagram:ContainerVariable2StyleDescription" xmi:id="_M-hAhJKGEeW9FdUPGRS2og" value="_M-hAgZKGEeW9FdUPGRS2og">
+ <key xmi:type="ecore:EPackage" href="resource.ecore#/"/>
+ </value>
+ </value>
+ </value>
+ <value xmi:type="diagram:ModelElement2ViewVariable" xmi:id="_M-kD0JKGEeW9FdUPGRS2og">
+ <key xmi:type="ecore:EReference" href="resource.ecore#//Resource/attribute"/>
+ <value xmi:type="diagram:ViewVariable2ContainerVariable" xmi:id="_M-kD0ZKGEeW9FdUPGRS2og" key="_M-jcwJKGEeW9FdUPGRS2og">
+ <value xmi:type="diagram:ContainerVariable2StyleDescription" xmi:id="_M-kq4JKGEeW9FdUPGRS2og" value="_M-kD0pKGEeW9FdUPGRS2og">
+ <key xmi:type="ecore:EPackage" href="resource.ecore#/"/>
+ </value>
+ </value>
+ </value>
+ <value xmi:type="diagram:ModelElement2ViewVariable" xmi:id="_M-l5AJKGEeW9FdUPGRS2og">
+ <key xmi:type="ecore:EReference" href="resource.ecore#//Resource/accessMethod"/>
+ <value xmi:type="diagram:ViewVariable2ContainerVariable" xmi:id="_M-l5AZKGEeW9FdUPGRS2og" key="_M-lR8JKGEeW9FdUPGRS2og">
+ <value xmi:type="diagram:ContainerVariable2StyleDescription" xmi:id="_M-l5BZKGEeW9FdUPGRS2og" value="_M-l5ApKGEeW9FdUPGRS2og">
+ <key xmi:type="ecore:EPackage" href="resource.ecore#/"/>
+ </value>
+ </value>
+ </value>
+ <value xmi:type="diagram:ModelElement2ViewVariable" xmi:id="_M-nHIJKGEeW9FdUPGRS2og">
+ <key xmi:type="ecore:EReference" href="resource.ecore#//Attribute/metadata"/>
+ <value xmi:type="diagram:ViewVariable2ContainerVariable" xmi:id="_M-nHIZKGEeW9FdUPGRS2og" key="_M-mgEJKGEeW9FdUPGRS2og">
+ <value xmi:type="diagram:ContainerVariable2StyleDescription" xmi:id="_M-nHJZKGEeW9FdUPGRS2og" value="_M-nHIpKGEeW9FdUPGRS2og">
+ <key xmi:type="ecore:EPackage" href="resource.ecore#/"/>
+ </value>
+ </value>
+ </value>
+ <value xmi:type="diagram:ModelElement2ViewVariable" xmi:id="_M-oVQJKGEeW9FdUPGRS2og">
+ <key xmi:type="ecore:EReference" href="resource.ecore#//Device/service"/>
+ <value xmi:type="diagram:ViewVariable2ContainerVariable" xmi:id="_M-oVQZKGEeW9FdUPGRS2og" key="_M-nuMJKGEeW9FdUPGRS2og">
+ <value xmi:type="diagram:ContainerVariable2StyleDescription" xmi:id="_M-o8UJKGEeW9FdUPGRS2og" value="_M-oVQpKGEeW9FdUPGRS2og">
+ <key xmi:type="ecore:EPackage" href="resource.ecore#/"/>
+ </value>
+ </value>
+ </value>
+ <value xmi:type="diagram:ModelElement2ViewVariable" xmi:id="_M-rYkJKGEeW9FdUPGRS2og">
+ <key xmi:type="ecore:EReference" href="resource.ecore#//Service/resource"/>
+ <value xmi:type="diagram:ViewVariable2ContainerVariable" xmi:id="_M-rYkZKGEeW9FdUPGRS2og" key="_M-qxgJKGEeW9FdUPGRS2og">
+ <value xmi:type="diagram:ContainerVariable2StyleDescription" xmi:id="_M-rYlZKGEeW9FdUPGRS2og" value="_M-rYkpKGEeW9FdUPGRS2og">
+ <key xmi:type="ecore:EPackage" href="resource.ecore#/"/>
+ </value>
+ </value>
+ </value>
+ <value xmi:type="diagram:ModelElement2ViewVariable" xmi:id="_hKwlcJKIEeW9FdUPGRS2og">
+ <key xmi:type="ecore:EReference" href="resource.ecore#//Gateway/device"/>
+ <value xmi:type="diagram:ViewVariable2ContainerVariable" xmi:id="_hKwlcZKIEeW9FdUPGRS2og" key="_M-pjYJKGEeW9FdUPGRS2og">
+ <value xmi:type="diagram:ContainerVariable2StyleDescription" xmi:id="_hKxMgJKIEeW9FdUPGRS2og" value="_hKwlcpKIEeW9FdUPGRS2og">
+ <key xmi:type="ecore:EPackage" href="resource.ecore#/"/>
+ </value>
+ </value>
+ </value>
+ <value xmi:type="diagram:ModelElement2ViewVariable" xmi:id="_Pj4Y4JKJEeW9FdUPGRS2og">
+ <key xmi:type="ecore:EReference" href="resource.ecore#//Studio/gateways"/>
+ <value xmi:type="diagram:ViewVariable2ContainerVariable" xmi:id="_Pj4Y4ZKJEeW9FdUPGRS2og" key="_o5lSUJKIEeW9FdUPGRS2og">
+ <value xmi:type="diagram:ContainerVariable2StyleDescription" xmi:id="_Pj4_8JKJEeW9FdUPGRS2og" value="_Pj4Y4pKJEeW9FdUPGRS2og">
+ <key xmi:type="ecore:EPackage" href="resource.ecore#/"/>
+ </value>
+ </value>
+ </value>
+ </cache>
+ </data>
+ </ownedAnnotationEntries>
+ <ownedDiagramElements xmi:type="diagram:DNodeList" xmi:id="_M8r0gJKGEeW9FdUPGRS2og" name="AccessMethod" tooltipText="" outgoingEdges="_M-d9MJKGEeW9FdUPGRS2og" incomingEdges="_M-lR8JKGEeW9FdUPGRS2og" width="12" height="10">
+ <target xmi:type="ecore:EClass" href="resource.ecore#//AccessMethod"/>
+ <semanticElements xmi:type="ecore:EClass" href="resource.ecore#//AccessMethod"/>
+ <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
+ <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
+ <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
+ <ownedStyle xmi:type="diagram:FlatContainerStyle" xmi:id="_M8xUEJKGEeW9FdUPGRS2og" backgroundStyle="Liquid">
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_M8xUEZKGEeW9FdUPGRS2og"/>
+ <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="_M8xUEpKGEeW9FdUPGRS2og"/>
+ <backgroundColor xmi:type="viewpoint:RGBValues" xmi:id="_M8xUE5KGEeW9FdUPGRS2og" red="255" green="255" blue="255"/>
+ <foregroundColor xmi:type="viewpoint:RGBValues" xmi:id="_M8xUFJKGEeW9FdUPGRS2og" red="255" green="252" blue="216"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1: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="_M-E7oJKGEeW9FdUPGRS2og" name="type : AccessMethodType = GET" tooltipText="">
+ <target xmi:type="ecore:EAttribute" href="resource.ecore#//AccessMethod/type"/>
+ <semanticElements xmi:type="ecore:EAttribute" href="resource.ecore#//AccessMethod/type"/>
+ <ownedStyle xmi:type="diagram:BundledImage" xmi:id="_M-Gw0JKGEeW9FdUPGRS2og" labelAlignment="LEFT">
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_M-Gw0ZKGEeW9FdUPGRS2og"/>
+ <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="_M-Gw0pKGEeW9FdUPGRS2og"/>
+ <color xmi:type="viewpoint:RGBValues" xmi:id="_M-Gw05KGEeW9FdUPGRS2og"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1: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="_M80XYJKGEeW9FdUPGRS2og" name="AccessMethodType" tooltipText="">
+ <target xmi:type="ecore:EEnum" href="resource.ecore#//AccessMethodType"/>
+ <semanticElements xmi:type="ecore:EEnum" href="resource.ecore#//AccessMethodType"/>
+ <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
+ <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
+ <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
+ <ownedStyle xmi:type="diagram:FlatContainerStyle" xmi:id="_M80-cJKGEeW9FdUPGRS2og" backgroundStyle="Liquid">
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_M80-cZKGEeW9FdUPGRS2og"/>
+ <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%20EEnum']/@style"/>
+ <borderColor xmi:type="viewpoint:RGBValues" xmi:id="_M80-cpKGEeW9FdUPGRS2og" red="125" green="125" blue="125"/>
+ <backgroundColor xmi:type="viewpoint:RGBValues" xmi:id="_M80-c5KGEeW9FdUPGRS2og" red="255" green="255" blue="255"/>
+ <foregroundColor xmi:type="viewpoint:RGBValues" xmi:id="_M80-dJKGEeW9FdUPGRS2og" red="221" green="236" blue="202"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1:ContainerMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']"/>
+ <ownedElements xmi:type="diagram:DNodeListElement" xmi:id="_M-TlIJKGEeW9FdUPGRS2og" name="GET" tooltipText="">
+ <target xmi:type="ecore:EEnumLiteral" href="resource.ecore#//AccessMethodType/GET"/>
+ <semanticElements xmi:type="ecore:EEnumLiteral" href="resource.ecore#//AccessMethodType/GET"/>
+ <ownedStyle xmi:type="diagram:BundledImage" xmi:id="_M-UMMJKGEeW9FdUPGRS2og" labelAlignment="LEFT">
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_M-UMMZKGEeW9FdUPGRS2og"/>
+ <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%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']/@style"/>
+ <borderColor xmi:type="viewpoint:RGBValues" xmi:id="_M-UMMpKGEeW9FdUPGRS2og"/>
+ <color xmi:type="viewpoint:RGBValues" xmi:id="_M-UMM5KGEeW9FdUPGRS2og"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']"/>
+ </ownedElements>
+ <ownedElements xmi:type="diagram:DNodeListElement" xmi:id="_M-UzQJKGEeW9FdUPGRS2og" name="SET" tooltipText="">
+ <target xmi:type="ecore:EEnumLiteral" href="resource.ecore#//AccessMethodType/SET"/>
+ <semanticElements xmi:type="ecore:EEnumLiteral" href="resource.ecore#//AccessMethodType/SET"/>
+ <ownedStyle xmi:type="diagram:BundledImage" xmi:id="_M-UzQZKGEeW9FdUPGRS2og" labelAlignment="LEFT">
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_M-UzQpKGEeW9FdUPGRS2og"/>
+ <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%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']/@style"/>
+ <borderColor xmi:type="viewpoint:RGBValues" xmi:id="_M-UzQ5KGEeW9FdUPGRS2og"/>
+ <color xmi:type="viewpoint:RGBValues" xmi:id="_M-UzRJKGEeW9FdUPGRS2og"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']"/>
+ </ownedElements>
+ <ownedElements xmi:type="diagram:DNodeListElement" xmi:id="_M-VaUJKGEeW9FdUPGRS2og" name="ACT" tooltipText="">
+ <target xmi:type="ecore:EEnumLiteral" href="resource.ecore#//AccessMethodType/ACT"/>
+ <semanticElements xmi:type="ecore:EEnumLiteral" href="resource.ecore#//AccessMethodType/ACT"/>
+ <ownedStyle xmi:type="diagram:BundledImage" xmi:id="_M-VaUZKGEeW9FdUPGRS2og" labelAlignment="LEFT">
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_M-VaUpKGEeW9FdUPGRS2og"/>
+ <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%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']/@style"/>
+ <borderColor xmi:type="viewpoint:RGBValues" xmi:id="_M-VaU5KGEeW9FdUPGRS2og"/>
+ <color xmi:type="viewpoint:RGBValues" xmi:id="_M-VaVJKGEeW9FdUPGRS2og"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']"/>
+ </ownedElements>
+ <ownedElements xmi:type="diagram:DNodeListElement" xmi:id="_M-WBYJKGEeW9FdUPGRS2og" name="SUBSCRIBE" tooltipText="">
+ <target xmi:type="ecore:EEnumLiteral" href="resource.ecore#//AccessMethodType/SUBSCRIBE"/>
+ <semanticElements xmi:type="ecore:EEnumLiteral" href="resource.ecore#//AccessMethodType/SUBSCRIBE"/>
+ <ownedStyle xmi:type="diagram:BundledImage" xmi:id="_M-WBYZKGEeW9FdUPGRS2og" labelAlignment="LEFT">
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_M-WBYpKGEeW9FdUPGRS2og"/>
+ <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%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']/@style"/>
+ <borderColor xmi:type="viewpoint:RGBValues" xmi:id="_M-WBY5KGEeW9FdUPGRS2og"/>
+ <color xmi:type="viewpoint:RGBValues" xmi:id="_M-WBZJKGEeW9FdUPGRS2og"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']"/>
+ </ownedElements>
+ <ownedElements xmi:type="diagram:DNodeListElement" xmi:id="_M-WocJKGEeW9FdUPGRS2og" name="UNSUBSCRIBE" tooltipText="">
+ <target xmi:type="ecore:EEnumLiteral" href="resource.ecore#//AccessMethodType/UNSUBSCRIBE"/>
+ <semanticElements xmi:type="ecore:EEnumLiteral" href="resource.ecore#//AccessMethodType/UNSUBSCRIBE"/>
+ <ownedStyle xmi:type="diagram:BundledImage" xmi:id="_M-WocZKGEeW9FdUPGRS2og" labelAlignment="LEFT">
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_M-WocpKGEeW9FdUPGRS2og"/>
+ <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%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']/@style"/>
+ <borderColor xmi:type="viewpoint:RGBValues" xmi:id="_M-Woc5KGEeW9FdUPGRS2og"/>
+ <color xmi:type="viewpoint:RGBValues" xmi:id="_M-WodJKGEeW9FdUPGRS2og"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EEnum']/@subNodeMappings[name='EC%20EEnumLiteral']"/>
+ </ownedElements>
+ </ownedDiagramElements>
+ <ownedDiagramElements xmi:type="diagram:DNodeList" xmi:id="_M82zoJKGEeW9FdUPGRS2og" name="Action" tooltipText="" outgoingEdges="_M-tNwJKGEeW9FdUPGRS2og _M-8eUJKGEeW9FdUPGRS2og" width="12" height="10">
+ <target xmi:type="ecore:EClass" href="resource.ecore#//Action"/>
+ <semanticElements xmi:type="ecore:EClass" href="resource.ecore#//Action"/>
+ <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
+ <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
+ <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
+ <ownedStyle xmi:type="diagram:FlatContainerStyle" xmi:id="_M84o0JKGEeW9FdUPGRS2og" backgroundStyle="Liquid">
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_M84o0ZKGEeW9FdUPGRS2og"/>
+ <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="_M84o0pKGEeW9FdUPGRS2og"/>
+ <backgroundColor xmi:type="viewpoint:RGBValues" xmi:id="_M84o05KGEeW9FdUPGRS2og" red="255" green="255" blue="255"/>
+ <foregroundColor xmi:type="viewpoint:RGBValues" xmi:id="_M84o1JKGEeW9FdUPGRS2og" red="255" green="252" blue="216"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1: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="_M8528JKGEeW9FdUPGRS2og" name="Attribute" tooltipText="" outgoingEdges="_M-mgEJKGEeW9FdUPGRS2og _M-vqAJKGEeW9FdUPGRS2og" incomingEdges="_M-jcwJKGEeW9FdUPGRS2og" width="12" height="10">
+ <target xmi:type="ecore:EClass" href="resource.ecore#//Attribute"/>
+ <semanticElements xmi:type="ecore:EClass" href="resource.ecore#//Attribute"/>
+ <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
+ <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
+ <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
+ <ownedStyle xmi:type="diagram:FlatContainerStyle" xmi:id="_M87FEJKGEeW9FdUPGRS2og" backgroundStyle="Liquid">
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_M87FEZKGEeW9FdUPGRS2og"/>
+ <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="_M87FEpKGEeW9FdUPGRS2og"/>
+ <backgroundColor xmi:type="viewpoint:RGBValues" xmi:id="_M87FE5KGEeW9FdUPGRS2og" red="255" green="255" blue="255"/>
+ <foregroundColor xmi:type="viewpoint:RGBValues" xmi:id="_M87FFJKGEeW9FdUPGRS2og" red="255" green="252" blue="216"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1: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="_M886QJKGEeW9FdUPGRS2og" name="Device" tooltipText="" outgoingEdges="_M-nuMJKGEeW9FdUPGRS2og _M-w4IJKGEeW9FdUPGRS2og" incomingEdges="_M-pjYJKGEeW9FdUPGRS2og" width="12" height="10">
+ <target xmi:type="ecore:EClass" href="resource.ecore#//Device"/>
+ <semanticElements xmi:type="ecore:EClass" href="resource.ecore#//Device"/>
+ <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
+ <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
+ <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
+ <ownedStyle xmi:type="diagram:FlatContainerStyle" xmi:id="_M8-IYJKGEeW9FdUPGRS2og" backgroundStyle="Liquid">
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_M8-IYZKGEeW9FdUPGRS2og"/>
+ <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="_M8-IYpKGEeW9FdUPGRS2og"/>
+ <backgroundColor xmi:type="viewpoint:RGBValues" xmi:id="_M8-IY5KGEeW9FdUPGRS2og" red="255" green="255" blue="255"/>
+ <foregroundColor xmi:type="viewpoint:RGBValues" xmi:id="_M8-IZJKGEeW9FdUPGRS2og" red="255" green="252" blue="216"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1: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="_M-ImAJKGEeW9FdUPGRS2og" name="friendlyName : EString" tooltipText="">
+ <target xmi:type="ecore:EAttribute" href="resource.ecore#//Device/friendlyName"/>
+ <semanticElements xmi:type="ecore:EAttribute" href="resource.ecore#//Device/friendlyName"/>
+ <ownedStyle xmi:type="diagram:BundledImage" xmi:id="_M-JNEJKGEeW9FdUPGRS2og" labelAlignment="LEFT">
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_M-JNEZKGEeW9FdUPGRS2og"/>
+ <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="_M-JNEpKGEeW9FdUPGRS2og"/>
+ <color xmi:type="viewpoint:RGBValues" xmi:id="_M-JNE5KGEeW9FdUPGRS2og"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1: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="_M8_WgJKGEeW9FdUPGRS2og" name="Studio" tooltipText="" outgoingEdges="_o5lSUJKIEeW9FdUPGRS2og" width="12" height="10">
+ <target xmi:type="ecore:EClass" href="resource.ecore#//Studio"/>
+ <semanticElements xmi:type="ecore:EClass" href="resource.ecore#//Studio"/>
+ <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
+ <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
+ <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
+ <ownedStyle xmi:type="diagram:FlatContainerStyle" xmi:id="_M9AkoJKGEeW9FdUPGRS2og" backgroundStyle="Liquid">
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_M9AkoZKGEeW9FdUPGRS2og"/>
+ <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="_M9AkopKGEeW9FdUPGRS2og"/>
+ <backgroundColor xmi:type="viewpoint:RGBValues" xmi:id="_M9Ako5KGEeW9FdUPGRS2og" red="255" green="255" blue="255"/>
+ <foregroundColor xmi:type="viewpoint:RGBValues" xmi:id="_M9AkpJKGEeW9FdUPGRS2og" red="255" green="252" blue="216"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1: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="_M9BywJKGEeW9FdUPGRS2og" name="Metadata" tooltipText="" outgoingEdges="_M-ytVpKGEeW9FdUPGRS2og" incomingEdges="_M-mgEJKGEeW9FdUPGRS2og" width="12" height="10">
+ <target xmi:type="ecore:EClass" href="resource.ecore#//Metadata"/>
+ <semanticElements xmi:type="ecore:EClass" href="resource.ecore#//Metadata"/>
+ <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
+ <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
+ <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
+ <ownedStyle xmi:type="diagram:FlatContainerStyle" xmi:id="_M9DA4JKGEeW9FdUPGRS2og" backgroundStyle="Liquid">
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_M9DA4ZKGEeW9FdUPGRS2og"/>
+ <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="_M9DA4pKGEeW9FdUPGRS2og"/>
+ <backgroundColor xmi:type="viewpoint:RGBValues" xmi:id="_M9DA45KGEeW9FdUPGRS2og" red="255" green="255" blue="255"/>
+ <foregroundColor xmi:type="viewpoint:RGBValues" xmi:id="_M9DA5JKGEeW9FdUPGRS2og" red="255" green="252" blue="216"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1: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="_M9EPAJKGEeW9FdUPGRS2og" name="NamedElement" tooltipText="" incomingEdges="_M-w4IJKGEeW9FdUPGRS2og _M-3l0JKGEeW9FdUPGRS2og _M-5bBpKGEeW9FdUPGRS2og _bI5JoJKIEeW9FdUPGRS2og _T1rv0JKKEeW9FdUPGRS2og" width="12" height="10">
+ <target xmi:type="ecore:EClass" href="resource.ecore#//NamedElement"/>
+ <semanticElements xmi:type="ecore:EClass" href="resource.ecore#//NamedElement"/>
+ <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
+ <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
+ <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
+ <ownedStyle xmi:type="diagram:FlatContainerStyle" xmi:id="_M9FdIJKGEeW9FdUPGRS2og" backgroundStyle="Liquid">
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_M9FdIZKGEeW9FdUPGRS2og"/>
+ <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="_M9FdIpKGEeW9FdUPGRS2og"/>
+ <backgroundColor xmi:type="viewpoint:RGBValues" xmi:id="_M9FdI5KGEeW9FdUPGRS2og" red="255" green="255" blue="255"/>
+ <foregroundColor xmi:type="viewpoint:RGBValues" xmi:id="_M9FdJJKGEeW9FdUPGRS2og" red="255" green="252" blue="216"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1: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="_M-KbMJKGEeW9FdUPGRS2og" name="name : EString" tooltipText="">
+ <target xmi:type="ecore:EAttribute" href="resource.ecore#//NamedElement/name"/>
+ <semanticElements xmi:type="ecore:EAttribute" href="resource.ecore#//NamedElement/name"/>
+ <ownedStyle xmi:type="diagram:BundledImage" xmi:id="_M-LCQJKGEeW9FdUPGRS2og" labelAlignment="LEFT">
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_M-LCQZKGEeW9FdUPGRS2og"/>
+ <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="_M-LCQpKGEeW9FdUPGRS2og"/>
+ <color xmi:type="viewpoint:RGBValues" xmi:id="_M-LCQ5KGEeW9FdUPGRS2og"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1: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="_M9GrQJKGEeW9FdUPGRS2og" name="Parameter" tooltipText="" outgoingEdges="_M-1JkJKGEeW9FdUPGRS2og" incomingEdges="_M-d9MJKGEeW9FdUPGRS2og" width="12" height="10">
+ <target xmi:type="ecore:EClass" href="resource.ecore#//Parameter"/>
+ <semanticElements xmi:type="ecore:EClass" href="resource.ecore#//Parameter"/>
+ <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
+ <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
+ <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
+ <ownedStyle xmi:type="diagram:FlatContainerStyle" xmi:id="_M9H5YJKGEeW9FdUPGRS2og" backgroundStyle="Liquid">
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_M9H5YZKGEeW9FdUPGRS2og"/>
+ <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="_M9H5YpKGEeW9FdUPGRS2og"/>
+ <backgroundColor xmi:type="viewpoint:RGBValues" xmi:id="_M9H5Y5KGEeW9FdUPGRS2og" red="255" green="255" blue="255"/>
+ <foregroundColor xmi:type="viewpoint:RGBValues" xmi:id="_M9H5ZJKGEeW9FdUPGRS2og" red="255" green="252" blue="216"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1: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="_M9JHgJKGEeW9FdUPGRS2og" name="Property" tooltipText="" outgoingEdges="_M-2XsJKGEeW9FdUPGRS2og" width="12" height="10">
+ <target xmi:type="ecore:EClass" href="resource.ecore#//Property"/>
+ <semanticElements xmi:type="ecore:EClass" href="resource.ecore#//Property"/>
+ <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
+ <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
+ <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
+ <ownedStyle xmi:type="diagram:FlatContainerStyle" xmi:id="_M9JukJKGEeW9FdUPGRS2og" backgroundStyle="Liquid">
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_M9JukZKGEeW9FdUPGRS2og"/>
+ <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="_M9JukpKGEeW9FdUPGRS2og"/>
+ <backgroundColor xmi:type="viewpoint:RGBValues" xmi:id="_M9Juk5KGEeW9FdUPGRS2og" red="255" green="255" blue="255"/>
+ <foregroundColor xmi:type="viewpoint:RGBValues" xmi:id="_M9JulJKGEeW9FdUPGRS2og" red="255" green="252" blue="216"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1: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="_M9LjwJKGEeW9FdUPGRS2og" name="Resource" tooltipText="" outgoingEdges="_M-jcwJKGEeW9FdUPGRS2og _M-lR8JKGEeW9FdUPGRS2og _M-3l0JKGEeW9FdUPGRS2og" incomingEdges="_M-qxgJKGEeW9FdUPGRS2og _M-tNwJKGEeW9FdUPGRS2og _M-2XsJKGEeW9FdUPGRS2og _M-4z8JKGEeW9FdUPGRS2og _M-6pIJKGEeW9FdUPGRS2og" width="12" height="10">
+ <target xmi:type="ecore:EClass" href="resource.ecore#//Resource"/>
+ <semanticElements xmi:type="ecore:EClass" href="resource.ecore#//Resource"/>
+ <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
+ <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
+ <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
+ <ownedStyle xmi:type="diagram:FlatContainerStyle" xmi:id="_M9Mx4JKGEeW9FdUPGRS2og" backgroundStyle="Liquid">
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_M9Mx4ZKGEeW9FdUPGRS2og"/>
+ <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="_M9Mx4pKGEeW9FdUPGRS2og"/>
+ <backgroundColor xmi:type="viewpoint:RGBValues" xmi:id="_M9Mx45KGEeW9FdUPGRS2og" red="255" green="255" blue="255"/>
+ <foregroundColor xmi:type="viewpoint:RGBValues" xmi:id="_M9Mx5JKGEeW9FdUPGRS2og" red="255" green="252" blue="216"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1: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="_M-MQYJKGEeW9FdUPGRS2og" name="friendlyName : EString" tooltipText="">
+ <target xmi:type="ecore:EAttribute" href="resource.ecore#//Resource/friendlyName"/>
+ <semanticElements xmi:type="ecore:EAttribute" href="resource.ecore#//Resource/friendlyName"/>
+ <ownedStyle xmi:type="diagram:BundledImage" xmi:id="_M-M3cJKGEeW9FdUPGRS2og" labelAlignment="LEFT">
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_M-M3cZKGEeW9FdUPGRS2og"/>
+ <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="_M-M3cpKGEeW9FdUPGRS2og"/>
+ <color xmi:type="viewpoint:RGBValues" xmi:id="_M-M3c5KGEeW9FdUPGRS2og"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1: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>
+ <ownedElements xmi:type="diagram:DNodeListElement" xmi:id="_M-NegJKGEeW9FdUPGRS2og" name="getAccessMethod(type AccessMethodType) : AccessMethod" tooltipText="getAccessMethod(type) : AccessMethod">
+ <target xmi:type="ecore:EOperation" href="resource.ecore#//Resource/getAccessMethod"/>
+ <semanticElements xmi:type="ecore:EOperation" href="resource.ecore#//Resource/getAccessMethod"/>
+ <semanticElements xmi:type="ecore:EParameter" href="resource.ecore#//Resource/getAccessMethod/type"/>
+ <ownedStyle xmi:type="diagram:BundledImage" xmi:id="_M-OsoJKGEeW9FdUPGRS2og" labelAlignment="LEFT">
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_M-OsoZKGEeW9FdUPGRS2og"/>
+ <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='Operation']/@style"/>
+ <borderColor xmi:type="viewpoint:RGBValues" xmi:id="_M-OsopKGEeW9FdUPGRS2og"/>
+ <color xmi:type="viewpoint:RGBValues" xmi:id="_M-Oso5KGEeW9FdUPGRS2og"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1: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='Operation']"/>
+ </ownedElements>
+ </ownedDiagramElements>
+ <ownedDiagramElements xmi:type="diagram:DNodeList" xmi:id="_M9OAAJKGEeW9FdUPGRS2og" name="SensorData" tooltipText="" outgoingEdges="_M-4z8JKGEeW9FdUPGRS2og" width="12" height="10">
+ <target xmi:type="ecore:EClass" href="resource.ecore#//SensorData"/>
+ <semanticElements xmi:type="ecore:EClass" href="resource.ecore#//SensorData"/>
+ <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
+ <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
+ <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
+ <ownedStyle xmi:type="diagram:FlatContainerStyle" xmi:id="_M9OnEJKGEeW9FdUPGRS2og" backgroundStyle="Liquid">
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_M9OnEZKGEeW9FdUPGRS2og"/>
+ <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="_M9OnEpKGEeW9FdUPGRS2og"/>
+ <backgroundColor xmi:type="viewpoint:RGBValues" xmi:id="_M9OnE5KGEeW9FdUPGRS2og" red="255" green="255" blue="255"/>
+ <foregroundColor xmi:type="viewpoint:RGBValues" xmi:id="_M9OnFJKGEeW9FdUPGRS2og" red="255" green="252" blue="216"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1: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="_M9QcQJKGEeW9FdUPGRS2og" name="Service" tooltipText="" outgoingEdges="_M-qxgJKGEeW9FdUPGRS2og _M-5bBpKGEeW9FdUPGRS2og" incomingEdges="_M-nuMJKGEeW9FdUPGRS2og" width="12" height="10">
+ <target xmi:type="ecore:EClass" href="resource.ecore#//Service"/>
+ <semanticElements xmi:type="ecore:EClass" href="resource.ecore#//Service"/>
+ <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
+ <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
+ <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
+ <ownedStyle xmi:type="diagram:FlatContainerStyle" xmi:id="_M9RDUJKGEeW9FdUPGRS2og" backgroundStyle="Liquid">
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_M9RDUZKGEeW9FdUPGRS2og"/>
+ <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="_M9RDUpKGEeW9FdUPGRS2og"/>
+ <backgroundColor xmi:type="viewpoint:RGBValues" xmi:id="_M9RDU5KGEeW9FdUPGRS2og" red="255" green="255" blue="255"/>
+ <foregroundColor xmi:type="viewpoint:RGBValues" xmi:id="_M9RDVJKGEeW9FdUPGRS2og" red="255" green="252" blue="216"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1: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="_M-P6wJKGEeW9FdUPGRS2og" name="friendlyName : EString" tooltipText="">
+ <target xmi:type="ecore:EAttribute" href="resource.ecore#//Service/friendlyName"/>
+ <semanticElements xmi:type="ecore:EAttribute" href="resource.ecore#//Service/friendlyName"/>
+ <ownedStyle xmi:type="diagram:BundledImage" xmi:id="_M-Qh0JKGEeW9FdUPGRS2og" labelAlignment="LEFT">
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_M-Qh0ZKGEeW9FdUPGRS2og"/>
+ <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="_M-Qh0pKGEeW9FdUPGRS2og"/>
+ <color xmi:type="viewpoint:RGBValues" xmi:id="_M-Qh05KGEeW9FdUPGRS2og"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1: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="_M9SRcJKGEeW9FdUPGRS2og" name="StateVariable" tooltipText="" outgoingEdges="_M-6pIJKGEeW9FdUPGRS2og" incomingEdges="_M-8eUJKGEeW9FdUPGRS2og" width="12" height="10">
+ <target xmi:type="ecore:EClass" href="resource.ecore#//StateVariable"/>
+ <semanticElements xmi:type="ecore:EClass" href="resource.ecore#//StateVariable"/>
+ <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
+ <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
+ <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
+ <ownedStyle xmi:type="diagram:FlatContainerStyle" xmi:id="_M9TfkJKGEeW9FdUPGRS2og" backgroundStyle="Liquid">
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_M9TfkZKGEeW9FdUPGRS2og"/>
+ <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="_M9TfkpKGEeW9FdUPGRS2og"/>
+ <backgroundColor xmi:type="viewpoint:RGBValues" xmi:id="_M9Tfk5KGEeW9FdUPGRS2og" red="255" green="255" blue="255"/>
+ <foregroundColor xmi:type="viewpoint:RGBValues" xmi:id="_M9TflJKGEeW9FdUPGRS2og" red="255" green="252" blue="216"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1: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="_M9VUwJKGEeW9FdUPGRS2og" name="TypedElement" tooltipText="" outgoingEdges="_T1rv0JKKEeW9FdUPGRS2og" incomingEdges="_M-vqAJKGEeW9FdUPGRS2og _M-ytVpKGEeW9FdUPGRS2og _M-1JkJKGEeW9FdUPGRS2og" width="12" height="10">
+ <target xmi:type="ecore:EClass" href="resource.ecore#//TypedElement"/>
+ <semanticElements xmi:type="ecore:EClass" href="resource.ecore#//TypedElement"/>
+ <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
+ <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
+ <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
+ <ownedStyle xmi:type="diagram:FlatContainerStyle" xmi:id="_M9V70JKGEeW9FdUPGRS2og" backgroundStyle="Liquid">
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_M9V70ZKGEeW9FdUPGRS2og"/>
+ <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="_M9V70pKGEeW9FdUPGRS2og"/>
+ <backgroundColor xmi:type="viewpoint:RGBValues" xmi:id="_M9V705KGEeW9FdUPGRS2og" red="255" green="255" blue="255"/>
+ <foregroundColor xmi:type="viewpoint:RGBValues" xmi:id="_M9V71JKGEeW9FdUPGRS2og" red="255" green="252" blue="216"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1: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="_M-RI4JKGEeW9FdUPGRS2og" name="type : EString" tooltipText="">
+ <target xmi:type="ecore:EAttribute" href="resource.ecore#//TypedElement/type"/>
+ <semanticElements xmi:type="ecore:EAttribute" href="resource.ecore#//TypedElement/type"/>
+ <ownedStyle xmi:type="diagram:BundledImage" xmi:id="_M-Rv8JKGEeW9FdUPGRS2og" labelAlignment="LEFT">
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_M-Rv8ZKGEeW9FdUPGRS2og"/>
+ <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="_M-Rv8pKGEeW9FdUPGRS2og"/>
+ <color xmi:type="viewpoint:RGBValues" xmi:id="_M-Rv85KGEeW9FdUPGRS2og"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1: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>
+ <ownedElements xmi:type="diagram:DNodeListElement" xmi:id="_M-SXAJKGEeW9FdUPGRS2og" name="value : EString" tooltipText="">
+ <target xmi:type="ecore:EAttribute" href="resource.ecore#//TypedElement/value"/>
+ <semanticElements xmi:type="ecore:EAttribute" href="resource.ecore#//TypedElement/value"/>
+ <ownedStyle xmi:type="diagram:BundledImage" xmi:id="_M-SXAZKGEeW9FdUPGRS2og" labelAlignment="LEFT">
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_M-SXApKGEeW9FdUPGRS2og"/>
+ <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="_M-SXA5KGEeW9FdUPGRS2og"/>
+ <color xmi:type="viewpoint:RGBValues" xmi:id="_M-SXBJKGEeW9FdUPGRS2og"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1: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="_M-d9MJKGEeW9FdUPGRS2og" name="[0..*] parameter" sourceNode="_M8r0gJKGEeW9FdUPGRS2og" targetNode="_M9GrQJKGEeW9FdUPGRS2og">
+ <target xmi:type="ecore:EReference" href="resource.ecore#//AccessMethod/parameter"/>
+ <semanticElements xmi:type="ecore:EReference" href="resource.ecore#//AccessMethod/parameter"/>
+ <ownedStyle xmi:type="diagram:EdgeStyle" xmi:id="_M-i1sJKGEeW9FdUPGRS2og" description="_M-hAgZKGEeW9FdUPGRS2og" sourceArrow="FillDiamond" routingStyle="manhattan">
+ <strokeColor xmi:type="viewpoint:RGBValues" xmi:id="_M-i1sZKGEeW9FdUPGRS2og"/>
+ <centerLabelStyle xmi:type="diagram:CenterLabelStyle" xmi:id="_M-i1spKGEeW9FdUPGRS2og" showIcon="false">
+ <customFeatures>labelSize</customFeatures>
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_M-i1s5KGEeW9FdUPGRS2og"/>
+ </centerLabelStyle>
+ <endLabelStyle xmi:type="diagram:EndLabelStyle" xmi:id="_M-i1tJKGEeW9FdUPGRS2og" showIcon="false">
+ <customFeatures>labelSize</customFeatures>
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_M-i1tZKGEeW9FdUPGRS2og" red="39" green="76" blue="114"/>
+ </endLabelStyle>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1: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="_M-jcwJKGEeW9FdUPGRS2og" name="[0..*] attribute" sourceNode="_M9LjwJKGEeW9FdUPGRS2og" targetNode="_M8528JKGEeW9FdUPGRS2og">
+ <target xmi:type="ecore:EReference" href="resource.ecore#//Resource/attribute"/>
+ <semanticElements xmi:type="ecore:EReference" href="resource.ecore#//Resource/attribute"/>
+ <ownedStyle xmi:type="diagram:EdgeStyle" xmi:id="_M-kq4ZKGEeW9FdUPGRS2og" description="_M-kD0pKGEeW9FdUPGRS2og" sourceArrow="FillDiamond" routingStyle="manhattan">
+ <strokeColor xmi:type="viewpoint:RGBValues" xmi:id="_M-kq4pKGEeW9FdUPGRS2og"/>
+ <centerLabelStyle xmi:type="diagram:CenterLabelStyle" xmi:id="_M-kq45KGEeW9FdUPGRS2og" showIcon="false">
+ <customFeatures>labelSize</customFeatures>
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_M-kq5JKGEeW9FdUPGRS2og"/>
+ </centerLabelStyle>
+ <endLabelStyle xmi:type="diagram:EndLabelStyle" xmi:id="_M-kq5ZKGEeW9FdUPGRS2og" showIcon="false">
+ <customFeatures>labelSize</customFeatures>
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_M-kq5pKGEeW9FdUPGRS2og" red="39" green="76" blue="114"/>
+ </endLabelStyle>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1: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="_M-lR8JKGEeW9FdUPGRS2og" name="[0..*] accessMethod" sourceNode="_M9LjwJKGEeW9FdUPGRS2og" targetNode="_M8r0gJKGEeW9FdUPGRS2og">
+ <target xmi:type="ecore:EReference" href="resource.ecore#//Resource/accessMethod"/>
+ <semanticElements xmi:type="ecore:EReference" href="resource.ecore#//Resource/accessMethod"/>
+ <ownedStyle xmi:type="diagram:EdgeStyle" xmi:id="_M-l5BpKGEeW9FdUPGRS2og" description="_M-l5ApKGEeW9FdUPGRS2og" sourceArrow="FillDiamond" routingStyle="manhattan">
+ <strokeColor xmi:type="viewpoint:RGBValues" xmi:id="_M-l5B5KGEeW9FdUPGRS2og"/>
+ <centerLabelStyle xmi:type="diagram:CenterLabelStyle" xmi:id="_M-l5CJKGEeW9FdUPGRS2og" showIcon="false">
+ <customFeatures>labelSize</customFeatures>
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_M-l5CZKGEeW9FdUPGRS2og"/>
+ </centerLabelStyle>
+ <endLabelStyle xmi:type="diagram:EndLabelStyle" xmi:id="_M-l5CpKGEeW9FdUPGRS2og" showIcon="false">
+ <customFeatures>labelSize</customFeatures>
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_M-l5C5KGEeW9FdUPGRS2og" red="39" green="76" blue="114"/>
+ </endLabelStyle>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1: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="_M-mgEJKGEeW9FdUPGRS2og" name="[0..*] metadata" sourceNode="_M8528JKGEeW9FdUPGRS2og" targetNode="_M9BywJKGEeW9FdUPGRS2og">
+ <target xmi:type="ecore:EReference" href="resource.ecore#//Attribute/metadata"/>
+ <semanticElements xmi:type="ecore:EReference" href="resource.ecore#//Attribute/metadata"/>
+ <ownedStyle xmi:type="diagram:EdgeStyle" xmi:id="_M-nHJpKGEeW9FdUPGRS2og" description="_M-nHIpKGEeW9FdUPGRS2og" sourceArrow="FillDiamond" routingStyle="manhattan">
+ <strokeColor xmi:type="viewpoint:RGBValues" xmi:id="_M-nHJ5KGEeW9FdUPGRS2og"/>
+ <centerLabelStyle xmi:type="diagram:CenterLabelStyle" xmi:id="_M-nHKJKGEeW9FdUPGRS2og" showIcon="false">
+ <customFeatures>labelSize</customFeatures>
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_M-nHKZKGEeW9FdUPGRS2og"/>
+ </centerLabelStyle>
+ <endLabelStyle xmi:type="diagram:EndLabelStyle" xmi:id="_M-nHKpKGEeW9FdUPGRS2og" showIcon="false">
+ <customFeatures>labelSize</customFeatures>
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_M-nHK5KGEeW9FdUPGRS2og" red="39" green="76" blue="114"/>
+ </endLabelStyle>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1: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="_M-nuMJKGEeW9FdUPGRS2og" name="[0..*] service" sourceNode="_M886QJKGEeW9FdUPGRS2og" targetNode="_M9QcQJKGEeW9FdUPGRS2og">
+ <target xmi:type="ecore:EReference" href="resource.ecore#//Device/service"/>
+ <semanticElements xmi:type="ecore:EReference" href="resource.ecore#//Device/service"/>
+ <ownedStyle xmi:type="diagram:EdgeStyle" xmi:id="_M-o8UZKGEeW9FdUPGRS2og" description="_M-oVQpKGEeW9FdUPGRS2og" sourceArrow="FillDiamond" routingStyle="manhattan">
+ <strokeColor xmi:type="viewpoint:RGBValues" xmi:id="_M-o8UpKGEeW9FdUPGRS2og"/>
+ <centerLabelStyle xmi:type="diagram:CenterLabelStyle" xmi:id="_M-o8U5KGEeW9FdUPGRS2og" showIcon="false">
+ <customFeatures>labelSize</customFeatures>
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_M-o8VJKGEeW9FdUPGRS2og"/>
+ </centerLabelStyle>
+ <endLabelStyle xmi:type="diagram:EndLabelStyle" xmi:id="_M-o8VZKGEeW9FdUPGRS2og" showIcon="false">
+ <customFeatures>labelSize</customFeatures>
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_M-o8VpKGEeW9FdUPGRS2og" red="39" green="76" blue="114"/>
+ </endLabelStyle>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1: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="_M-pjYJKGEeW9FdUPGRS2og" name="[0..*] device" sourceNode="_VzDGUJKIEeW9FdUPGRS2og" targetNode="_M886QJKGEeW9FdUPGRS2og">
+ <target xmi:type="ecore:EReference" href="resource.ecore#//Gateway/device"/>
+ <semanticElements xmi:type="ecore:EReference" href="resource.ecore#//Gateway/device"/>
+ <ownedStyle xmi:type="diagram:EdgeStyle" xmi:id="_hKxMgZKIEeW9FdUPGRS2og" description="_hKwlcpKIEeW9FdUPGRS2og" sourceArrow="FillDiamond" routingStyle="manhattan">
+ <strokeColor xmi:type="viewpoint:RGBValues" xmi:id="_hKxMgpKIEeW9FdUPGRS2og"/>
+ <centerLabelStyle xmi:type="diagram:CenterLabelStyle" xmi:id="_hKxMg5KIEeW9FdUPGRS2og" showIcon="false">
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_hKxMhJKIEeW9FdUPGRS2og"/>
+ </centerLabelStyle>
+ <endLabelStyle xmi:type="diagram:EndLabelStyle" xmi:id="_hKxMhZKIEeW9FdUPGRS2og" labelSize="6" showIcon="false">
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_hKxMhpKIEeW9FdUPGRS2og" red="39" green="76" blue="114"/>
+ </endLabelStyle>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1: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="_M-qxgJKGEeW9FdUPGRS2og" name="[0..*] resource" sourceNode="_M9QcQJKGEeW9FdUPGRS2og" targetNode="_M9LjwJKGEeW9FdUPGRS2og">
+ <target xmi:type="ecore:EReference" href="resource.ecore#//Service/resource"/>
+ <semanticElements xmi:type="ecore:EReference" href="resource.ecore#//Service/resource"/>
+ <ownedStyle xmi:type="diagram:EdgeStyle" xmi:id="_M-rYlpKGEeW9FdUPGRS2og" description="_M-rYkpKGEeW9FdUPGRS2og" sourceArrow="FillDiamond" routingStyle="manhattan">
+ <strokeColor xmi:type="viewpoint:RGBValues" xmi:id="_M-rYl5KGEeW9FdUPGRS2og"/>
+ <centerLabelStyle xmi:type="diagram:CenterLabelStyle" xmi:id="_M-rYmJKGEeW9FdUPGRS2og" showIcon="false">
+ <customFeatures>labelSize</customFeatures>
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_M-rYmZKGEeW9FdUPGRS2og"/>
+ </centerLabelStyle>
+ <endLabelStyle xmi:type="diagram:EndLabelStyle" xmi:id="_M-rYmpKGEeW9FdUPGRS2og" showIcon="false">
+ <customFeatures>labelSize</customFeatures>
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_M-rYm5KGEeW9FdUPGRS2og" red="39" green="76" blue="114"/>
+ </endLabelStyle>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1: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="_M-tNwJKGEeW9FdUPGRS2og" sourceNode="_M82zoJKGEeW9FdUPGRS2og" targetNode="_M9LjwJKGEeW9FdUPGRS2og">
+ <target xmi:type="ecore:EClass" href="resource.ecore#//Action"/>
+ <semanticElements xmi:type="ecore:EGenericType" href="resource.ecore#//Action/@eGenericSuperTypes.0"/>
+ <ownedStyle xmi:type="diagram:EdgeStyle" xmi:id="_M-t00JKGEeW9FdUPGRS2og" targetArrow="InputClosedArrow" routingStyle="manhattan">
+ <customFeatures>routingStyle</customFeatures>
+ <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']/@style"/>
+ <strokeColor xmi:type="viewpoint:RGBValues" xmi:id="_M-t00ZKGEeW9FdUPGRS2og" red="136" green="136" blue="136"/>
+ <beginLabelStyle xmi:type="diagram:BeginLabelStyle" xmi:id="_M-t00pKGEeW9FdUPGRS2og" labelFormat="italic" showIcon="false">
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_M-t005KGEeW9FdUPGRS2og"/>
+ </beginLabelStyle>
+ <centerLabelStyle xmi:type="diagram:CenterLabelStyle" xmi:id="_M-t01JKGEeW9FdUPGRS2og" showIcon="false">
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_M-t01ZKGEeW9FdUPGRS2og"/>
+ </centerLabelStyle>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1: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="_M-vqAJKGEeW9FdUPGRS2og" sourceNode="_M8528JKGEeW9FdUPGRS2og" targetNode="_M9VUwJKGEeW9FdUPGRS2og">
+ <target xmi:type="ecore:EClass" href="resource.ecore#//Attribute"/>
+ <semanticElements xmi:type="ecore:EGenericType" href="resource.ecore#//Attribute/@eGenericSuperTypes.0"/>
+ <ownedStyle xmi:type="diagram:EdgeStyle" xmi:id="_M-wREJKGEeW9FdUPGRS2og" targetArrow="InputClosedArrow" routingStyle="manhattan">
+ <customFeatures>routingStyle</customFeatures>
+ <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']/@style"/>
+ <strokeColor xmi:type="viewpoint:RGBValues" xmi:id="_M-wREZKGEeW9FdUPGRS2og" red="136" green="136" blue="136"/>
+ <beginLabelStyle xmi:type="diagram:BeginLabelStyle" xmi:id="_M-wREpKGEeW9FdUPGRS2og" labelFormat="italic" showIcon="false">
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_M-wRE5KGEeW9FdUPGRS2og"/>
+ </beginLabelStyle>
+ <centerLabelStyle xmi:type="diagram:CenterLabelStyle" xmi:id="_M-wRFJKGEeW9FdUPGRS2og" showIcon="false">
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_M-wRFZKGEeW9FdUPGRS2og"/>
+ </centerLabelStyle>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1: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="_M-w4IJKGEeW9FdUPGRS2og" sourceNode="_M886QJKGEeW9FdUPGRS2og" targetNode="_M9EPAJKGEeW9FdUPGRS2og">
+ <target xmi:type="ecore:EClass" href="resource.ecore#//Device"/>
+ <semanticElements xmi:type="ecore:EGenericType" href="resource.ecore#//Device/@eGenericSuperTypes.0"/>
+ <ownedStyle xmi:type="diagram:EdgeStyle" xmi:id="_M-xfMJKGEeW9FdUPGRS2og" targetArrow="InputClosedArrow" routingStyle="manhattan">
+ <customFeatures>routingStyle</customFeatures>
+ <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']/@style"/>
+ <strokeColor xmi:type="viewpoint:RGBValues" xmi:id="_M-xfMZKGEeW9FdUPGRS2og" red="136" green="136" blue="136"/>
+ <beginLabelStyle xmi:type="diagram:BeginLabelStyle" xmi:id="_M-xfMpKGEeW9FdUPGRS2og" labelFormat="italic" showIcon="false">
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_M-xfM5KGEeW9FdUPGRS2og"/>
+ </beginLabelStyle>
+ <centerLabelStyle xmi:type="diagram:CenterLabelStyle" xmi:id="_M-xfNJKGEeW9FdUPGRS2og" showIcon="false">
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_M-xfNZKGEeW9FdUPGRS2og"/>
+ </centerLabelStyle>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1: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="_M-ytVpKGEeW9FdUPGRS2og" sourceNode="_M9BywJKGEeW9FdUPGRS2og" targetNode="_M9VUwJKGEeW9FdUPGRS2og">
+ <target xmi:type="ecore:EClass" href="resource.ecore#//Metadata"/>
+ <semanticElements xmi:type="ecore:EGenericType" href="resource.ecore#//Metadata/@eGenericSuperTypes.0"/>
+ <ownedStyle xmi:type="diagram:EdgeStyle" xmi:id="_M-zUYJKGEeW9FdUPGRS2og" targetArrow="InputClosedArrow" routingStyle="manhattan">
+ <customFeatures>routingStyle</customFeatures>
+ <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']/@style"/>
+ <strokeColor xmi:type="viewpoint:RGBValues" xmi:id="_M-zUYZKGEeW9FdUPGRS2og" red="136" green="136" blue="136"/>
+ <beginLabelStyle xmi:type="diagram:BeginLabelStyle" xmi:id="_M-zUYpKGEeW9FdUPGRS2og" labelFormat="italic" showIcon="false">
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_M-zUY5KGEeW9FdUPGRS2og"/>
+ </beginLabelStyle>
+ <centerLabelStyle xmi:type="diagram:CenterLabelStyle" xmi:id="_M-zUZJKGEeW9FdUPGRS2og" showIcon="false">
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_M-zUZZKGEeW9FdUPGRS2og"/>
+ </centerLabelStyle>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1: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="_M-1JkJKGEeW9FdUPGRS2og" sourceNode="_M9GrQJKGEeW9FdUPGRS2og" targetNode="_M9VUwJKGEeW9FdUPGRS2og">
+ <target xmi:type="ecore:EClass" href="resource.ecore#//Parameter"/>
+ <semanticElements xmi:type="ecore:EGenericType" href="resource.ecore#//Parameter/@eGenericSuperTypes.0"/>
+ <ownedStyle xmi:type="diagram:EdgeStyle" xmi:id="_M-1woJKGEeW9FdUPGRS2og" targetArrow="InputClosedArrow" routingStyle="manhattan">
+ <customFeatures>routingStyle</customFeatures>
+ <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']/@style"/>
+ <strokeColor xmi:type="viewpoint:RGBValues" xmi:id="_M-1woZKGEeW9FdUPGRS2og" red="136" green="136" blue="136"/>
+ <beginLabelStyle xmi:type="diagram:BeginLabelStyle" xmi:id="_M-1wopKGEeW9FdUPGRS2og" labelFormat="italic" showIcon="false">
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_M-1wo5KGEeW9FdUPGRS2og"/>
+ </beginLabelStyle>
+ <centerLabelStyle xmi:type="diagram:CenterLabelStyle" xmi:id="_M-1wpJKGEeW9FdUPGRS2og" showIcon="false">
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_M-1wpZKGEeW9FdUPGRS2og"/>
+ </centerLabelStyle>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1: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="_M-2XsJKGEeW9FdUPGRS2og" sourceNode="_M9JHgJKGEeW9FdUPGRS2og" targetNode="_M9LjwJKGEeW9FdUPGRS2og">
+ <target xmi:type="ecore:EClass" href="resource.ecore#//Property"/>
+ <semanticElements xmi:type="ecore:EGenericType" href="resource.ecore#//Property/@eGenericSuperTypes.0"/>
+ <ownedStyle xmi:type="diagram:EdgeStyle" xmi:id="_M-2-wJKGEeW9FdUPGRS2og" targetArrow="InputClosedArrow" routingStyle="manhattan">
+ <customFeatures>routingStyle</customFeatures>
+ <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']/@style"/>
+ <strokeColor xmi:type="viewpoint:RGBValues" xmi:id="_M-2-wZKGEeW9FdUPGRS2og" red="136" green="136" blue="136"/>
+ <beginLabelStyle xmi:type="diagram:BeginLabelStyle" xmi:id="_M-2-wpKGEeW9FdUPGRS2og" labelFormat="italic" showIcon="false">
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_M-2-w5KGEeW9FdUPGRS2og"/>
+ </beginLabelStyle>
+ <centerLabelStyle xmi:type="diagram:CenterLabelStyle" xmi:id="_M-2-xJKGEeW9FdUPGRS2og" showIcon="false">
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_M-2-xZKGEeW9FdUPGRS2og"/>
+ </centerLabelStyle>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1: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="_M-3l0JKGEeW9FdUPGRS2og" sourceNode="_M9LjwJKGEeW9FdUPGRS2og" targetNode="_M9EPAJKGEeW9FdUPGRS2og">
+ <target xmi:type="ecore:EClass" href="resource.ecore#//Resource"/>
+ <semanticElements xmi:type="ecore:EGenericType" href="resource.ecore#//Resource/@eGenericSuperTypes.0"/>
+ <ownedStyle xmi:type="diagram:EdgeStyle" xmi:id="_M-4M4JKGEeW9FdUPGRS2og" targetArrow="InputClosedArrow" routingStyle="manhattan">
+ <customFeatures>routingStyle</customFeatures>
+ <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']/@style"/>
+ <strokeColor xmi:type="viewpoint:RGBValues" xmi:id="_M-4M4ZKGEeW9FdUPGRS2og" red="136" green="136" blue="136"/>
+ <beginLabelStyle xmi:type="diagram:BeginLabelStyle" xmi:id="_M-4M4pKGEeW9FdUPGRS2og" labelFormat="italic" showIcon="false">
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_M-4M45KGEeW9FdUPGRS2og"/>
+ </beginLabelStyle>
+ <centerLabelStyle xmi:type="diagram:CenterLabelStyle" xmi:id="_M-4M5JKGEeW9FdUPGRS2og" showIcon="false">
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_M-4M5ZKGEeW9FdUPGRS2og"/>
+ </centerLabelStyle>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1: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="_M-4z8JKGEeW9FdUPGRS2og" sourceNode="_M9OAAJKGEeW9FdUPGRS2og" targetNode="_M9LjwJKGEeW9FdUPGRS2og">
+ <target xmi:type="ecore:EClass" href="resource.ecore#//SensorData"/>
+ <semanticElements xmi:type="ecore:EGenericType" href="resource.ecore#//SensorData/@eGenericSuperTypes.0"/>
+ <ownedStyle xmi:type="diagram:EdgeStyle" xmi:id="_M-5bAJKGEeW9FdUPGRS2og" targetArrow="InputClosedArrow" routingStyle="manhattan">
+ <customFeatures>routingStyle</customFeatures>
+ <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']/@style"/>
+ <strokeColor xmi:type="viewpoint:RGBValues" xmi:id="_M-5bAZKGEeW9FdUPGRS2og" red="136" green="136" blue="136"/>
+ <beginLabelStyle xmi:type="diagram:BeginLabelStyle" xmi:id="_M-5bApKGEeW9FdUPGRS2og" labelFormat="italic" showIcon="false">
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_M-5bA5KGEeW9FdUPGRS2og"/>
+ </beginLabelStyle>
+ <centerLabelStyle xmi:type="diagram:CenterLabelStyle" xmi:id="_M-5bBJKGEeW9FdUPGRS2og" showIcon="false">
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_M-5bBZKGEeW9FdUPGRS2og"/>
+ </centerLabelStyle>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1: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="_M-5bBpKGEeW9FdUPGRS2og" sourceNode="_M9QcQJKGEeW9FdUPGRS2og" targetNode="_M9EPAJKGEeW9FdUPGRS2og">
+ <target xmi:type="ecore:EClass" href="resource.ecore#//Service"/>
+ <semanticElements xmi:type="ecore:EGenericType" href="resource.ecore#//Service/@eGenericSuperTypes.0"/>
+ <ownedStyle xmi:type="diagram:EdgeStyle" xmi:id="_M-6CEJKGEeW9FdUPGRS2og" targetArrow="InputClosedArrow" routingStyle="manhattan">
+ <customFeatures>routingStyle</customFeatures>
+ <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']/@style"/>
+ <strokeColor xmi:type="viewpoint:RGBValues" xmi:id="_M-6CEZKGEeW9FdUPGRS2og" red="136" green="136" blue="136"/>
+ <beginLabelStyle xmi:type="diagram:BeginLabelStyle" xmi:id="_M-6CEpKGEeW9FdUPGRS2og" labelFormat="italic" showIcon="false">
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_M-6CE5KGEeW9FdUPGRS2og"/>
+ </beginLabelStyle>
+ <centerLabelStyle xmi:type="diagram:CenterLabelStyle" xmi:id="_M-6CFJKGEeW9FdUPGRS2og" showIcon="false">
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_M-6CFZKGEeW9FdUPGRS2og"/>
+ </centerLabelStyle>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1: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="_M-6pIJKGEeW9FdUPGRS2og" sourceNode="_M9SRcJKGEeW9FdUPGRS2og" targetNode="_M9LjwJKGEeW9FdUPGRS2og">
+ <target xmi:type="ecore:EClass" href="resource.ecore#//StateVariable"/>
+ <semanticElements xmi:type="ecore:EGenericType" href="resource.ecore#//StateVariable/@eGenericSuperTypes.0"/>
+ <ownedStyle xmi:type="diagram:EdgeStyle" xmi:id="_M-7QMJKGEeW9FdUPGRS2og" targetArrow="InputClosedArrow" routingStyle="manhattan">
+ <customFeatures>routingStyle</customFeatures>
+ <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']/@style"/>
+ <strokeColor xmi:type="viewpoint:RGBValues" xmi:id="_M-7QMZKGEeW9FdUPGRS2og" red="136" green="136" blue="136"/>
+ <beginLabelStyle xmi:type="diagram:BeginLabelStyle" xmi:id="_M-7QMpKGEeW9FdUPGRS2og" labelFormat="italic" showIcon="false">
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_M-7QM5KGEeW9FdUPGRS2og"/>
+ </beginLabelStyle>
+ <centerLabelStyle xmi:type="diagram:CenterLabelStyle" xmi:id="_M-7QNJKGEeW9FdUPGRS2og" showIcon="false">
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_M-7QNZKGEeW9FdUPGRS2og"/>
+ </centerLabelStyle>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1: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="_M-8eUJKGEeW9FdUPGRS2og" sourceNode="_M82zoJKGEeW9FdUPGRS2og" targetNode="_M9SRcJKGEeW9FdUPGRS2og" beginLabel="[0..*] modifier" endLabel="[0..*] state">
+ <target xmi:type="ecore:EReference" href="resource.ecore#//Action/state"/>
+ <semanticElements xmi:type="ecore:EReference" href="resource.ecore#//StateVariable/modifier"/>
+ <semanticElements xmi:type="ecore:EReference" href="resource.ecore#//Action/state"/>
+ <ownedStyle xmi:type="diagram:EdgeStyle" xmi:id="_M-9scJKGEeW9FdUPGRS2og" sourceArrow="InputArrow" 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='Bi-directional%20EC_EReference%20']/@style"/>
+ <strokeColor xmi:type="viewpoint:RGBValues" xmi:id="_M-9scZKGEeW9FdUPGRS2og"/>
+ <beginLabelStyle xmi:type="diagram:BeginLabelStyle" xmi:id="_M-9scpKGEeW9FdUPGRS2og" showIcon="false">
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_M-9sc5KGEeW9FdUPGRS2og"/>
+ </beginLabelStyle>
+ <endLabelStyle xmi:type="diagram:EndLabelStyle" xmi:id="_M-9sdJKGEeW9FdUPGRS2og" showIcon="false">
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_M-9sdZKGEeW9FdUPGRS2og"/>
+ </endLabelStyle>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='Bi-directional%20EC_EReference%20']"/>
+ </ownedDiagramElements>
+ <ownedDiagramElements xmi:type="diagram:DNodeList" xmi:id="_VzDGUJKIEeW9FdUPGRS2og" name="Gateway" tooltipText="" outgoingEdges="_bI5JoJKIEeW9FdUPGRS2og _M-pjYJKGEeW9FdUPGRS2og" incomingEdges="_o5lSUJKIEeW9FdUPGRS2og" width="12" height="10">
+ <target xmi:type="ecore:EClass" href="resource.ecore#//Gateway"/>
+ <semanticElements xmi:type="ecore:EClass" href="resource.ecore#//Gateway"/>
+ <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
+ <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
+ <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
+ <ownedStyle xmi:type="diagram:FlatContainerStyle" xmi:id="_VzDtYJKIEeW9FdUPGRS2og" backgroundStyle="Liquid">
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_VzDtYZKIEeW9FdUPGRS2og"/>
+ <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="_VzDtYpKIEeW9FdUPGRS2og"/>
+ <backgroundColor xmi:type="viewpoint:RGBValues" xmi:id="_VzDtY5KIEeW9FdUPGRS2og" red="255" green="255" blue="255"/>
+ <foregroundColor xmi:type="viewpoint:RGBValues" xmi:id="_VzDtZJKIEeW9FdUPGRS2og" red="255" green="252" blue="216"/>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1: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="_bI5JoJKIEeW9FdUPGRS2og" sourceNode="_VzDGUJKIEeW9FdUPGRS2og" targetNode="_M9EPAJKGEeW9FdUPGRS2og">
+ <target xmi:type="ecore:EClass" href="resource.ecore#//Gateway"/>
+ <semanticElements xmi:type="ecore:EGenericType" href="resource.ecore#//Gateway/@eGenericSuperTypes.0"/>
+ <ownedStyle xmi:type="diagram:EdgeStyle" xmi:id="_bI5wsJKIEeW9FdUPGRS2og" targetArrow="InputClosedArrow" routingStyle="manhattan">
+ <customFeatures>routingStyle</customFeatures>
+ <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']/@style"/>
+ <strokeColor xmi:type="viewpoint:RGBValues" xmi:id="_bI5wsZKIEeW9FdUPGRS2og" red="136" green="136" blue="136"/>
+ <beginLabelStyle xmi:type="diagram:BeginLabelStyle" xmi:id="_bI5wspKIEeW9FdUPGRS2og" labelFormat="italic" showIcon="false">
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_bI5ws5KIEeW9FdUPGRS2og"/>
+ </beginLabelStyle>
+ <centerLabelStyle xmi:type="diagram:CenterLabelStyle" xmi:id="_bI5wtJKIEeW9FdUPGRS2og" showIcon="false">
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_bI5wtZKIEeW9FdUPGRS2og"/>
+ </centerLabelStyle>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1: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="_o5lSUJKIEeW9FdUPGRS2og" name="[0..*] gateways" sourceNode="_M8_WgJKGEeW9FdUPGRS2og" targetNode="_VzDGUJKIEeW9FdUPGRS2og">
+ <target xmi:type="ecore:EReference" href="resource.ecore#//Studio/gateways"/>
+ <semanticElements xmi:type="ecore:EReference" href="resource.ecore#//Studio/gateways"/>
+ <ownedStyle xmi:type="diagram:EdgeStyle" xmi:id="_Pj4_8ZKJEeW9FdUPGRS2og" description="_Pj4Y4pKJEeW9FdUPGRS2og" sourceArrow="FillDiamond" routingStyle="manhattan">
+ <strokeColor xmi:type="viewpoint:RGBValues" xmi:id="_Pj4_8pKJEeW9FdUPGRS2og"/>
+ <centerLabelStyle xmi:type="diagram:CenterLabelStyle" xmi:id="_Pj4_85KJEeW9FdUPGRS2og" showIcon="false">
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_Pj4_9JKJEeW9FdUPGRS2og"/>
+ </centerLabelStyle>
+ <endLabelStyle xmi:type="diagram:EndLabelStyle" xmi:id="_Pj4_9ZKJEeW9FdUPGRS2og" labelSize="6" showIcon="false">
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_Pj4_9pKJEeW9FdUPGRS2og" red="39" green="76" blue="114"/>
+ </endLabelStyle>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1: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="_T1rv0JKKEeW9FdUPGRS2og" sourceNode="_M9VUwJKGEeW9FdUPGRS2og" targetNode="_M9EPAJKGEeW9FdUPGRS2og">
+ <target xmi:type="ecore:EClass" href="resource.ecore#//TypedElement"/>
+ <semanticElements xmi:type="ecore:EGenericType" href="resource.ecore#//TypedElement/@eGenericSuperTypes.0"/>
+ <ownedStyle xmi:type="diagram:EdgeStyle" xmi:id="_T1sW4JKKEeW9FdUPGRS2og" targetArrow="InputClosedArrow" routingStyle="manhattan">
+ <customFeatures>routingStyle</customFeatures>
+ <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']/@style"/>
+ <strokeColor xmi:type="viewpoint:RGBValues" xmi:id="_T1sW4ZKKEeW9FdUPGRS2og" red="136" green="136" blue="136"/>
+ <beginLabelStyle xmi:type="diagram:BeginLabelStyle" xmi:id="_T1sW4pKKEeW9FdUPGRS2og" labelFormat="italic" showIcon="false">
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_T1sW45KKEeW9FdUPGRS2og"/>
+ </beginLabelStyle>
+ <centerLabelStyle xmi:type="diagram:CenterLabelStyle" xmi:id="_T1sW5JKKEeW9FdUPGRS2og" showIcon="false">
+ <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_T1sW5ZKKEeW9FdUPGRS2og"/>
+ </centerLabelStyle>
+ </ownedStyle>
+ <actualMapping xmi:type="description_1: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_1: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="_IOoJ9ZKGEeW9FdUPGRS2og"/>
+ <activatedLayers xmi:type="description_1:Layer" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer"/>
+ <activatedLayers xmi:type="description_1: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_1: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_1: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="resource.ecore#/"/>
+ </ownedRepresentations>
+ <viewpoint xmi:type="description:Viewpoint" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']"/>
+ </ownedViews>
+ <ownedViews xmi:type="viewpoint:DRepresentationContainer" xmi:id="_77ZdwJKFEeW9FdUPGRS2og" initialized="true">
+ <viewpoint xmi:type="description:Viewpoint" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Review']"/>
+ </ownedViews>
+ <ownedViews xmi:type="viewpoint:DRepresentationContainer" xmi:id="_77kc4JKFEeW9FdUPGRS2og" initialized="true">
+ <viewpoint xmi:type="description:Viewpoint" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Archetype']"/>
+ </ownedViews>
+ <ownedViews xmi:type="viewpoint:DRepresentationContainer" xmi:id="_79qHkJKFEeW9FdUPGRS2og" initialized="true">
+ <viewpoint xmi:type="description:Viewpoint" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Generation']"/>
+ </ownedViews>
+</viewpoint:DAnalysis>
diff --git a/services/org.eclipse.sensinact.studio.model.resource/models/resource.ecore b/services/org.eclipse.sensinact.studio.model.resource/models/resource.ecore
new file mode 100644
index 0000000..1d40d25
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource/models/resource.ecore
@@ -0,0 +1,70 @@
+<?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="resource" nsURI="http://SENSINACT_RESOURCE/0.1" nsPrefix="resource">
+ <eClassifiers xsi:type="ecore:EClass" name="Studio">
+ <eStructuralFeatures xsi:type="ecore:EReference" name="gateways" upperBound="-1"
+ eType="#//Gateway" containment="true"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EClass" name="Device" eSuperTypes="#//NamedElement">
+ <eStructuralFeatures xsi:type="ecore:EAttribute" name="friendlyName" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="service" upperBound="-1"
+ eType="#//Service" containment="true"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EClass" name="NamedElement">
+ <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="TypedElement" eSuperTypes="#//NamedElement">
+ <eStructuralFeatures xsi:type="ecore:EAttribute" name="type" 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#//EString"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EClass" name="Service" eSuperTypes="#//NamedElement">
+ <eStructuralFeatures xsi:type="ecore:EAttribute" name="friendlyName" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="resource" upperBound="-1"
+ eType="#//Resource" containment="true"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EClass" name="Resource" eSuperTypes="#//NamedElement">
+ <eOperations name="getAccessMethod" upperBound="-1" eType="#//AccessMethod">
+ <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel" references="#//Resource/getAccessMethod">
+ <details key="body" value="EList<AccessMethod> accessMethodByType = new EObjectContainmentEList<AccessMethod>(AccessMethod.class, this, ResourcePackage.RESOURCE__ACCESS_METHOD);
		for (AccessMethod accessMethod : getAccessMethod()) {
			if (accessMethod.getType().equals(type))
				accessMethodByType.add(accessMethod);
		}
		return accessMethodByType;"/>
+ </eAnnotations>
+ <eParameters name="type" eType="#//AccessMethodType"/>
+ </eOperations>
+ <eStructuralFeatures xsi:type="ecore:EAttribute" name="friendlyName" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="attribute" upperBound="-1"
+ eType="#//Attribute" containment="true"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="accessMethod" upperBound="-1"
+ eType="#//AccessMethod" containment="true"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EClass" name="Property" eSuperTypes="#//Resource"/>
+ <eClassifiers xsi:type="ecore:EClass" name="SensorData" eSuperTypes="#//Resource"/>
+ <eClassifiers xsi:type="ecore:EClass" name="StateVariable" eSuperTypes="#//Resource">
+ <eStructuralFeatures xsi:type="ecore:EReference" name="modifier" upperBound="-1"
+ eType="#//Action" eOpposite="#//Action/state"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EClass" name="Action" eSuperTypes="#//Resource">
+ <eStructuralFeatures xsi:type="ecore:EReference" name="state" upperBound="-1"
+ eType="#//StateVariable" eOpposite="#//StateVariable/modifier"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EClass" name="Attribute" eSuperTypes="#//TypedElement">
+ <eStructuralFeatures xsi:type="ecore:EReference" name="metadata" upperBound="-1"
+ eType="#//Metadata" containment="true"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EClass" name="Metadata" eSuperTypes="#//TypedElement"/>
+ <eClassifiers xsi:type="ecore:EClass" name="AccessMethod">
+ <eStructuralFeatures xsi:type="ecore:EReference" name="parameter" upperBound="-1"
+ eType="#//Parameter" containment="true"/>
+ <eStructuralFeatures xsi:type="ecore:EAttribute" name="type" eType="#//AccessMethodType"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EClass" name="Parameter" eSuperTypes="#//TypedElement"/>
+ <eClassifiers xsi:type="ecore:EEnum" name="AccessMethodType">
+ <eLiterals name="GET" literal="GET"/>
+ <eLiterals name="SET"/>
+ <eLiterals name="ACT"/>
+ <eLiterals name="SUBSCRIBE"/>
+ <eLiterals name="UNSUBSCRIBE"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EClass" name="Gateway" eSuperTypes="#//NamedElement">
+ <eStructuralFeatures xsi:type="ecore:EReference" name="device" upperBound="-1"
+ eType="#//Device" containment="true"/>
+ </eClassifiers>
+</ecore:EPackage>
diff --git a/services/org.eclipse.sensinact.studio.model.resource/models/resource.ecore_diagram b/services/org.eclipse.sensinact.studio.model.resource/models/resource.ecore_diagram
new file mode 100644
index 0000000..212f9eb
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource/models/resource.ecore_diagram
@@ -0,0 +1,449 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<notation:Diagram 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" xmlns:notation="http://www.eclipse.org/gmf/runtime/1.0.2/notation" xmi:id="_i66qMGN5EeSbPJZNvDzNmw" type="Ecore" measurementUnit="Pixel">
+ <children xmi:type="notation:Shape" xmi:id="_jQyMgGN5EeSbPJZNvDzNmw" type="2001" fontName="Cantarell">
+ <children xmi:type="notation:DecorationNode" xmi:id="_jQzaoGN5EeSbPJZNvDzNmw" type="5001"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_jQ0owGN5EeSbPJZNvDzNmw" type="7001">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_jQ0owWN5EeSbPJZNvDzNmw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_jQ0owmN5EeSbPJZNvDzNmw"/>
+ <layoutConstraint xmi:type="notation:Ratio" xmi:id="_7tc6QGN6EeSbPJZNvDzNmw" value="0.22641509433962265"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_jQ1P0GN5EeSbPJZNvDzNmw" type="7002">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_jQ1P0WN5EeSbPJZNvDzNmw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_jQ1P0mN5EeSbPJZNvDzNmw"/>
+ <layoutConstraint xmi:type="notation:Ratio" xmi:id="_7tdhUGN6EeSbPJZNvDzNmw" value="0.22641509433962265"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_jQ1P02N5EeSbPJZNvDzNmw" type="7003">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_jQ1P1GN5EeSbPJZNvDzNmw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_jQ1P1WN5EeSbPJZNvDzNmw"/>
+ <layoutConstraint xmi:type="notation:Ratio" xmi:id="_7tdhUWN6EeSbPJZNvDzNmw" value="0.22641509433962265"/>
+ </children>
+ <element xmi:type="ecore:EClass" href="resource.ecore#//Devices"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_jQyMgWN5EeSbPJZNvDzNmw" x="-48" y="-180" width="145"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_jQ1P1mN5EeSbPJZNvDzNmw" type="2001" fontName="Cantarell">
+ <children xmi:type="notation:DecorationNode" xmi:id="_jQ124GN5EeSbPJZNvDzNmw" type="5001"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_jQ124WN5EeSbPJZNvDzNmw" type="7001">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_jQ124mN5EeSbPJZNvDzNmw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_jQ1242N5EeSbPJZNvDzNmw"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_jQ125GN5EeSbPJZNvDzNmw" type="7002">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_jQ125WN5EeSbPJZNvDzNmw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_jQ125mN5EeSbPJZNvDzNmw"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_jQ1252N5EeSbPJZNvDzNmw" type="7003">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_jQ126GN5EeSbPJZNvDzNmw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_jQ126WN5EeSbPJZNvDzNmw"/>
+ </children>
+ <element xmi:type="ecore:EClass" href="resource.ecore#//Device"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_jQ1P12N5EeSbPJZNvDzNmw" x="12" y="-72"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_jQ126mN5EeSbPJZNvDzNmw" type="2001" fontName="Cantarell">
+ <children xmi:type="notation:DecorationNode" xmi:id="_jQ2d8WN5EeSbPJZNvDzNmw" type="5001"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_jQ2d8mN5EeSbPJZNvDzNmw" type="7001">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_jQ2d82N5EeSbPJZNvDzNmw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_jQ2d9GN5EeSbPJZNvDzNmw"/>
+ <layoutConstraint xmi:type="notation:Ratio" xmi:id="_8-2QsGN6EeSbPJZNvDzNmw" value="0.32786885245901637"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_jQ2d9WN5EeSbPJZNvDzNmw" type="7002">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_jQ2d9mN5EeSbPJZNvDzNmw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_jQ2d92N5EeSbPJZNvDzNmw"/>
+ <layoutConstraint xmi:type="notation:Ratio" xmi:id="_8-2QsWN6EeSbPJZNvDzNmw" value="0.19672131147540983"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_jQ2d-GN5EeSbPJZNvDzNmw" type="7003">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_jQ2d-WN5EeSbPJZNvDzNmw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_jQ2d-mN5EeSbPJZNvDzNmw"/>
+ <layoutConstraint xmi:type="notation:Ratio" xmi:id="_8-23wGN6EeSbPJZNvDzNmw" value="0.19672131147540983"/>
+ </children>
+ <element xmi:type="ecore:EClass" href="resource.ecore#//NamedElement"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_jQ2d8GN5EeSbPJZNvDzNmw" x="276" y="-180"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_jQ3FAGN5EeSbPJZNvDzNmw" type="2001" fontName="Cantarell">
+ <children xmi:type="notation:DecorationNode" xmi:id="_jQ3FAmN5EeSbPJZNvDzNmw" type="5001"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_jQ3FA2N5EeSbPJZNvDzNmw" type="7001">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_jQ3FBGN5EeSbPJZNvDzNmw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_jQ3FBWN5EeSbPJZNvDzNmw"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_jQ3FBmN5EeSbPJZNvDzNmw" type="7002">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_jQ3FB2N5EeSbPJZNvDzNmw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_jQ3FCGN5EeSbPJZNvDzNmw"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_jQ3FCWN5EeSbPJZNvDzNmw" type="7003">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_jQ3FCmN5EeSbPJZNvDzNmw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_jQ3FC2N5EeSbPJZNvDzNmw"/>
+ </children>
+ <element xmi:type="ecore:EClass" href="resource.ecore#//TypedElement"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_jQ3FAWN5EeSbPJZNvDzNmw" x="408" y="-72"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_jQ3sEGN5EeSbPJZNvDzNmw" type="2001" fontName="Cantarell">
+ <children xmi:type="notation:DecorationNode" xmi:id="_jQ3sEmN5EeSbPJZNvDzNmw" type="5001"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_jQ3sE2N5EeSbPJZNvDzNmw" type="7001">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_jQ3sFGN5EeSbPJZNvDzNmw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_jQ3sFWN5EeSbPJZNvDzNmw"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_jQ3sFmN5EeSbPJZNvDzNmw" type="7002">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_jQ3sF2N5EeSbPJZNvDzNmw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_jQ3sGGN5EeSbPJZNvDzNmw"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_jQ3sGWN5EeSbPJZNvDzNmw" type="7003">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_jQ3sGmN5EeSbPJZNvDzNmw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_jQ4TIGN5EeSbPJZNvDzNmw"/>
+ </children>
+ <element xmi:type="ecore:EClass" href="resource.ecore#//Service"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_jQ3sEWN5EeSbPJZNvDzNmw" x="36" y="72"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_jQ4TIWN5EeSbPJZNvDzNmw" type="2001" fontName="Cantarell">
+ <children xmi:type="notation:DecorationNode" xmi:id="_jQ4TI2N5EeSbPJZNvDzNmw" type="5001"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_jQ4TJGN5EeSbPJZNvDzNmw" type="7001">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_jQ4TJWN5EeSbPJZNvDzNmw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_jQ4TJmN5EeSbPJZNvDzNmw"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_jQ4TJ2N5EeSbPJZNvDzNmw" type="7002">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_jQ4TKGN5EeSbPJZNvDzNmw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_jQ4TKWN5EeSbPJZNvDzNmw"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_jQ46MGN5EeSbPJZNvDzNmw" type="7003">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_jQ46MWN5EeSbPJZNvDzNmw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_jQ46MmN5EeSbPJZNvDzNmw"/>
+ </children>
+ <element xmi:type="ecore:EClass" href="resource.ecore#//Resource"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_jQ4TImN5EeSbPJZNvDzNmw" x="72" y="216"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_jQ46M2N5EeSbPJZNvDzNmw" type="2001" fontName="Cantarell">
+ <children xmi:type="notation:DecorationNode" xmi:id="_jQ46NWN5EeSbPJZNvDzNmw" type="5001"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_jQ46NmN5EeSbPJZNvDzNmw" type="7001">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_jQ46N2N5EeSbPJZNvDzNmw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_jQ46OGN5EeSbPJZNvDzNmw"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_jQ46OWN5EeSbPJZNvDzNmw" type="7002">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_jQ46OmN5EeSbPJZNvDzNmw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_jQ46O2N5EeSbPJZNvDzNmw"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_jQ5hQGN5EeSbPJZNvDzNmw" type="7003">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_jQ5hQWN5EeSbPJZNvDzNmw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_jQ5hQmN5EeSbPJZNvDzNmw"/>
+ </children>
+ <element xmi:type="ecore:EClass" href="resource.ecore#//Property"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_jQ46NGN5EeSbPJZNvDzNmw" x="-60" y="384"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_jQ5hQ2N5EeSbPJZNvDzNmw" type="2001" fontName="Cantarell">
+ <children xmi:type="notation:DecorationNode" xmi:id="_jQ5hRWN5EeSbPJZNvDzNmw" type="5001"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_jQ5hRmN5EeSbPJZNvDzNmw" type="7001">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_jQ5hR2N5EeSbPJZNvDzNmw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_jQ5hSGN5EeSbPJZNvDzNmw"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_jQ6IUGN5EeSbPJZNvDzNmw" type="7002">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_jQ6IUWN5EeSbPJZNvDzNmw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_jQ6IUmN5EeSbPJZNvDzNmw"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_jQ6IU2N5EeSbPJZNvDzNmw" type="7003">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_jQ6IVGN5EeSbPJZNvDzNmw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_jQ6IVWN5EeSbPJZNvDzNmw"/>
+ </children>
+ <element xmi:type="ecore:EClass" href="resource.ecore#//SensorData"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_jQ5hRGN5EeSbPJZNvDzNmw" x="12" y="384"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_jQ6IVmN5EeSbPJZNvDzNmw" type="2001" fontName="Cantarell">
+ <children xmi:type="notation:DecorationNode" xmi:id="_jQ6IWGN5EeSbPJZNvDzNmw" type="5001"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_jQ6IWWN5EeSbPJZNvDzNmw" type="7001">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_jQ6IWmN5EeSbPJZNvDzNmw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_jQ6IW2N5EeSbPJZNvDzNmw"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_jQ6vYGN5EeSbPJZNvDzNmw" type="7002">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_jQ6vYWN5EeSbPJZNvDzNmw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_jQ6vYmN5EeSbPJZNvDzNmw"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_jQ6vY2N5EeSbPJZNvDzNmw" type="7003">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_jQ6vZGN5EeSbPJZNvDzNmw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_jQ6vZWN5EeSbPJZNvDzNmw"/>
+ </children>
+ <element xmi:type="ecore:EClass" href="resource.ecore#//StateVariable"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_jQ6IV2N5EeSbPJZNvDzNmw" x="264" y="384"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_jQ6vZmN5EeSbPJZNvDzNmw" type="2001" fontName="Cantarell">
+ <children xmi:type="notation:DecorationNode" xmi:id="_jQ6vaGN5EeSbPJZNvDzNmw" type="5001"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_jQ6vaWN5EeSbPJZNvDzNmw" type="7001">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_jQ7WcGN5EeSbPJZNvDzNmw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_jQ7WcWN5EeSbPJZNvDzNmw"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_jQ7WcmN5EeSbPJZNvDzNmw" type="7002">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_jQ7Wc2N5EeSbPJZNvDzNmw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_jQ7WdGN5EeSbPJZNvDzNmw"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_jQ7WdWN5EeSbPJZNvDzNmw" type="7003">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_jQ7WdmN5EeSbPJZNvDzNmw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_jQ7Wd2N5EeSbPJZNvDzNmw"/>
+ </children>
+ <element xmi:type="ecore:EClass" href="resource.ecore#//Action"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_jQ6vZ2N5EeSbPJZNvDzNmw" x="120" y="384"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_jQ7WeGN5EeSbPJZNvDzNmw" type="2001" fontName="Cantarell">
+ <children xmi:type="notation:DecorationNode" xmi:id="_jQ7WemN5EeSbPJZNvDzNmw" type="5001"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_jQ79gGN5EeSbPJZNvDzNmw" type="7001">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_jQ79gWN5EeSbPJZNvDzNmw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_jQ79gmN5EeSbPJZNvDzNmw"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_jQ79g2N5EeSbPJZNvDzNmw" type="7002">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_jQ79hGN5EeSbPJZNvDzNmw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_jQ79hWN5EeSbPJZNvDzNmw"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_jQ79hmN5EeSbPJZNvDzNmw" type="7003">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_jQ79h2N5EeSbPJZNvDzNmw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_jQ79iGN5EeSbPJZNvDzNmw"/>
+ </children>
+ <element xmi:type="ecore:EClass" href="resource.ecore#//Attribute"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_jQ7WeWN5EeSbPJZNvDzNmw" x="300" y="72"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_jQ79iWN5EeSbPJZNvDzNmw" type="2001" fontName="Cantarell">
+ <children xmi:type="notation:DecorationNode" xmi:id="_jQ8kkGN5EeSbPJZNvDzNmw" type="5001"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_jQ8kkWN5EeSbPJZNvDzNmw" type="7001">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_jQ8kkmN5EeSbPJZNvDzNmw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_jQ8kk2N5EeSbPJZNvDzNmw"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_jQ8klGN5EeSbPJZNvDzNmw" type="7002">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_jQ8klWN5EeSbPJZNvDzNmw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_jQ8klmN5EeSbPJZNvDzNmw"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_jQ8kl2N5EeSbPJZNvDzNmw" type="7003">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_jQ8kmGN5EeSbPJZNvDzNmw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_jQ8kmWN5EeSbPJZNvDzNmw"/>
+ </children>
+ <element xmi:type="ecore:EClass" href="resource.ecore#//Metadata"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_jQ79imN5EeSbPJZNvDzNmw" x="444" y="72"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_jQ8kmmN5EeSbPJZNvDzNmw" type="2001" fontName="Cantarell">
+ <children xmi:type="notation:DecorationNode" xmi:id="_jQ9LoGN5EeSbPJZNvDzNmw" type="5001"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_jQ9LoWN5EeSbPJZNvDzNmw" type="7001">
+ <children xmi:type="notation:Node" xmi:id="_9BX1sGN5EeSbPJZNvDzNmw" type="3001">
+ <element xmi:type="ecore:EAttribute" href="resource.ecore#//AccessMethod/type"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_9BX1sWN5EeSbPJZNvDzNmw"/>
+ </children>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_jQ9LomN5EeSbPJZNvDzNmw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_jQ9Lo2N5EeSbPJZNvDzNmw"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_jQ9LpGN5EeSbPJZNvDzNmw" type="7002">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_jQ9LpWN5EeSbPJZNvDzNmw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_jQ9LpmN5EeSbPJZNvDzNmw"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_jQ9Lp2N5EeSbPJZNvDzNmw" type="7003">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_jQ9LqGN5EeSbPJZNvDzNmw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_jQ9LqWN5EeSbPJZNvDzNmw"/>
+ </children>
+ <element xmi:type="ecore:EClass" href="resource.ecore#//AccessMethod"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_jQ8km2N5EeSbPJZNvDzNmw" x="300" y="276"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_jQ9LqmN5EeSbPJZNvDzNmw" type="2001" fontName="Cantarell">
+ <children xmi:type="notation:DecorationNode" xmi:id="_jQ9ysGN5EeSbPJZNvDzNmw" type="5001"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_jQ9ysWN5EeSbPJZNvDzNmw" type="7001">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_jQ9ysmN5EeSbPJZNvDzNmw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_jQ9ys2N5EeSbPJZNvDzNmw"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_jQ9ytGN5EeSbPJZNvDzNmw" type="7002">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_jQ9ytWN5EeSbPJZNvDzNmw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_jQ9ytmN5EeSbPJZNvDzNmw"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_jQ9yt2N5EeSbPJZNvDzNmw" type="7003">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_jQ9yuGN5EeSbPJZNvDzNmw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_jQ9yuWN5EeSbPJZNvDzNmw"/>
+ </children>
+ <element xmi:type="ecore:EClass" href="resource.ecore#//Parameter"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_jQ9Lq2N5EeSbPJZNvDzNmw" x="528" y="72"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_jQ-ZwGN5EeSbPJZNvDzNmw" type="2005" fontName="Cantarell">
+ <children xmi:type="notation:DecorationNode" xmi:id="_jQ-ZwmN5EeSbPJZNvDzNmw" type="5005"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_jQ-Zw2N5EeSbPJZNvDzNmw" type="7011">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_jQ-ZxGN5EeSbPJZNvDzNmw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_jQ-ZxWN5EeSbPJZNvDzNmw"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_jQ-ZxmN5EeSbPJZNvDzNmw" type="7012">
+ <styles xmi:type="notation:SortingStyle" xmi:id="_jQ-Zx2N5EeSbPJZNvDzNmw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_jQ-ZyGN5EeSbPJZNvDzNmw"/>
+ </children>
+ <element xmi:type="ecore:EEnum" href="resource.ecore#//AccessMethodType"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_jQ-ZwWN5EeSbPJZNvDzNmw" x="648" y="120"/>
+ </children>
+ <styles xmi:type="notation:DiagramStyle" xmi:id="_i66qMWN5EeSbPJZNvDzNmw"/>
+ <element xmi:type="ecore:EPackage" href="resource.ecore#/"/>
+ <edges xmi:type="notation:Connector" xmi:id="_jTAaEGN5EeSbPJZNvDzNmw" type="4004" source="_jQ1P1mN5EeSbPJZNvDzNmw" target="_jQ126mN5EeSbPJZNvDzNmw" routing="Tree">
+ <styles xmi:type="notation:FontStyle" xmi:id="_jTAaEWN5EeSbPJZNvDzNmw" fontName="Cantarell"/>
+ <element xsi:nil="true"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_jTAaEmN5EeSbPJZNvDzNmw" points="[1, -7, -108, 108]$[1, -19, -108, 96]$[133, -19, 24, 96]$[133, -54, 24, 61]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_jUb9cWN5EeSbPJZNvDzNmw" id="(0.8095238095238095,0.11475409836065574)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_jUb9cmN5EeSbPJZNvDzNmw" id="(0.34285714285714286,0.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_jTFSkGN5EeSbPJZNvDzNmw" type="4004" source="_jQ3sEGN5EeSbPJZNvDzNmw" target="_jQ126mN5EeSbPJZNvDzNmw" routing="Tree">
+ <styles xmi:type="notation:FontStyle" xmi:id="_jTFSkWN5EeSbPJZNvDzNmw" fontName="Cantarell"/>
+ <element xsi:nil="true"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_jTFSkmN5EeSbPJZNvDzNmw" points="[0, -14, -162, 252]$[0, -170, -162, 96]$[168, -170, 6, 96]$[168, -205, 6, 61]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_jUckgGN5EeSbPJZNvDzNmw" id="(0.8979591836734694,0.22950819672131148)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_jUckgWN5EeSbPJZNvDzNmw" id="(0.5142857142857142,0.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_jTKLEGN5EeSbPJZNvDzNmw" type="4004" source="_jQ4TIWN5EeSbPJZNvDzNmw" target="_jQ126mN5EeSbPJZNvDzNmw" routing="Tree">
+ <styles xmi:type="notation:FontStyle" xmi:id="_jTKLEWN5EeSbPJZNvDzNmw" fontName="Cantarell"/>
+ <element xsi:nil="true"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_jTKLEmN5EeSbPJZNvDzNmw" points="[92, -61, -156, 396]$[92, -361, -156, 96]$[224, -361, -24, 96]$[224, -396, -24, 61]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_jUckgmN5EeSbPJZNvDzNmw" id="(0.272108843537415,1.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_jUckg2N5EeSbPJZNvDzNmw" id="(0.8,0.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_jTMAQGN5EeSbPJZNvDzNmw" type="4004" source="_jQ46M2N5EeSbPJZNvDzNmw" target="_jQ4TIWN5EeSbPJZNvDzNmw" routing="Tree">
+ <styles xmi:type="notation:FontStyle" xmi:id="_jTMAQWN5EeSbPJZNvDzNmw" fontName="Cantarell"/>
+ <element xsi:nil="true"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_jTMAQmN5EeSbPJZNvDzNmw" points="[0, -53, -123, 168]$[0, -77, -123, 144]$[173, -77, 50, 144]$[173, -160, 50, 61]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_jUY6IWN5EeSbPJZNvDzNmw" id="(0.49230769230769234,1.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_jUY6ImN5EeSbPJZNvDzNmw" id="(0.1564625850340136,0.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_jTN1cGN5EeSbPJZNvDzNmw" type="4004" source="_jQ5hQ2N5EeSbPJZNvDzNmw" target="_jQ4TIWN5EeSbPJZNvDzNmw" routing="Tree">
+ <styles xmi:type="notation:FontStyle" xmi:id="_jTN1cWN5EeSbPJZNvDzNmw" fontName="Cantarell"/>
+ <element xsi:nil="true"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_jTN1cmN5EeSbPJZNvDzNmw" points="[0, -53, -136, 168]$[0, -77, -136, 144]$[93, -77, -43, 144]$[93, -160, -43, 61]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_jUYTE2N5EeSbPJZNvDzNmw" id="(0.49382716049382713,1.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_jUY6IGN5EeSbPJZNvDzNmw" id="(0.7891156462585034,0.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_jTPDkGN5EeSbPJZNvDzNmw" type="4002" source="_jQ6IVmN5EeSbPJZNvDzNmw" target="_jQ6vZmN5EeSbPJZNvDzNmw" routing="Rectilinear">
+ <children xmi:type="notation:DecorationNode" xmi:id="_jTPqoGN5EeSbPJZNvDzNmw" type="6001">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_jTPqoWN5EeSbPJZNvDzNmw" x="17" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_jTPqomN5EeSbPJZNvDzNmw" type="6003">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_jTPqo2N5EeSbPJZNvDzNmw" x="-4" y="16"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_jTPDkWN5EeSbPJZNvDzNmw" fontName="Cantarell"/>
+ <element xmi:type="ecore:EReference" href="resource.ecore#//StateVariable/modifier"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_jTPDkmN5EeSbPJZNvDzNmw" points="[-83, 24, 82, -29]$[-139, 24, 26, -29]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_jUaIQmN5EeSbPJZNvDzNmw" id="(0.9222222222222223,0.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_jUaIQ2N5EeSbPJZNvDzNmw" id="(0.5,1.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_jTRf0GN5EeSbPJZNvDzNmw" type="4004" source="_jQ6IVmN5EeSbPJZNvDzNmw" target="_jQ4TIWN5EeSbPJZNvDzNmw" routing="Tree">
+ <styles xmi:type="notation:FontStyle" xmi:id="_jTRf0WN5EeSbPJZNvDzNmw" fontName="Cantarell"/>
+ <element xsi:nil="true"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_jTRf0mN5EeSbPJZNvDzNmw" points="[0, -53, 183, 168]$[0, -77, 183, 144]$[-165, -77, 18, 144]$[-165, -160, 18, 61]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_jUaIQGN5EeSbPJZNvDzNmw" id="(0.5,1.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_jUaIQWN5EeSbPJZNvDzNmw" id="(0.3673469387755102,0.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_jTTVAGN5EeSbPJZNvDzNmw" type="4002" source="_jQ6vZmN5EeSbPJZNvDzNmw" target="_jQ6IVmN5EeSbPJZNvDzNmw" routing="Rectilinear">
+ <children xmi:type="notation:DecorationNode" xmi:id="_jTTVA2N5EeSbPJZNvDzNmw" type="6001">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_jTTVBGN5EeSbPJZNvDzNmw" x="12" y="-15"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_jTTVBWN5EeSbPJZNvDzNmw" type="6003">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_jTTVBmN5EeSbPJZNvDzNmw" x="3" y="21"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_jTTVAWN5EeSbPJZNvDzNmw" fontName="Cantarell"/>
+ <element xmi:type="ecore:EReference" href="resource.ecore#//Action/state"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_jTTVAmN5EeSbPJZNvDzNmw" points="[39, -30, -133, 23]$[95, -30, -77, 23]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_jUXE8mN5EeSbPJZNvDzNmw" id="(0.25,1.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_jUXE82N5EeSbPJZNvDzNmw" id="(0.8555555555555555,0.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_jTVKMGN5EeSbPJZNvDzNmw" type="4004" source="_jQ6vZmN5EeSbPJZNvDzNmw" target="_jQ4TIWN5EeSbPJZNvDzNmw" routing="Tree">
+ <styles xmi:type="notation:FontStyle" xmi:id="_jTVKMWN5EeSbPJZNvDzNmw" fontName="Cantarell"/>
+ <element xsi:nil="true"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_jTVKMmN5EeSbPJZNvDzNmw" points="[-15, -53, -49, 168]$[-15, -89, -49, 132]$[21, -89, -13, 132]$[21, -160, -13, 61]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_jUdLkGN5EeSbPJZNvDzNmw" id="(0.75,1.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_jUdLkWN5EeSbPJZNvDzNmw" id="(0.5782312925170068,0.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_jTW_YGN5EeSbPJZNvDzNmw" type="4004" source="_jQ7WeGN5EeSbPJZNvDzNmw" target="_jQ126mN5EeSbPJZNvDzNmw" routing="Tree">
+ <styles xmi:type="notation:FontStyle" xmi:id="_jTW_YWN5EeSbPJZNvDzNmw" fontName="Cantarell"/>
+ <element xsi:nil="true"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_jTW_YmN5EeSbPJZNvDzNmw" points="[19, -53, -35, 396]$[19, -356, -35, 93]$[19, -356, -35, 93]$[19, -388, -35, 61]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_jUZhMGN5EeSbPJZNvDzNmw" id="(0.25,1.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_jUZhMWN5EeSbPJZNvDzNmw" id="(0.9047619047619048,0.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_jTYNgGN5EeSbPJZNvDzNmw" type="4004" source="_jQ7WeGN5EeSbPJZNvDzNmw" target="_jQ3FAGN5EeSbPJZNvDzNmw" routing="Rectilinear">
+ <styles xmi:type="notation:FontStyle" xmi:id="_jTYNgWN5EeSbPJZNvDzNmw" fontName="Cantarell"/>
+ <element xsi:nil="true"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_jTYNgmN5EeSbPJZNvDzNmw" points="[14, -53, -110, 144]$[14, -77, -110, 120]$[146, -77, 22, 120]$[146, -136, 22, 61]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_jUZhMmN5EeSbPJZNvDzNmw" id="(0.5,1.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_jUZhM2N5EeSbPJZNvDzNmw" id="(0.49504950495049505,0.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_jTaCsGN5EeSbPJZNvDzNmw" type="4004" source="_jQ79iWN5EeSbPJZNvDzNmw" target="_jQ126mN5EeSbPJZNvDzNmw" routing="Tree">
+ <styles xmi:type="notation:FontStyle" xmi:id="_jTaCsWN5EeSbPJZNvDzNmw" fontName="Cantarell"/>
+ <element xsi:nil="true"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_jTaCsmN5EeSbPJZNvDzNmw" points="[12, -53, 101, 252]$[12, -65, 101, 240]$[-119, -65, -30, 240]$[-119, -244, -30, 61]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_jUavUmN5EeSbPJZNvDzNmw" id="(0.32857142857142857,1.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_jUbWYGN5EeSbPJZNvDzNmw" id="(0.8571428571428571,0.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_jTbQ0GN5EeSbPJZNvDzNmw" type="4004" source="_jQ79iWN5EeSbPJZNvDzNmw" target="_jQ3FAGN5EeSbPJZNvDzNmw" routing="Rectilinear">
+ <styles xmi:type="notation:FontStyle" xmi:id="_jTbQ0WN5EeSbPJZNvDzNmw" fontName="Cantarell"/>
+ <element xsi:nil="true"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_jTbQ0mN5EeSbPJZNvDzNmw" points="[-10, -53, 47, 144]$[-10, -136, 47, 61]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_jUavUGN5EeSbPJZNvDzNmw" id="(0.6571428571428571,1.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_jUavUWN5EeSbPJZNvDzNmw" id="(0.24752475247524752,0.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_jTfiQGN5EeSbPJZNvDzNmw" type="4004" source="_jQ9LqmN5EeSbPJZNvDzNmw" target="_jQ126mN5EeSbPJZNvDzNmw" routing="Tree">
+ <styles xmi:type="notation:FontStyle" xmi:id="_jTfiQWN5EeSbPJZNvDzNmw" fontName="Cantarell"/>
+ <element xsi:nil="true"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_jTfiQmN5EeSbPJZNvDzNmw" points="[0, -17, 216, 439]$[0, -413, 216, 43]$[-251, -413, -35, 43]$[-251, -448, -35, 8]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_jUXsAmN5EeSbPJZNvDzNmw" id="(0.8082191780821918,0.32075471698113206)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_jUYTEGN5EeSbPJZNvDzNmw" id="(0.9047619047619048,0.8688524590163934)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_jTgwYGN5EeSbPJZNvDzNmw" type="4004" source="_jQ9LqmN5EeSbPJZNvDzNmw" target="_jQ3FAGN5EeSbPJZNvDzNmw" routing="Rectilinear">
+ <styles xmi:type="notation:FontStyle" xmi:id="_jTgwYWN5EeSbPJZNvDzNmw" fontName="Cantarell"/>
+ <element xsi:nil="true"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_jTgwYmN5EeSbPJZNvDzNmw" points="[-17, -53, 76, 144]$[-17, -77, 76, 120]$[-96, -77, -3, 120]$[-96, -136, -3, 61]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_jUXsAGN5EeSbPJZNvDzNmw" id="(0.6575342465753424,1.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_jUXsAWN5EeSbPJZNvDzNmw" id="(0.7425742574257426,0.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_o9M8wGN5EeSbPJZNvDzNmw" type="4003" source="_jQyMgGN5EeSbPJZNvDzNmw" target="_jQ1P1mN5EeSbPJZNvDzNmw" routing="Rectilinear">
+ <children xmi:type="notation:DecorationNode" xmi:id="_o9Nj0GN5EeSbPJZNvDzNmw" type="6002">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_o9Nj0WN5EeSbPJZNvDzNmw" x="12" y="-23"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_o9Nj0mN5EeSbPJZNvDzNmw" type="6004">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_o9Nj02N5EeSbPJZNvDzNmw" x="-8" y="19"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_o9M8wWN5EeSbPJZNvDzNmw" fontName="Cantarell"/>
+ <element xmi:type="ecore:EReference" href="resource.ecore#//Devices/device"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_o9M8wmN5EeSbPJZNvDzNmw" points="[17, 27, -102, -154]$[99, 151, -20, -30]"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_-VPNsGPvEeS6p_6z2x3SEA" type="4003" source="_jQ1P1mN5EeSbPJZNvDzNmw" target="_jQ3sEGN5EeSbPJZNvDzNmw" routing="Rectilinear">
+ <children xmi:type="notation:DecorationNode" xmi:id="_-VP0wGPvEeS6p_6z2x3SEA" type="6002">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_-VP0wWPvEeS6p_6z2x3SEA" x="25" y="-29"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_-VP0wmPvEeS6p_6z2x3SEA" type="6004">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_-VP0w2PvEeS6p_6z2x3SEA" x="-4" y="15"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_-VPNsWPvEeS6p_6z2x3SEA" fontName="Cantarell"/>
+ <element xmi:type="ecore:EReference" href="resource.ecore#//Device/service"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_-VPNsmPvEeS6p_6z2x3SEA" points="[0, 0, 0, 0]$[0, 0, 0, 0]"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_-VTfIGPvEeS6p_6z2x3SEA" type="4003" source="_jQ3sEGN5EeSbPJZNvDzNmw" target="_jQ4TIWN5EeSbPJZNvDzNmw" routing="Rectilinear">
+ <children xmi:type="notation:DecorationNode" xmi:id="_-VTfI2PvEeS6p_6z2x3SEA" type="6002">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_-VTfJGPvEeS6p_6z2x3SEA" x="25" y="-27"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_-VUGMGPvEeS6p_6z2x3SEA" type="6004">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_-VUGMWPvEeS6p_6z2x3SEA" x="-4" y="21"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_-VTfIWPvEeS6p_6z2x3SEA" fontName="Cantarell"/>
+ <element xmi:type="ecore:EReference" href="resource.ecore#//Service/resource"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_-VTfImPvEeS6p_6z2x3SEA" points="[0, 0, 0, 0]$[0, 0, 0, 0]"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_-VWicGPvEeS6p_6z2x3SEA" type="4003" source="_jQ4TIWN5EeSbPJZNvDzNmw" target="_jQ7WeGN5EeSbPJZNvDzNmw" routing="Rectilinear">
+ <children xmi:type="notation:DecorationNode" xmi:id="_-VXJgGPvEeS6p_6z2x3SEA" type="6002">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_-VXJgWPvEeS6p_6z2x3SEA" x="43" y="-88"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_-VXJgmPvEeS6p_6z2x3SEA" type="6004">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_-VXJg2PvEeS6p_6z2x3SEA" x="18" y="-14"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_-VWicWPvEeS6p_6z2x3SEA" fontName="Cantarell"/>
+ <element xmi:type="ecore:EReference" href="resource.ecore#//Resource/attribute"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_-VWicmPvEeS6p_6z2x3SEA" points="[74, -18, -115, 130]$[191, -18, 2, 130]$[191, -121, 2, 27]"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_-VZlwGPvEeS6p_6z2x3SEA" type="4003" source="_jQ4TIWN5EeSbPJZNvDzNmw" target="_jQ8kmmN5EeSbPJZNvDzNmw" routing="Rectilinear">
+ <children xmi:type="notation:DecorationNode" xmi:id="_-VZlw2PvEeS6p_6z2x3SEA" type="6002">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_-VaM0GPvEeS6p_6z2x3SEA" x="117" y="14"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_-VaM0WPvEeS6p_6z2x3SEA" type="6004">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_-VaM0mPvEeS6p_6z2x3SEA" x="18" y="14"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_-VZlwWPvEeS6p_6z2x3SEA" fontName="Cantarell"/>
+ <element xmi:type="ecore:EReference" href="resource.ecore#//Resource/accessMethod"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_-VZlwmPvEeS6p_6z2x3SEA" points="[74, -6, -163, -54]$[239, -6, 2, -54]$[239, 18, 2, -30]"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_-VfsYGPvEeS6p_6z2x3SEA" type="4003" source="_jQ8kmmN5EeSbPJZNvDzNmw" target="_jQ9LqmN5EeSbPJZNvDzNmw" routing="Rectilinear">
+ <children xmi:type="notation:DecorationNode" xmi:id="_-VgTcGPvEeS6p_6z2x3SEA" type="6002">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_-VgTcWPvEeS6p_6z2x3SEA" x="122" y="-33"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_-VgTcmPvEeS6p_6z2x3SEA" type="6004">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_-VgTc2PvEeS6p_6z2x3SEA" x="32" y="22"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_-VfsYWPvEeS6p_6z2x3SEA" fontName="Cantarell"/>
+ <element xmi:type="ecore:EReference" href="resource.ecore#//AccessMethod/parameter"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_-VfsYmPvEeS6p_6z2x3SEA" points="[83, -6, -99, 202]$[182, -6, 0, 202]$[182, -181, 0, 27]"/>
+ </edges>
+</notation:Diagram>
diff --git a/services/org.eclipse.sensinact.studio.model.resource/models/resource.genmodel b/services/org.eclipse.sensinact.studio.model.resource/models/resource.genmodel
new file mode 100644
index 0000000..3561579
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource/models/resource.genmodel
@@ -0,0 +1,61 @@
+<?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" modelDirectory="/org.eclipse.sensinact.studio.model.resource/src-gen"
+ modelPluginID="org.eclipse.sensinact.studio.model.resource" modelName="Resource"
+ rootExtendsClass="org.eclipse.emf.ecore.impl.MinimalEObjectImpl$Container" importerID="org.eclipse.emf.importer.ecore"
+ complianceLevel="6.0" copyrightFields="false" operationReflection="true" importOrganizing="true">
+ <foreignModel>resource.ecore</foreignModel>
+ <genPackages prefix="Resource" basePackage="org.eclipse.sensinact.studio" disposableProviderFactory="true"
+ ecorePackage="resource.ecore#/">
+ <genEnums typeSafeEnumCompatible="false" ecoreEnum="resource.ecore#//AccessMethodType">
+ <genEnumLiterals ecoreEnumLiteral="resource.ecore#//AccessMethodType/GET"/>
+ <genEnumLiterals ecoreEnumLiteral="resource.ecore#//AccessMethodType/SET"/>
+ <genEnumLiterals ecoreEnumLiteral="resource.ecore#//AccessMethodType/ACT"/>
+ <genEnumLiterals ecoreEnumLiteral="resource.ecore#//AccessMethodType/SUBSCRIBE"/>
+ <genEnumLiterals ecoreEnumLiteral="resource.ecore#//AccessMethodType/UNSUBSCRIBE"/>
+ </genEnums>
+ <genClasses ecoreClass="resource.ecore#//Devices">
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference resource.ecore#//Devices/device"/>
+ </genClasses>
+ <genClasses ecoreClass="resource.ecore#//Device">
+ <genFeatures createChild="false" ecoreFeature="ecore:EAttribute resource.ecore#//Device/friendlyName"/>
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference resource.ecore#//Device/service"/>
+ </genClasses>
+ <genClasses ecoreClass="resource.ecore#//NamedElement">
+ <genFeatures createChild="false" ecoreFeature="ecore:EAttribute resource.ecore#//NamedElement/name"/>
+ </genClasses>
+ <genClasses ecoreClass="resource.ecore#//TypedElement">
+ <genFeatures createChild="false" ecoreFeature="ecore:EAttribute resource.ecore#//TypedElement/type"/>
+ <genFeatures createChild="false" ecoreFeature="ecore:EAttribute resource.ecore#//TypedElement/value"/>
+ </genClasses>
+ <genClasses ecoreClass="resource.ecore#//Service">
+ <genFeatures createChild="false" ecoreFeature="ecore:EAttribute resource.ecore#//Service/friendlyName"/>
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference resource.ecore#//Service/resource"/>
+ </genClasses>
+ <genClasses ecoreClass="resource.ecore#//Resource">
+ <genFeatures createChild="false" ecoreFeature="ecore:EAttribute resource.ecore#//Resource/friendlyName"/>
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference resource.ecore#//Resource/attribute"/>
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference resource.ecore#//Resource/accessMethod"/>
+ <genOperations ecoreOperation="resource.ecore#//Resource/getAccessMethod">
+ <genParameters ecoreParameter="resource.ecore#//Resource/getAccessMethod/type"/>
+ </genOperations>
+ </genClasses>
+ <genClasses ecoreClass="resource.ecore#//Property"/>
+ <genClasses ecoreClass="resource.ecore#//SensorData"/>
+ <genClasses ecoreClass="resource.ecore#//StateVariable">
+ <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference resource.ecore#//StateVariable/modifier"/>
+ </genClasses>
+ <genClasses ecoreClass="resource.ecore#//Action">
+ <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference resource.ecore#//Action/state"/>
+ </genClasses>
+ <genClasses ecoreClass="resource.ecore#//Attribute">
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference resource.ecore#//Attribute/metadata"/>
+ </genClasses>
+ <genClasses ecoreClass="resource.ecore#//Metadata"/>
+ <genClasses ecoreClass="resource.ecore#//AccessMethod">
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference resource.ecore#//AccessMethod/parameter"/>
+ <genFeatures createChild="false" ecoreFeature="ecore:EAttribute resource.ecore#//AccessMethod/type"/>
+ </genClasses>
+ <genClasses ecoreClass="resource.ecore#//Parameter"/>
+ </genPackages>
+</genmodel:GenModel>
diff --git a/services/org.eclipse.sensinact.studio.model.resource/models/sensinact-resource.xsd b/services/org.eclipse.sensinact.studio.model.resource/models/sensinact-resource.xsd
new file mode 100644
index 0000000..6670fd3
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource/models/sensinact-resource.xsd
@@ -0,0 +1,413 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Copyright (c) 2017 CEA.
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+
+ Contributors:
+ CEA - initial API and implementation and/or initial documentation
+
+-->
+<schema targetNamespace="http://eclipse.org/sensinact/resource"
+elementFormDefault="qualified" attributeFormDefault="unqualified" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:sensinact="http://eclipse.org/sensinact/resource">
+
+ <simpleType name="assign_enum">
+ <restriction base="string">
+ <enumeration value="EACH"/>
+ <enumeration value="EMPTY"/>
+ </restriction>
+ </simpleType>
+
+ <simpleType name="update_enum">
+ <restriction base="string">
+ <enumeration value="INIT"/>
+ <enumeration value="AUTO"/>
+ <enumeration value="NONE"/>
+ </restriction>
+ </simpleType>
+
+ <simpleType name="type_enum">
+ <restriction base="string">
+ <enumeration value="GET"/>
+ <enumeration value="SET"/>
+ <enumeration value="ACT"/>
+ <enumeration value="SUBSCRIBE"/>
+ <enumeration value="UNSUBSCRIBE"/>
+ <enumeration value="HELLO"/>
+ <enumeration value="GOODBYE"/>
+ <enumeration value="SERVICES_ENUMERATION"/>
+ </restriction>
+ </simpleType>
+
+ <simpleType name="policy_enum">
+ <restriction base="string">
+ <enumeration value="VARIABLE"/>
+ <enumeration value="SENSOR"/>
+ <enumeration value="PROPERTY"/>
+ <enumeration value="ACTION"/>
+ </restriction>
+ </simpleType>
+
+ <simpleType name="scope_enum">
+ <restriction base="string">
+ <enumeration value="DEVICE"/>
+ <enumeration value="SERVICE"/>
+ </restriction>
+ </simpleType>
+
+ <complexType name="policies">
+ <sequence>
+ <element name="policy" type="sensinact:policy" minOccurs="0" maxOccurs="4"/>
+ </sequence>
+ </complexType>
+
+ <complexType name="policy">
+ <simpleContent>
+ <extension base="QName">
+ <attribute name="name" type="sensinact:policy_enum" use="required"/>
+ <attribute name="update" type="sensinact:update_enum" use="optional" default="NONE"/>
+ </extension>
+ </simpleContent>
+ </complexType>
+
+ <complexType name="simpleContent" abstract="true">
+ <simpleContent>
+ <extension base="anySimpleType"/>
+ </simpleContent>
+ </complexType>
+
+ <complexType name="binaryHexContent" abstract="false">
+ <simpleContent>
+ <restriction base="sensinact:simpleContent">
+ <simpleType>
+ <restriction base="hexBinary">
+ <whiteSpace value="collapse"/>
+ </restriction>
+ </simpleType>
+ </restriction>
+ </simpleContent>
+ </complexType>
+
+ <complexType name="stringContent" abstract="false">
+ <simpleContent>
+ <restriction base="sensinact:simpleContent">
+ <simpleType>
+ <restriction base="string">
+ <whiteSpace value="collapse"/>
+ </restriction>
+ </simpleType>
+ </restriction>
+ </simpleContent>
+ </complexType>
+
+ <complexType name="valueType">
+ <simpleContent>
+ <extension base="sensinact:simpleContent">
+ <attribute name="target" type="string" use="optional"/>
+ </extension>
+ </simpleContent>
+ </complexType>
+
+ <complexType name="restrictedValueType">
+ <simpleContent>
+ <extension base="sensinact:simpleContent"/>
+ </simpleContent>
+ </complexType>
+
+ <complexType name="typeType">
+ <simpleContent>
+ <extension base="QName">
+ <attribute name="target" type="string" use="optional"/>
+ </extension>
+ </simpleContent>
+ </complexType>
+
+ <complexType name="restrictedTypeType">
+ <simpleContent>
+ <extension base="QName"/>
+ </simpleContent>
+ </complexType>
+
+ <complexType name="nameTypeValue" abstract="true"/>
+
+ <complexType name="parameter" >
+ <complexContent>
+ <extension base="sensinact:nameTypeValue">
+ <sequence>
+ <element name="type" type="sensinact:restrictedTypeType" minOccurs="1" maxOccurs="1"/>
+ </sequence>
+ <attribute name="name" type="string" use="required"/>
+ </extension>
+ </complexContent>
+ </complexType>
+
+ <complexType name="parameters" >
+ <sequence>
+ <element name="parameter" type="sensinact:parameter" minOccurs="0" maxOccurs="unbounded"/>
+ </sequence>
+ </complexType>
+
+ <complexType name="reference" >
+ <complexContent>
+ <extension base="sensinact:nameTypeValue">
+ <sequence>
+ <element name="type" type="sensinact:restrictedTypeType" minOccurs="1" maxOccurs="1"/>
+ <element name="value" type="sensinact:restrictedValueType" minOccurs="1" maxOccurs="1"/>
+ </sequence>
+ <attribute name="name" type="string" use="required"/>
+ <attribute name="policy" type="sensinact:policy_enum" use="optional" fixed="VARIABLE"/>
+ </extension>
+ </complexContent>
+ </complexType>
+
+ <complexType name="references" >
+ <sequence>
+ <element name="reference" type="sensinact:reference" minOccurs="0" maxOccurs="unbounded"/>
+ </sequence>
+ <attribute name="assignation" type="sensinact:assign_enum" use="required">
+ <annotation>
+ <documentation>
+ Defines whether the assignation of the specified value(s)
+ to referenced StateVariableResource(s) is done after each call or only when
+ the act method is called without parameter
+ </documentation>
+ </annotation>
+ </attribute>
+ </complexType>
+
+ <simpleType name="nameTypeValueKeyWordsExcludedString">
+ <restriction base="string">
+ <pattern value="([^ntv]|n[^a]|t[^y]|v[^a]|na[^m]|ty[^p]|va[^l]|nam[^e]|typ[^e]|val[^u]|name[a-z0-9]|type[a-z0-9]|valu[^e]|value[a-z0-9])[a-z0-9_\-]*"/>
+ </restriction>
+ </simpleType>
+
+ <simpleType name="modifiableKeyWordExcludedString">
+ <restriction base="string">
+ <pattern value="([^m]|m[^o]|mo[^d]|mod[^i]|modi[^f]|modif[^i]|modifi[^a]|modifia[^b]|modifiab[^l]|modifiabl[^e]|modifiable[a-z0-9])[a-z0-9_\-]*"/>
+ </restriction>
+ </simpleType>
+
+ <complexType name="metadata">
+ <complexContent>
+ <extension base="sensinact:nameTypeValue">
+ <sequence>
+ <element name="type" type="sensinact:restrictedTypeType" minOccurs="1" maxOccurs="1"/>
+ <element name="value" type="sensinact:valueType" minOccurs="0" maxOccurs="unbounded"/>
+ </sequence>
+ <attribute name="name" use="required" type="sensinact:modifiableKeyWordExcludedString"/>
+ </extension>
+ </complexContent>
+ </complexType>
+
+ <complexType name="attribute">
+ <complexContent>
+ <extension base="sensinact:nameTypeValue">
+ <sequence>
+ <element name="type" type="sensinact:typeType" minOccurs="1" maxOccurs="unbounded"/>
+ <element name="value" type="sensinact:valueType" minOccurs="0" maxOccurs="unbounded"/>
+ <element name="metadata" minOccurs="0" maxOccurs="unbounded" type="sensinact:metadata">
+ <unique name="uniqueMetadataValueTarget">
+ <selector xpath="./sensinact:value"/>
+ <field xpath="@target"/>
+ </unique>
+ </element>
+ </sequence>
+ <attribute name="name" use="required" type="sensinact:nameTypeValueKeyWordsExcludedString"/>
+ <attribute name="modifiable" type="boolean" default="false" use="optional"/>
+ </extension>
+ </complexContent>
+ </complexType>
+
+ <complexType name="command">
+ <sequence maxOccurs="1" minOccurs="1">
+ <element name="identifier" type="sensinact:simpleContent" minOccurs="1" maxOccurs="1"/>
+ </sequence>
+ <attribute name="type" type="sensinact:type_enum" use="required"/>
+ </complexType>
+
+ <complexType name="commands">
+ <sequence maxOccurs="1" minOccurs="1">
+ <element name="command" type="sensinact:command" minOccurs="0" maxOccurs="8"/>
+ </sequence>
+ </complexType>
+
+ <complexType name="resourceInfo" abstract="true">
+ <sequence maxOccurs="1" minOccurs="1">
+ <element name="policy" type="sensinact:policy" minOccurs="0" maxOccurs="1"/>
+ <element name="identifier" type="sensinact:simpleContent" minOccurs="1" maxOccurs="1"/>
+ <element name="attribute" type="sensinact:attribute" minOccurs="0" maxOccurs="unbounded">
+ <unique name="uniqueAttributeTypeTarget">
+ <selector xpath="./sensinact:type"/>
+ <field xpath="@target"/>
+ </unique>
+ <unique name="uniqueAttributeValueTarget">
+ <selector xpath="./sensinact:value"/>
+ <field xpath="@target"/>
+ </unique>
+ </element>
+ </sequence>
+ <attribute name="name" type="string" use="required"/>
+ <attribute name="scope" type="sensinact:scope_enum" use="required"/>
+ <attribute name="target" type="string" use="optional"/>
+ </complexType>
+
+ <complexType name="resourceInfoData" abstract="true">
+ <complexContent>
+ <extension base="sensinact:resourceInfo">
+ <sequence>
+ <element name="type" type="sensinact:typeType" minOccurs="1" maxOccurs="unbounded">
+ <annotation>
+ <documentation>Type of the associated Resource's 'value' attribute </documentation>
+ </annotation>
+ </element>
+ <element name="value" type="sensinact:valueType" minOccurs="0" maxOccurs="unbounded">
+ <annotation>
+ <documentation>Value of the associated Resource's 'value' attribute </documentation>
+ </annotation>
+ </element>
+ <element name="metadata" type="sensinact:metadata" minOccurs="0" maxOccurs="unbounded">
+ <annotation>
+ <documentation>Metadata of the associated Resource's 'value' attribute</documentation>
+ </annotation>
+ <unique name="uniqueResourceInfoMetadataValueTarget">
+ <selector xpath="./sensinact:value"/>
+ <field xpath="@target"/>
+ </unique>
+ </element>
+ </sequence>
+ <attribute name="modifiable" type="boolean" use="optional" default="false" />
+ </extension>
+ </complexContent>
+ </complexType>
+
+ <complexType name="resourceInfoVariable" >
+ <complexContent>
+ <extension base="sensinact:resourceInfoData">
+ <attribute name="policy" type="sensinact:policy_enum" use="optional" fixed="VARIABLE"/>
+ </extension>
+ </complexContent>
+ </complexType>
+
+ <complexType name="resourceInfoProperty" >
+ <complexContent>
+ <extension base="sensinact:resourceInfoData">
+ <attribute name="policy" type="sensinact:policy_enum" use="optional" fixed="PROPERTY"/>
+ </extension>
+ </complexContent>
+ </complexType>
+
+ <complexType name="resourceInfoSensor" >
+ <complexContent>
+ <extension base="sensinact:resourceInfoData">
+ <attribute name="policy" type="sensinact:policy_enum" use="optional" fixed="SENSOR"/>
+ </extension>
+ </complexContent>
+ </complexType>
+
+ <complexType name="resourceInfoAction" >
+ <complexContent>
+ <extension base="sensinact:resourceInfo">
+ <sequence>
+ <element name="references" type="sensinact:references" minOccurs="0" maxOccurs="2"/>
+ <element name="parameters" type="sensinact:parameters" minOccurs="0" maxOccurs="unbounded"/>
+ </sequence>
+ <attribute name="removeWithoutParameter" type="boolean" use="optional" default="false"/>
+ <attribute name="policy" type="sensinact:policy_enum" use="optional" fixed="ACTION"/>
+ </extension>
+ </complexContent>
+ </complexType>
+
+ <complexType name="devices">
+ <annotation>
+ <documentation>Defines devices to reified before any discovering process</documentation>
+ </annotation>
+ <sequence>
+ <element name="device" type="sensinact:device" minOccurs="0" maxOccurs="unbounded">
+ <unique name="uniqueServiceName">
+ <selector xpath="./sensinact:service"/>
+ <field xpath="@name"></field>
+ </unique>
+ </element>
+ </sequence>
+ </complexType>
+
+ <complexType name="device">
+ <sequence>
+ <element name="service" type="sensinact:service" minOccurs="0" maxOccurs="unbounded"/>
+ </sequence>
+ <attribute name="identifier" type="string"/>
+ </complexType>
+
+ <complexType name="service">
+ <attribute name="name" type="string"/>
+ </complexType>
+
+ <complexType name="resourceInfos">
+ <sequence>
+ <element name="policies" type="sensinact:policies" minOccurs="0" maxOccurs="1"/>
+ <element name="commands" type="sensinact:commands" minOccurs="0" maxOccurs="1">
+ <unique name="uniqueCommandType">
+ <selector xpath="./sensinact:command"/>
+ <field xpath="@type"/>
+ </unique>
+ </element>
+ <element name="resourceInfo" type="sensinact:resourceInfo" minOccurs="0" maxOccurs="unbounded">
+ <unique name="references_call">
+ <selector xpath="./sensinact:references"/>
+ <field xpath="@assign"/>
+ </unique>
+ <unique name="uniqueResourceInfoTypeTarget">
+ <selector xpath="./sensinact:type"/>
+ <field xpath="@target"/>
+ </unique>
+ <unique name="uniqueResourceInfoValueTarget">
+ <selector xpath="./sensinact:value"/>
+ <field xpath="@target"/>
+ </unique>
+ <unique name="uniqueAttributeName">
+ <selector xpath="./sensinact:attribute"/>
+ <field xpath="@name"/>
+ </unique>
+ <key name="resourceInfoPolicy">
+ <selector xpath="."/>
+ <field xpath="@policy"/>
+ </key>
+ <keyref name="resourceInfoPolicyRef" refer="sensinact:resourceInfoPolicy">
+ <selector xpath="./sensinact:policy"/>
+ <field xpath="@name"/>
+ </keyref>
+ </element>
+ <element name="devices" type="sensinact:devices" minOccurs="0" maxOccurs="1">
+ <unique name="uniqueDeviceIdentifier">
+ <selector xpath="./sensinact:device"/>
+ <field xpath="@identifier"/>
+ </unique>
+ </element>
+ </sequence>
+ </complexType>
+
+ <element name="resourceInfos" type="sensinact:resourceInfos">
+ <key name="resourceInfoName">
+ <selector xpath="./sensinact:resourceInfo"/>
+ <field xpath="@name"/>
+ </key>
+ <key name="resourceInfoVariable">
+ <selector xpath="./sensinact:resourceInfo"/>
+ <field xpath="@name"/>
+ <field xpath="@policy"/>
+ </key>
+ <keyref name="resourceInfoVariableRef" refer="sensinact:resourceInfoVariable">
+ <selector xpath="./sensinact:resourceInfo/sensinact:references/sensinact:reference"/>
+ <field xpath="@name"/>
+ <field xpath="@policy"/>
+ </keyref>
+ <unique name="policyRef">
+ <selector xpath="./sensinact:policies/sensinact:policy"/>
+ <field xpath="@name"/>
+ </unique>
+ </element>
+
+</schema>
\ No newline at end of file
diff --git a/services/org.eclipse.sensinact.studio.model.resource/plugin.properties b/services/org.eclipse.sensinact.studio.model.resource/plugin.properties
new file mode 100644
index 0000000..01d4695
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource/plugin.properties
@@ -0,0 +1,15 @@
+#
+# Copyright (c) 2017 CEA.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+# CEA - initial API and implementation and/or initial documentation
+#
+
+#
+
+pluginName = Sensinact-resource Model
+providerName = www.example.org
diff --git a/services/org.eclipse.sensinact.studio.model.resource/plugin.xml b/services/org.eclipse.sensinact.studio.model.resource/plugin.xml
new file mode 100644
index 0000000..6905557
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource/plugin.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Copyright (c) 2017 CEA.
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+
+ Contributors:
+ CEA - initial API and implementation and/or initial documentation
+
+-->
+<?eclipse version="3.0"?>
+
+<plugin>
+ <extension point="org.eclipse.emf.ecore.generated_package">
+ <!-- @generated sensinact-resource -->
+ <package
+ uri="http://eclipse.org/sensinact/resource"
+ class="org.eclipse.sensinact.studio.resource.ResourcePackage"
+ genModel="models/resource.genmodel"/>
+ </extension>
+
+ <extension point="org.eclipse.emf.ecore.extension_parser">
+ <!-- @generated sensinact-resource -->
+ <parser
+ type="resource"
+ class="org.eclipse.sensinact.studio.resource.impl.ResourceFactoryImpl"/>
+ </extension>
+</plugin>
diff --git a/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/AccessMethod.java b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/AccessMethod.java
new file mode 100644
index 0000000..68ed385
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/AccessMethod.java
@@ -0,0 +1,82 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Access Method</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.resource.AccessMethod#getParameter <em>Parameter</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.resource.AccessMethod#getType <em>Type</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.sensinact.studio.resource.ResourcePackage#getAccessMethod()
+ * @model
+ * @generated
+ */
+public interface AccessMethod extends EObject {
+ /**
+ * Returns the value of the '<em><b>Parameter</b></em>' containment reference list.
+ * The list contents are of type {@link org.eclipse.sensinact.studio.resource.Parameter}.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Parameter</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>Parameter</em>' containment reference list.
+ * @see org.eclipse.sensinact.studio.resource.ResourcePackage#getAccessMethod_Parameter()
+ * @model containment="true"
+ * @generated
+ */
+ EList<Parameter> getParameter();
+
+ /**
+ * Returns the value of the '<em><b>Type</b></em>' attribute.
+ * The literals are from the enumeration {@link org.eclipse.sensinact.studio.resource.AccessMethodType}.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Type</em>' attribute isn't clear,
+ * there really should be more of a description here...
+ * </p>
+ * <!-- end-user-doc -->
+ * @return the value of the '<em>Type</em>' attribute.
+ * @see org.eclipse.sensinact.studio.resource.AccessMethodType
+ * @see #setType(AccessMethodType)
+ * @see org.eclipse.sensinact.studio.resource.ResourcePackage#getAccessMethod_Type()
+ * @model
+ * @generated
+ */
+ AccessMethodType getType();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.resource.AccessMethod#getType <em>Type</em>}' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Type</em>' attribute.
+ * @see org.eclipse.sensinact.studio.resource.AccessMethodType
+ * @see #getType()
+ * @generated
+ */
+ void setType(AccessMethodType value);
+
+} // AccessMethod
diff --git a/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/AccessMethodType.java b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/AccessMethodType.java
new file mode 100644
index 0000000..14fe236
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/AccessMethodType.java
@@ -0,0 +1,301 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.emf.common.util.Enumerator;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the literals of the enumeration '<em><b>Access Method Type</b></em>',
+ * and utility methods for working with them.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.resource.ResourcePackage#getAccessMethodType()
+ * @model
+ * @generated
+ */
+public enum AccessMethodType implements Enumerator {
+ /**
+ * The '<em><b>GET</b></em>' literal object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #GET_VALUE
+ * @generated
+ * @ordered
+ */
+ GET(0, "GET", "GET"),
+
+ /**
+ * The '<em><b>SET</b></em>' literal object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #SET_VALUE
+ * @generated
+ * @ordered
+ */
+ SET(0, "SET", "SET"),
+
+ /**
+ * The '<em><b>ACT</b></em>' literal object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #ACT_VALUE
+ * @generated
+ * @ordered
+ */
+ ACT(0, "ACT", "ACT"),
+
+ /**
+ * The '<em><b>SUBSCRIBE</b></em>' literal object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #SUBSCRIBE_VALUE
+ * @generated
+ * @ordered
+ */
+ SUBSCRIBE(0, "SUBSCRIBE", "SUBSCRIBE"),
+
+ /**
+ * The '<em><b>UNSUBSCRIBE</b></em>' literal object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #UNSUBSCRIBE_VALUE
+ * @generated
+ * @ordered
+ */
+ UNSUBSCRIBE(0, "UNSUBSCRIBE", "UNSUBSCRIBE");
+
+ /**
+ * The '<em><b>GET</b></em>' literal value.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of '<em><b>GET</b></em>' literal object isn't clear,
+ * there really should be more of a description here...
+ * </p>
+ * <!-- end-user-doc -->
+ * @see #GET
+ * @model
+ * @generated
+ * @ordered
+ */
+ public static final int GET_VALUE = 0;
+
+ /**
+ * The '<em><b>SET</b></em>' literal value.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of '<em><b>SET</b></em>' literal object isn't clear,
+ * there really should be more of a description here...
+ * </p>
+ * <!-- end-user-doc -->
+ * @see #SET
+ * @model
+ * @generated
+ * @ordered
+ */
+ public static final int SET_VALUE = 0;
+
+ /**
+ * The '<em><b>ACT</b></em>' literal value.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of '<em><b>ACT</b></em>' literal object isn't clear,
+ * there really should be more of a description here...
+ * </p>
+ * <!-- end-user-doc -->
+ * @see #ACT
+ * @model
+ * @generated
+ * @ordered
+ */
+ public static final int ACT_VALUE = 0;
+
+ /**
+ * The '<em><b>SUBSCRIBE</b></em>' literal value.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of '<em><b>SUBSCRIBE</b></em>' literal object isn't clear,
+ * there really should be more of a description here...
+ * </p>
+ * <!-- end-user-doc -->
+ * @see #SUBSCRIBE
+ * @model
+ * @generated
+ * @ordered
+ */
+ public static final int SUBSCRIBE_VALUE = 0;
+
+ /**
+ * The '<em><b>UNSUBSCRIBE</b></em>' literal value.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of '<em><b>UNSUBSCRIBE</b></em>' literal object isn't clear,
+ * there really should be more of a description here...
+ * </p>
+ * <!-- end-user-doc -->
+ * @see #UNSUBSCRIBE
+ * @model
+ * @generated
+ * @ordered
+ */
+ public static final int UNSUBSCRIBE_VALUE = 0;
+
+ /**
+ * An array of all the '<em><b>Access Method Type</b></em>' enumerators.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ private static final AccessMethodType[] VALUES_ARRAY =
+ new AccessMethodType[] {
+ GET,
+ SET,
+ ACT,
+ SUBSCRIBE,
+ UNSUBSCRIBE,
+ };
+
+ /**
+ * A public read-only list of all the '<em><b>Access Method Type</b></em>' enumerators.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public static final List<AccessMethodType> VALUES = Collections.unmodifiableList(Arrays.asList(VALUES_ARRAY));
+
+ /**
+ * Returns the '<em><b>Access Method Type</b></em>' literal with the specified literal value.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param literal the literal.
+ * @return the matching enumerator or <code>null</code>.
+ * @generated
+ */
+ public static AccessMethodType get(String literal) {
+ for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+ AccessMethodType result = VALUES_ARRAY[i];
+ if (result.toString().equals(literal)) {
+ return result;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Returns the '<em><b>Access Method Type</b></em>' literal with the specified name.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param name the name.
+ * @return the matching enumerator or <code>null</code>.
+ * @generated
+ */
+ public static AccessMethodType getByName(String name) {
+ for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+ AccessMethodType result = VALUES_ARRAY[i];
+ if (result.getName().equals(name)) {
+ return result;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Returns the '<em><b>Access Method Type</b></em>' literal with the specified integer value.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the integer value.
+ * @return the matching enumerator or <code>null</code>.
+ * @generated
+ */
+ public static AccessMethodType get(int value) {
+ switch (value) {
+ case GET_VALUE: return GET;
+ }
+ return null;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ private final int value;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ private final String name;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ private final String literal;
+
+ /**
+ * Only this class can construct instances.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ private AccessMethodType(int value, String name, String literal) {
+ this.value = value;
+ this.name = name;
+ this.literal = literal;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public int getValue() {
+ return value;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public String getLiteral() {
+ return literal;
+ }
+
+ /**
+ * Returns the literal value of the enumerator, which is its string representation.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public String toString() {
+ return literal;
+ }
+
+} //AccessMethodType
diff --git a/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/Action.java b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/Action.java
new file mode 100644
index 0000000..947ccc8
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/Action.java
@@ -0,0 +1,52 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Action</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.resource.Action#getState <em>State</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.sensinact.studio.resource.ResourcePackage#getAction()
+ * @model
+ * @generated
+ */
+public interface Action extends Resource {
+ /**
+ * Returns the value of the '<em><b>State</b></em>' reference list.
+ * The list contents are of type {@link org.eclipse.sensinact.studio.resource.StateVariable}.
+ * It is bidirectional and its opposite is '{@link org.eclipse.sensinact.studio.resource.StateVariable#getModifier <em>Modifier</em>}'.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>State</em>' reference list isn't clear,
+ * there really should be more of a description here...
+ * </p>
+ * <!-- end-user-doc -->
+ * @return the value of the '<em>State</em>' reference list.
+ * @see org.eclipse.sensinact.studio.resource.ResourcePackage#getAction_State()
+ * @see org.eclipse.sensinact.studio.resource.StateVariable#getModifier
+ * @model opposite="modifier"
+ * @generated
+ */
+ EList<StateVariable> getState();
+
+} // Action
diff --git a/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/Attribute.java b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/Attribute.java
new file mode 100644
index 0000000..eaf0c4b
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/Attribute.java
@@ -0,0 +1,50 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Attribute</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.resource.Attribute#getMetadata <em>Metadata</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.sensinact.studio.resource.ResourcePackage#getAttribute()
+ * @model
+ * @generated
+ */
+public interface Attribute extends TypedElement {
+ /**
+ * Returns the value of the '<em><b>Metadata</b></em>' containment reference list.
+ * The list contents are of type {@link org.eclipse.sensinact.studio.resource.Metadata}.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Metadata</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>Metadata</em>' containment reference list.
+ * @see org.eclipse.sensinact.studio.resource.ResourcePackage#getAttribute_Metadata()
+ * @model containment="true"
+ * @generated
+ */
+ EList<Metadata> getMetadata();
+
+} // Attribute
diff --git a/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/Device.java b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/Device.java
new file mode 100644
index 0000000..5995552
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/Device.java
@@ -0,0 +1,77 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Device</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.resource.Device#getFriendlyName <em>Friendly Name</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.resource.Device#getService <em>Service</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.sensinact.studio.resource.ResourcePackage#getDevice()
+ * @model
+ * @generated
+ */
+public interface Device extends NamedElement {
+ /**
+ * Returns the value of the '<em><b>Friendly Name</b></em>' attribute.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Friendly 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>Friendly Name</em>' attribute.
+ * @see #setFriendlyName(String)
+ * @see org.eclipse.sensinact.studio.resource.ResourcePackage#getDevice_FriendlyName()
+ * @model
+ * @generated
+ */
+ String getFriendlyName();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.resource.Device#getFriendlyName <em>Friendly Name</em>}' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Friendly Name</em>' attribute.
+ * @see #getFriendlyName()
+ * @generated
+ */
+ void setFriendlyName(String value);
+
+ /**
+ * Returns the value of the '<em><b>Service</b></em>' containment reference list.
+ * The list contents are of type {@link org.eclipse.sensinact.studio.resource.Service}.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Service</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>Service</em>' containment reference list.
+ * @see org.eclipse.sensinact.studio.resource.ResourcePackage#getDevice_Service()
+ * @model containment="true"
+ * @generated
+ */
+ EList<Service> getService();
+
+} // Device
diff --git a/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/Gateway.java b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/Gateway.java
new file mode 100644
index 0000000..0960650
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/Gateway.java
@@ -0,0 +1,50 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Gateway</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.resource.Gateway#getDevice <em>Device</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.sensinact.studio.resource.ResourcePackage#getGateway()
+ * @model
+ * @generated
+ */
+public interface Gateway extends NamedElement {
+ /**
+ * Returns the value of the '<em><b>Device</b></em>' containment reference list.
+ * The list contents are of type {@link org.eclipse.sensinact.studio.resource.Device}.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Device</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>Device</em>' containment reference list.
+ * @see org.eclipse.sensinact.studio.resource.ResourcePackage#getGateway_Device()
+ * @model containment="true"
+ * @generated
+ */
+ EList<Device> getDevice();
+
+} // Gateway
diff --git a/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/Metadata.java b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/Metadata.java
new file mode 100644
index 0000000..1eea029
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/Metadata.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Metadata</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.sensinact.studio.resource.ResourcePackage#getMetadata()
+ * @model
+ * @generated
+ */
+public interface Metadata extends TypedElement {
+} // Metadata
diff --git a/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/NamedElement.java b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/NamedElement.java
new file mode 100644
index 0000000..cfeae5b
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/NamedElement.java
@@ -0,0 +1,60 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Named Element</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.resource.NamedElement#getName <em>Name</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.sensinact.studio.resource.ResourcePackage#getNamedElement()
+ * @model
+ * @generated
+ */
+public interface NamedElement 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 org.eclipse.sensinact.studio.resource.ResourcePackage#getNamedElement_Name()
+ * @model
+ * @generated
+ */
+ String getName();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.resource.NamedElement#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);
+
+} // NamedElement
diff --git a/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/Parameter.java b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/Parameter.java
new file mode 100644
index 0000000..6734da9
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/Parameter.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Parameter</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.sensinact.studio.resource.ResourcePackage#getParameter()
+ * @model
+ * @generated
+ */
+public interface Parameter extends TypedElement {
+} // Parameter
diff --git a/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/Property.java b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/Property.java
new file mode 100644
index 0000000..265b928
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/Property.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Property</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.sensinact.studio.resource.ResourcePackage#getProperty()
+ * @model
+ * @generated
+ */
+public interface Property extends Resource {
+} // Property
diff --git a/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/Resource.java b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/Resource.java
new file mode 100644
index 0000000..4e625bc
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/Resource.java
@@ -0,0 +1,102 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Resource</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.resource.Resource#getFriendlyName <em>Friendly Name</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.resource.Resource#getAttribute <em>Attribute</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.resource.Resource#getAccessMethod <em>Access Method</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.sensinact.studio.resource.ResourcePackage#getResource()
+ * @model
+ * @generated
+ */
+public interface Resource extends NamedElement {
+ /**
+ * Returns the value of the '<em><b>Friendly Name</b></em>' attribute.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Friendly 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>Friendly Name</em>' attribute.
+ * @see #setFriendlyName(String)
+ * @see org.eclipse.sensinact.studio.resource.ResourcePackage#getResource_FriendlyName()
+ * @model
+ * @generated
+ */
+ String getFriendlyName();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.resource.Resource#getFriendlyName <em>Friendly Name</em>}' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Friendly Name</em>' attribute.
+ * @see #getFriendlyName()
+ * @generated
+ */
+ void setFriendlyName(String value);
+
+ /**
+ * Returns the value of the '<em><b>Attribute</b></em>' containment reference list.
+ * The list contents are of type {@link org.eclipse.sensinact.studio.resource.Attribute}.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Attribute</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>Attribute</em>' containment reference list.
+ * @see org.eclipse.sensinact.studio.resource.ResourcePackage#getResource_Attribute()
+ * @model containment="true"
+ * @generated
+ */
+ EList<Attribute> getAttribute();
+
+ /**
+ * Returns the value of the '<em><b>Access Method</b></em>' containment reference list.
+ * The list contents are of type {@link org.eclipse.sensinact.studio.resource.AccessMethod}.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Access Method</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>Access Method</em>' containment reference list.
+ * @see org.eclipse.sensinact.studio.resource.ResourcePackage#getResource_AccessMethod()
+ * @model containment="true"
+ * @generated
+ */
+ EList<AccessMethod> getAccessMethod();
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @model annotation="http://www.eclipse.org/emf/2002/GenModel body='EList<AccessMethod> accessMethodByType = new EObjectContainmentEList<AccessMethod>(AccessMethod.class, this, ResourcePackage.RESOURCE__ACCESS_METHOD);\n\t\tfor (AccessMethod accessMethod : getAccessMethod()) {\n\t\t\tif (accessMethod.getType().equals(type))\n\t\t\t\taccessMethodByType.add(accessMethod);\n\t\t}\n\t\treturn accessMethodByType;'"
+ * @generated
+ */
+ EList<AccessMethod> getAccessMethod(AccessMethodType type);
+
+} // Resource
diff --git a/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/ResourceFactory.java b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/ResourceFactory.java
new file mode 100644
index 0000000..2324645
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/ResourceFactory.java
@@ -0,0 +1,178 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource;
+
+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 org.eclipse.sensinact.studio.resource.ResourcePackage
+ * @generated
+ */
+public interface ResourceFactory extends EFactory {
+ /**
+ * The singleton instance of the factory.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ ResourceFactory eINSTANCE = org.eclipse.sensinact.studio.resource.impl.ResourceFactoryImpl.init();
+
+ /**
+ * Returns a new object of class '<em>Studio</em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return a new object of class '<em>Studio</em>'.
+ * @generated
+ */
+ Studio createStudio();
+
+ /**
+ * Returns a new object of class '<em>Device</em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return a new object of class '<em>Device</em>'.
+ * @generated
+ */
+ Device createDevice();
+
+ /**
+ * Returns a new object of class '<em>Named Element</em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return a new object of class '<em>Named Element</em>'.
+ * @generated
+ */
+ NamedElement createNamedElement();
+
+ /**
+ * Returns a new object of class '<em>Typed Element</em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return a new object of class '<em>Typed Element</em>'.
+ * @generated
+ */
+ TypedElement createTypedElement();
+
+ /**
+ * Returns a new object of class '<em>Service</em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return a new object of class '<em>Service</em>'.
+ * @generated
+ */
+ Service createService();
+
+ /**
+ * Returns a new object of class '<em>Resource</em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return a new object of class '<em>Resource</em>'.
+ * @generated
+ */
+ Resource createResource();
+
+ /**
+ * Returns a new object of class '<em>Property</em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return a new object of class '<em>Property</em>'.
+ * @generated
+ */
+ Property createProperty();
+
+ /**
+ * Returns a new object of class '<em>Sensor Data</em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return a new object of class '<em>Sensor Data</em>'.
+ * @generated
+ */
+ SensorData createSensorData();
+
+ /**
+ * Returns a new object of class '<em>State Variable</em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return a new object of class '<em>State Variable</em>'.
+ * @generated
+ */
+ StateVariable createStateVariable();
+
+ /**
+ * Returns a new object of class '<em>Action</em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return a new object of class '<em>Action</em>'.
+ * @generated
+ */
+ Action createAction();
+
+ /**
+ * Returns a new object of class '<em>Attribute</em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return a new object of class '<em>Attribute</em>'.
+ * @generated
+ */
+ Attribute createAttribute();
+
+ /**
+ * Returns a new object of class '<em>Metadata</em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return a new object of class '<em>Metadata</em>'.
+ * @generated
+ */
+ Metadata createMetadata();
+
+ /**
+ * Returns a new object of class '<em>Access Method</em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return a new object of class '<em>Access Method</em>'.
+ * @generated
+ */
+ AccessMethod createAccessMethod();
+
+ /**
+ * Returns a new object of class '<em>Parameter</em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return a new object of class '<em>Parameter</em>'.
+ * @generated
+ */
+ Parameter createParameter();
+
+ /**
+ * Returns a new object of class '<em>Gateway</em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return a new object of class '<em>Gateway</em>'.
+ * @generated
+ */
+ Gateway createGateway();
+
+ /**
+ * Returns the package supported by this factory.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the package supported by this factory.
+ * @generated
+ */
+ ResourcePackage getResourcePackage();
+
+} //ResourceFactory
diff --git a/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/ResourcePackage.java b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/ResourcePackage.java
new file mode 100644
index 0000000..579f36c
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/ResourcePackage.java
@@ -0,0 +1,1656 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource;
+
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EEnum;
+import org.eclipse.emf.ecore.EOperation;
+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 org.eclipse.sensinact.studio.resource.ResourceFactory
+ * @model kind="package"
+ * @generated
+ */
+public interface ResourcePackage extends EPackage {
+ /**
+ * The package name.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ String eNAME = "resource";
+
+ /**
+ * The package namespace URI.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ String eNS_URI = "http://SENSINACT_RESOURCE/0.1";
+
+ /**
+ * The package namespace name.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ String eNS_PREFIX = "resource";
+
+ /**
+ * The singleton instance of the package.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ ResourcePackage eINSTANCE = org.eclipse.sensinact.studio.resource.impl.ResourcePackageImpl.init();
+
+ /**
+ * The meta object id for the '{@link org.eclipse.sensinact.studio.resource.impl.StudioImpl <em>Studio</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.resource.impl.StudioImpl
+ * @see org.eclipse.sensinact.studio.resource.impl.ResourcePackageImpl#getStudio()
+ * @generated
+ */
+ int STUDIO = 0;
+
+ /**
+ * The feature id for the '<em><b>Gateways</b></em>' containment reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int STUDIO__GATEWAYS = 0;
+
+ /**
+ * The number of structural features of the '<em>Studio</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int STUDIO_FEATURE_COUNT = 1;
+
+ /**
+ * The number of operations of the '<em>Studio</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int STUDIO_OPERATION_COUNT = 0;
+
+ /**
+ * The meta object id for the '{@link org.eclipse.sensinact.studio.resource.impl.NamedElementImpl <em>Named Element</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.resource.impl.NamedElementImpl
+ * @see org.eclipse.sensinact.studio.resource.impl.ResourcePackageImpl#getNamedElement()
+ * @generated
+ */
+ int NAMED_ELEMENT = 2;
+
+ /**
+ * The feature id for the '<em><b>Name</b></em>' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int NAMED_ELEMENT__NAME = 0;
+
+ /**
+ * The number of structural features of the '<em>Named Element</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int NAMED_ELEMENT_FEATURE_COUNT = 1;
+
+ /**
+ * The number of operations of the '<em>Named Element</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int NAMED_ELEMENT_OPERATION_COUNT = 0;
+
+ /**
+ * The meta object id for the '{@link org.eclipse.sensinact.studio.resource.impl.DeviceImpl <em>Device</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.resource.impl.DeviceImpl
+ * @see org.eclipse.sensinact.studio.resource.impl.ResourcePackageImpl#getDevice()
+ * @generated
+ */
+ int DEVICE = 1;
+
+ /**
+ * The feature id for the '<em><b>Name</b></em>' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DEVICE__NAME = NAMED_ELEMENT__NAME;
+
+ /**
+ * The feature id for the '<em><b>Friendly Name</b></em>' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DEVICE__FRIENDLY_NAME = NAMED_ELEMENT_FEATURE_COUNT + 0;
+
+ /**
+ * The feature id for the '<em><b>Service</b></em>' containment reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DEVICE__SERVICE = NAMED_ELEMENT_FEATURE_COUNT + 1;
+
+ /**
+ * The number of structural features of the '<em>Device</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DEVICE_FEATURE_COUNT = NAMED_ELEMENT_FEATURE_COUNT + 2;
+
+ /**
+ * The number of operations of the '<em>Device</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DEVICE_OPERATION_COUNT = NAMED_ELEMENT_OPERATION_COUNT + 0;
+
+ /**
+ * The meta object id for the '{@link org.eclipse.sensinact.studio.resource.impl.TypedElementImpl <em>Typed Element</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.resource.impl.TypedElementImpl
+ * @see org.eclipse.sensinact.studio.resource.impl.ResourcePackageImpl#getTypedElement()
+ * @generated
+ */
+ int TYPED_ELEMENT = 3;
+
+ /**
+ * The feature id for the '<em><b>Name</b></em>' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int TYPED_ELEMENT__NAME = NAMED_ELEMENT__NAME;
+
+ /**
+ * The feature id for the '<em><b>Type</b></em>' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int TYPED_ELEMENT__TYPE = NAMED_ELEMENT_FEATURE_COUNT + 0;
+
+ /**
+ * The feature id for the '<em><b>Value</b></em>' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int TYPED_ELEMENT__VALUE = NAMED_ELEMENT_FEATURE_COUNT + 1;
+
+ /**
+ * The number of structural features of the '<em>Typed Element</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int TYPED_ELEMENT_FEATURE_COUNT = NAMED_ELEMENT_FEATURE_COUNT + 2;
+
+ /**
+ * The number of operations of the '<em>Typed Element</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int TYPED_ELEMENT_OPERATION_COUNT = NAMED_ELEMENT_OPERATION_COUNT + 0;
+
+ /**
+ * The meta object id for the '{@link org.eclipse.sensinact.studio.resource.impl.ServiceImpl <em>Service</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.resource.impl.ServiceImpl
+ * @see org.eclipse.sensinact.studio.resource.impl.ResourcePackageImpl#getService()
+ * @generated
+ */
+ int SERVICE = 4;
+
+ /**
+ * The feature id for the '<em><b>Name</b></em>' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int SERVICE__NAME = NAMED_ELEMENT__NAME;
+
+ /**
+ * The feature id for the '<em><b>Friendly Name</b></em>' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int SERVICE__FRIENDLY_NAME = NAMED_ELEMENT_FEATURE_COUNT + 0;
+
+ /**
+ * The feature id for the '<em><b>Resource</b></em>' containment reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int SERVICE__RESOURCE = NAMED_ELEMENT_FEATURE_COUNT + 1;
+
+ /**
+ * The number of structural features of the '<em>Service</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int SERVICE_FEATURE_COUNT = NAMED_ELEMENT_FEATURE_COUNT + 2;
+
+ /**
+ * The number of operations of the '<em>Service</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int SERVICE_OPERATION_COUNT = NAMED_ELEMENT_OPERATION_COUNT + 0;
+
+ /**
+ * The meta object id for the '{@link org.eclipse.sensinact.studio.resource.impl.ResourceImpl <em>Resource</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.resource.impl.ResourceImpl
+ * @see org.eclipse.sensinact.studio.resource.impl.ResourcePackageImpl#getResource()
+ * @generated
+ */
+ int RESOURCE = 5;
+
+ /**
+ * The feature id for the '<em><b>Name</b></em>' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int RESOURCE__NAME = NAMED_ELEMENT__NAME;
+
+ /**
+ * The feature id for the '<em><b>Friendly Name</b></em>' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int RESOURCE__FRIENDLY_NAME = NAMED_ELEMENT_FEATURE_COUNT + 0;
+
+ /**
+ * The feature id for the '<em><b>Attribute</b></em>' containment reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int RESOURCE__ATTRIBUTE = NAMED_ELEMENT_FEATURE_COUNT + 1;
+
+ /**
+ * The feature id for the '<em><b>Access Method</b></em>' containment reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int RESOURCE__ACCESS_METHOD = NAMED_ELEMENT_FEATURE_COUNT + 2;
+
+ /**
+ * The number of structural features of the '<em>Resource</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int RESOURCE_FEATURE_COUNT = NAMED_ELEMENT_FEATURE_COUNT + 3;
+
+ /**
+ * The operation id for the '<em>Get Access Method</em>' operation.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int RESOURCE___GET_ACCESS_METHOD__ACCESSMETHODTYPE = NAMED_ELEMENT_OPERATION_COUNT + 0;
+
+ /**
+ * The number of operations of the '<em>Resource</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int RESOURCE_OPERATION_COUNT = NAMED_ELEMENT_OPERATION_COUNT + 1;
+
+ /**
+ * The meta object id for the '{@link org.eclipse.sensinact.studio.resource.impl.PropertyImpl <em>Property</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.resource.impl.PropertyImpl
+ * @see org.eclipse.sensinact.studio.resource.impl.ResourcePackageImpl#getProperty()
+ * @generated
+ */
+ int PROPERTY = 6;
+
+ /**
+ * The feature id for the '<em><b>Name</b></em>' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int PROPERTY__NAME = RESOURCE__NAME;
+
+ /**
+ * The feature id for the '<em><b>Friendly Name</b></em>' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int PROPERTY__FRIENDLY_NAME = RESOURCE__FRIENDLY_NAME;
+
+ /**
+ * The feature id for the '<em><b>Attribute</b></em>' containment reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int PROPERTY__ATTRIBUTE = RESOURCE__ATTRIBUTE;
+
+ /**
+ * The feature id for the '<em><b>Access Method</b></em>' containment reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int PROPERTY__ACCESS_METHOD = RESOURCE__ACCESS_METHOD;
+
+ /**
+ * The number of structural features of the '<em>Property</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int PROPERTY_FEATURE_COUNT = RESOURCE_FEATURE_COUNT + 0;
+
+ /**
+ * The operation id for the '<em>Get Access Method</em>' operation.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int PROPERTY___GET_ACCESS_METHOD__ACCESSMETHODTYPE = RESOURCE___GET_ACCESS_METHOD__ACCESSMETHODTYPE;
+
+ /**
+ * The number of operations of the '<em>Property</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int PROPERTY_OPERATION_COUNT = RESOURCE_OPERATION_COUNT + 0;
+
+ /**
+ * The meta object id for the '{@link org.eclipse.sensinact.studio.resource.impl.SensorDataImpl <em>Sensor Data</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.resource.impl.SensorDataImpl
+ * @see org.eclipse.sensinact.studio.resource.impl.ResourcePackageImpl#getSensorData()
+ * @generated
+ */
+ int SENSOR_DATA = 7;
+
+ /**
+ * The feature id for the '<em><b>Name</b></em>' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int SENSOR_DATA__NAME = RESOURCE__NAME;
+
+ /**
+ * The feature id for the '<em><b>Friendly Name</b></em>' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int SENSOR_DATA__FRIENDLY_NAME = RESOURCE__FRIENDLY_NAME;
+
+ /**
+ * The feature id for the '<em><b>Attribute</b></em>' containment reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int SENSOR_DATA__ATTRIBUTE = RESOURCE__ATTRIBUTE;
+
+ /**
+ * The feature id for the '<em><b>Access Method</b></em>' containment reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int SENSOR_DATA__ACCESS_METHOD = RESOURCE__ACCESS_METHOD;
+
+ /**
+ * The number of structural features of the '<em>Sensor Data</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int SENSOR_DATA_FEATURE_COUNT = RESOURCE_FEATURE_COUNT + 0;
+
+ /**
+ * The operation id for the '<em>Get Access Method</em>' operation.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int SENSOR_DATA___GET_ACCESS_METHOD__ACCESSMETHODTYPE = RESOURCE___GET_ACCESS_METHOD__ACCESSMETHODTYPE;
+
+ /**
+ * The number of operations of the '<em>Sensor Data</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int SENSOR_DATA_OPERATION_COUNT = RESOURCE_OPERATION_COUNT + 0;
+
+ /**
+ * The meta object id for the '{@link org.eclipse.sensinact.studio.resource.impl.StateVariableImpl <em>State Variable</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.resource.impl.StateVariableImpl
+ * @see org.eclipse.sensinact.studio.resource.impl.ResourcePackageImpl#getStateVariable()
+ * @generated
+ */
+ int STATE_VARIABLE = 8;
+
+ /**
+ * The feature id for the '<em><b>Name</b></em>' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int STATE_VARIABLE__NAME = RESOURCE__NAME;
+
+ /**
+ * The feature id for the '<em><b>Friendly Name</b></em>' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int STATE_VARIABLE__FRIENDLY_NAME = RESOURCE__FRIENDLY_NAME;
+
+ /**
+ * The feature id for the '<em><b>Attribute</b></em>' containment reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int STATE_VARIABLE__ATTRIBUTE = RESOURCE__ATTRIBUTE;
+
+ /**
+ * The feature id for the '<em><b>Access Method</b></em>' containment reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int STATE_VARIABLE__ACCESS_METHOD = RESOURCE__ACCESS_METHOD;
+
+ /**
+ * The feature id for the '<em><b>Modifier</b></em>' reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int STATE_VARIABLE__MODIFIER = RESOURCE_FEATURE_COUNT + 0;
+
+ /**
+ * The number of structural features of the '<em>State Variable</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int STATE_VARIABLE_FEATURE_COUNT = RESOURCE_FEATURE_COUNT + 1;
+
+ /**
+ * The operation id for the '<em>Get Access Method</em>' operation.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int STATE_VARIABLE___GET_ACCESS_METHOD__ACCESSMETHODTYPE = RESOURCE___GET_ACCESS_METHOD__ACCESSMETHODTYPE;
+
+ /**
+ * The number of operations of the '<em>State Variable</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int STATE_VARIABLE_OPERATION_COUNT = RESOURCE_OPERATION_COUNT + 0;
+
+ /**
+ * The meta object id for the '{@link org.eclipse.sensinact.studio.resource.impl.ActionImpl <em>Action</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.resource.impl.ActionImpl
+ * @see org.eclipse.sensinact.studio.resource.impl.ResourcePackageImpl#getAction()
+ * @generated
+ */
+ int ACTION = 9;
+
+ /**
+ * The feature id for the '<em><b>Name</b></em>' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int ACTION__NAME = RESOURCE__NAME;
+
+ /**
+ * The feature id for the '<em><b>Friendly Name</b></em>' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int ACTION__FRIENDLY_NAME = RESOURCE__FRIENDLY_NAME;
+
+ /**
+ * The feature id for the '<em><b>Attribute</b></em>' containment reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int ACTION__ATTRIBUTE = RESOURCE__ATTRIBUTE;
+
+ /**
+ * The feature id for the '<em><b>Access Method</b></em>' containment reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int ACTION__ACCESS_METHOD = RESOURCE__ACCESS_METHOD;
+
+ /**
+ * The feature id for the '<em><b>State</b></em>' reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int ACTION__STATE = RESOURCE_FEATURE_COUNT + 0;
+
+ /**
+ * The number of structural features of the '<em>Action</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int ACTION_FEATURE_COUNT = RESOURCE_FEATURE_COUNT + 1;
+
+ /**
+ * The operation id for the '<em>Get Access Method</em>' operation.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int ACTION___GET_ACCESS_METHOD__ACCESSMETHODTYPE = RESOURCE___GET_ACCESS_METHOD__ACCESSMETHODTYPE;
+
+ /**
+ * The number of operations of the '<em>Action</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int ACTION_OPERATION_COUNT = RESOURCE_OPERATION_COUNT + 0;
+
+ /**
+ * The meta object id for the '{@link org.eclipse.sensinact.studio.resource.impl.AttributeImpl <em>Attribute</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.resource.impl.AttributeImpl
+ * @see org.eclipse.sensinact.studio.resource.impl.ResourcePackageImpl#getAttribute()
+ * @generated
+ */
+ int ATTRIBUTE = 10;
+
+ /**
+ * The feature id for the '<em><b>Name</b></em>' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int ATTRIBUTE__NAME = TYPED_ELEMENT__NAME;
+
+ /**
+ * The feature id for the '<em><b>Type</b></em>' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int ATTRIBUTE__TYPE = TYPED_ELEMENT__TYPE;
+
+ /**
+ * The feature id for the '<em><b>Value</b></em>' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int ATTRIBUTE__VALUE = TYPED_ELEMENT__VALUE;
+
+ /**
+ * The feature id for the '<em><b>Metadata</b></em>' containment reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int ATTRIBUTE__METADATA = TYPED_ELEMENT_FEATURE_COUNT + 0;
+
+ /**
+ * The number of structural features of the '<em>Attribute</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int ATTRIBUTE_FEATURE_COUNT = TYPED_ELEMENT_FEATURE_COUNT + 1;
+
+ /**
+ * The number of operations of the '<em>Attribute</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int ATTRIBUTE_OPERATION_COUNT = TYPED_ELEMENT_OPERATION_COUNT + 0;
+
+ /**
+ * The meta object id for the '{@link org.eclipse.sensinact.studio.resource.impl.MetadataImpl <em>Metadata</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.resource.impl.MetadataImpl
+ * @see org.eclipse.sensinact.studio.resource.impl.ResourcePackageImpl#getMetadata()
+ * @generated
+ */
+ int METADATA = 11;
+
+ /**
+ * The feature id for the '<em><b>Name</b></em>' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int METADATA__NAME = TYPED_ELEMENT__NAME;
+
+ /**
+ * The feature id for the '<em><b>Type</b></em>' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int METADATA__TYPE = TYPED_ELEMENT__TYPE;
+
+ /**
+ * The feature id for the '<em><b>Value</b></em>' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int METADATA__VALUE = TYPED_ELEMENT__VALUE;
+
+ /**
+ * The number of structural features of the '<em>Metadata</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int METADATA_FEATURE_COUNT = TYPED_ELEMENT_FEATURE_COUNT + 0;
+
+ /**
+ * The number of operations of the '<em>Metadata</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int METADATA_OPERATION_COUNT = TYPED_ELEMENT_OPERATION_COUNT + 0;
+
+ /**
+ * The meta object id for the '{@link org.eclipse.sensinact.studio.resource.impl.AccessMethodImpl <em>Access Method</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.resource.impl.AccessMethodImpl
+ * @see org.eclipse.sensinact.studio.resource.impl.ResourcePackageImpl#getAccessMethod()
+ * @generated
+ */
+ int ACCESS_METHOD = 12;
+
+ /**
+ * The feature id for the '<em><b>Parameter</b></em>' containment reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int ACCESS_METHOD__PARAMETER = 0;
+
+ /**
+ * The feature id for the '<em><b>Type</b></em>' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int ACCESS_METHOD__TYPE = 1;
+
+ /**
+ * The number of structural features of the '<em>Access Method</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int ACCESS_METHOD_FEATURE_COUNT = 2;
+
+ /**
+ * The number of operations of the '<em>Access Method</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int ACCESS_METHOD_OPERATION_COUNT = 0;
+
+ /**
+ * The meta object id for the '{@link org.eclipse.sensinact.studio.resource.impl.ParameterImpl <em>Parameter</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.resource.impl.ParameterImpl
+ * @see org.eclipse.sensinact.studio.resource.impl.ResourcePackageImpl#getParameter()
+ * @generated
+ */
+ int PARAMETER = 13;
+
+ /**
+ * The feature id for the '<em><b>Name</b></em>' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int PARAMETER__NAME = TYPED_ELEMENT__NAME;
+
+ /**
+ * The feature id for the '<em><b>Type</b></em>' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int PARAMETER__TYPE = TYPED_ELEMENT__TYPE;
+
+ /**
+ * The feature id for the '<em><b>Value</b></em>' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int PARAMETER__VALUE = TYPED_ELEMENT__VALUE;
+
+ /**
+ * The number of structural features of the '<em>Parameter</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int PARAMETER_FEATURE_COUNT = TYPED_ELEMENT_FEATURE_COUNT + 0;
+
+ /**
+ * The number of operations of the '<em>Parameter</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int PARAMETER_OPERATION_COUNT = TYPED_ELEMENT_OPERATION_COUNT + 0;
+
+ /**
+ * The meta object id for the '{@link org.eclipse.sensinact.studio.resource.impl.GatewayImpl <em>Gateway</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.resource.impl.GatewayImpl
+ * @see org.eclipse.sensinact.studio.resource.impl.ResourcePackageImpl#getGateway()
+ * @generated
+ */
+ int GATEWAY = 14;
+
+ /**
+ * The feature id for the '<em><b>Name</b></em>' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int GATEWAY__NAME = NAMED_ELEMENT__NAME;
+
+ /**
+ * The feature id for the '<em><b>Device</b></em>' containment reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int GATEWAY__DEVICE = NAMED_ELEMENT_FEATURE_COUNT + 0;
+
+ /**
+ * The number of structural features of the '<em>Gateway</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int GATEWAY_FEATURE_COUNT = NAMED_ELEMENT_FEATURE_COUNT + 1;
+
+ /**
+ * The number of operations of the '<em>Gateway</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int GATEWAY_OPERATION_COUNT = NAMED_ELEMENT_OPERATION_COUNT + 0;
+
+ /**
+ * The meta object id for the '{@link org.eclipse.sensinact.studio.resource.AccessMethodType <em>Access Method Type</em>}' enum.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.resource.AccessMethodType
+ * @see org.eclipse.sensinact.studio.resource.impl.ResourcePackageImpl#getAccessMethodType()
+ * @generated
+ */
+ int ACCESS_METHOD_TYPE = 15;
+
+
+ /**
+ * Returns the meta object for class '{@link org.eclipse.sensinact.studio.resource.Studio <em>Studio</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for class '<em>Studio</em>'.
+ * @see org.eclipse.sensinact.studio.resource.Studio
+ * @generated
+ */
+ EClass getStudio();
+
+ /**
+ * Returns the meta object for the containment reference list '{@link org.eclipse.sensinact.studio.resource.Studio#getGateways <em>Gateways</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference list '<em>Gateways</em>'.
+ * @see org.eclipse.sensinact.studio.resource.Studio#getGateways()
+ * @see #getStudio()
+ * @generated
+ */
+ EReference getStudio_Gateways();
+
+ /**
+ * Returns the meta object for class '{@link org.eclipse.sensinact.studio.resource.Device <em>Device</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for class '<em>Device</em>'.
+ * @see org.eclipse.sensinact.studio.resource.Device
+ * @generated
+ */
+ EClass getDevice();
+
+ /**
+ * Returns the meta object for the attribute '{@link org.eclipse.sensinact.studio.resource.Device#getFriendlyName <em>Friendly Name</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the attribute '<em>Friendly Name</em>'.
+ * @see org.eclipse.sensinact.studio.resource.Device#getFriendlyName()
+ * @see #getDevice()
+ * @generated
+ */
+ EAttribute getDevice_FriendlyName();
+
+ /**
+ * Returns the meta object for the containment reference list '{@link org.eclipse.sensinact.studio.resource.Device#getService <em>Service</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference list '<em>Service</em>'.
+ * @see org.eclipse.sensinact.studio.resource.Device#getService()
+ * @see #getDevice()
+ * @generated
+ */
+ EReference getDevice_Service();
+
+ /**
+ * Returns the meta object for class '{@link org.eclipse.sensinact.studio.resource.NamedElement <em>Named Element</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for class '<em>Named Element</em>'.
+ * @see org.eclipse.sensinact.studio.resource.NamedElement
+ * @generated
+ */
+ EClass getNamedElement();
+
+ /**
+ * Returns the meta object for the attribute '{@link org.eclipse.sensinact.studio.resource.NamedElement#getName <em>Name</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the attribute '<em>Name</em>'.
+ * @see org.eclipse.sensinact.studio.resource.NamedElement#getName()
+ * @see #getNamedElement()
+ * @generated
+ */
+ EAttribute getNamedElement_Name();
+
+ /**
+ * Returns the meta object for class '{@link org.eclipse.sensinact.studio.resource.TypedElement <em>Typed Element</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for class '<em>Typed Element</em>'.
+ * @see org.eclipse.sensinact.studio.resource.TypedElement
+ * @generated
+ */
+ EClass getTypedElement();
+
+ /**
+ * Returns the meta object for the attribute '{@link org.eclipse.sensinact.studio.resource.TypedElement#getType <em>Type</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the attribute '<em>Type</em>'.
+ * @see org.eclipse.sensinact.studio.resource.TypedElement#getType()
+ * @see #getTypedElement()
+ * @generated
+ */
+ EAttribute getTypedElement_Type();
+
+ /**
+ * Returns the meta object for the attribute '{@link org.eclipse.sensinact.studio.resource.TypedElement#getValue <em>Value</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the attribute '<em>Value</em>'.
+ * @see org.eclipse.sensinact.studio.resource.TypedElement#getValue()
+ * @see #getTypedElement()
+ * @generated
+ */
+ EAttribute getTypedElement_Value();
+
+ /**
+ * Returns the meta object for class '{@link org.eclipse.sensinact.studio.resource.Service <em>Service</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for class '<em>Service</em>'.
+ * @see org.eclipse.sensinact.studio.resource.Service
+ * @generated
+ */
+ EClass getService();
+
+ /**
+ * Returns the meta object for the attribute '{@link org.eclipse.sensinact.studio.resource.Service#getFriendlyName <em>Friendly Name</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the attribute '<em>Friendly Name</em>'.
+ * @see org.eclipse.sensinact.studio.resource.Service#getFriendlyName()
+ * @see #getService()
+ * @generated
+ */
+ EAttribute getService_FriendlyName();
+
+ /**
+ * Returns the meta object for the containment reference list '{@link org.eclipse.sensinact.studio.resource.Service#getResource <em>Resource</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference list '<em>Resource</em>'.
+ * @see org.eclipse.sensinact.studio.resource.Service#getResource()
+ * @see #getService()
+ * @generated
+ */
+ EReference getService_Resource();
+
+ /**
+ * Returns the meta object for class '{@link org.eclipse.sensinact.studio.resource.Resource <em>Resource</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for class '<em>Resource</em>'.
+ * @see org.eclipse.sensinact.studio.resource.Resource
+ * @generated
+ */
+ EClass getResource();
+
+ /**
+ * Returns the meta object for the attribute '{@link org.eclipse.sensinact.studio.resource.Resource#getFriendlyName <em>Friendly Name</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the attribute '<em>Friendly Name</em>'.
+ * @see org.eclipse.sensinact.studio.resource.Resource#getFriendlyName()
+ * @see #getResource()
+ * @generated
+ */
+ EAttribute getResource_FriendlyName();
+
+ /**
+ * Returns the meta object for the containment reference list '{@link org.eclipse.sensinact.studio.resource.Resource#getAttribute <em>Attribute</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference list '<em>Attribute</em>'.
+ * @see org.eclipse.sensinact.studio.resource.Resource#getAttribute()
+ * @see #getResource()
+ * @generated
+ */
+ EReference getResource_Attribute();
+
+ /**
+ * Returns the meta object for the containment reference list '{@link org.eclipse.sensinact.studio.resource.Resource#getAccessMethod <em>Access Method</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference list '<em>Access Method</em>'.
+ * @see org.eclipse.sensinact.studio.resource.Resource#getAccessMethod()
+ * @see #getResource()
+ * @generated
+ */
+ EReference getResource_AccessMethod();
+
+ /**
+ * Returns the meta object for the '{@link org.eclipse.sensinact.studio.resource.Resource#getAccessMethod(org.eclipse.sensinact.studio.resource.AccessMethodType) <em>Get Access Method</em>}' operation.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the '<em>Get Access Method</em>' operation.
+ * @see org.eclipse.sensinact.studio.resource.Resource#getAccessMethod(org.eclipse.sensinact.studio.resource.AccessMethodType)
+ * @generated
+ */
+ EOperation getResource__GetAccessMethod__AccessMethodType();
+
+ /**
+ * Returns the meta object for class '{@link org.eclipse.sensinact.studio.resource.Property <em>Property</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for class '<em>Property</em>'.
+ * @see org.eclipse.sensinact.studio.resource.Property
+ * @generated
+ */
+ EClass getProperty();
+
+ /**
+ * Returns the meta object for class '{@link org.eclipse.sensinact.studio.resource.SensorData <em>Sensor Data</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for class '<em>Sensor Data</em>'.
+ * @see org.eclipse.sensinact.studio.resource.SensorData
+ * @generated
+ */
+ EClass getSensorData();
+
+ /**
+ * Returns the meta object for class '{@link org.eclipse.sensinact.studio.resource.StateVariable <em>State Variable</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for class '<em>State Variable</em>'.
+ * @see org.eclipse.sensinact.studio.resource.StateVariable
+ * @generated
+ */
+ EClass getStateVariable();
+
+ /**
+ * Returns the meta object for the reference list '{@link org.eclipse.sensinact.studio.resource.StateVariable#getModifier <em>Modifier</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the reference list '<em>Modifier</em>'.
+ * @see org.eclipse.sensinact.studio.resource.StateVariable#getModifier()
+ * @see #getStateVariable()
+ * @generated
+ */
+ EReference getStateVariable_Modifier();
+
+ /**
+ * Returns the meta object for class '{@link org.eclipse.sensinact.studio.resource.Action <em>Action</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for class '<em>Action</em>'.
+ * @see org.eclipse.sensinact.studio.resource.Action
+ * @generated
+ */
+ EClass getAction();
+
+ /**
+ * Returns the meta object for the reference list '{@link org.eclipse.sensinact.studio.resource.Action#getState <em>State</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the reference list '<em>State</em>'.
+ * @see org.eclipse.sensinact.studio.resource.Action#getState()
+ * @see #getAction()
+ * @generated
+ */
+ EReference getAction_State();
+
+ /**
+ * Returns the meta object for class '{@link org.eclipse.sensinact.studio.resource.Attribute <em>Attribute</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for class '<em>Attribute</em>'.
+ * @see org.eclipse.sensinact.studio.resource.Attribute
+ * @generated
+ */
+ EClass getAttribute();
+
+ /**
+ * Returns the meta object for the containment reference list '{@link org.eclipse.sensinact.studio.resource.Attribute#getMetadata <em>Metadata</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference list '<em>Metadata</em>'.
+ * @see org.eclipse.sensinact.studio.resource.Attribute#getMetadata()
+ * @see #getAttribute()
+ * @generated
+ */
+ EReference getAttribute_Metadata();
+
+ /**
+ * Returns the meta object for class '{@link org.eclipse.sensinact.studio.resource.Metadata <em>Metadata</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for class '<em>Metadata</em>'.
+ * @see org.eclipse.sensinact.studio.resource.Metadata
+ * @generated
+ */
+ EClass getMetadata();
+
+ /**
+ * Returns the meta object for class '{@link org.eclipse.sensinact.studio.resource.AccessMethod <em>Access Method</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for class '<em>Access Method</em>'.
+ * @see org.eclipse.sensinact.studio.resource.AccessMethod
+ * @generated
+ */
+ EClass getAccessMethod();
+
+ /**
+ * Returns the meta object for the containment reference list '{@link org.eclipse.sensinact.studio.resource.AccessMethod#getParameter <em>Parameter</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference list '<em>Parameter</em>'.
+ * @see org.eclipse.sensinact.studio.resource.AccessMethod#getParameter()
+ * @see #getAccessMethod()
+ * @generated
+ */
+ EReference getAccessMethod_Parameter();
+
+ /**
+ * Returns the meta object for the attribute '{@link org.eclipse.sensinact.studio.resource.AccessMethod#getType <em>Type</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the attribute '<em>Type</em>'.
+ * @see org.eclipse.sensinact.studio.resource.AccessMethod#getType()
+ * @see #getAccessMethod()
+ * @generated
+ */
+ EAttribute getAccessMethod_Type();
+
+ /**
+ * Returns the meta object for class '{@link org.eclipse.sensinact.studio.resource.Parameter <em>Parameter</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for class '<em>Parameter</em>'.
+ * @see org.eclipse.sensinact.studio.resource.Parameter
+ * @generated
+ */
+ EClass getParameter();
+
+ /**
+ * Returns the meta object for class '{@link org.eclipse.sensinact.studio.resource.Gateway <em>Gateway</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for class '<em>Gateway</em>'.
+ * @see org.eclipse.sensinact.studio.resource.Gateway
+ * @generated
+ */
+ EClass getGateway();
+
+ /**
+ * Returns the meta object for the containment reference list '{@link org.eclipse.sensinact.studio.resource.Gateway#getDevice <em>Device</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference list '<em>Device</em>'.
+ * @see org.eclipse.sensinact.studio.resource.Gateway#getDevice()
+ * @see #getGateway()
+ * @generated
+ */
+ EReference getGateway_Device();
+
+ /**
+ * Returns the meta object for enum '{@link org.eclipse.sensinact.studio.resource.AccessMethodType <em>Access Method Type</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for enum '<em>Access Method Type</em>'.
+ * @see org.eclipse.sensinact.studio.resource.AccessMethodType
+ * @generated
+ */
+ EEnum getAccessMethodType();
+
+ /**
+ * 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
+ */
+ ResourceFactory getResourceFactory();
+
+ /**
+ * <!-- 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 org.eclipse.sensinact.studio.resource.impl.StudioImpl <em>Studio</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.resource.impl.StudioImpl
+ * @see org.eclipse.sensinact.studio.resource.impl.ResourcePackageImpl#getStudio()
+ * @generated
+ */
+ EClass STUDIO = eINSTANCE.getStudio();
+
+ /**
+ * The meta object literal for the '<em><b>Gateways</b></em>' containment reference list feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference STUDIO__GATEWAYS = eINSTANCE.getStudio_Gateways();
+
+ /**
+ * The meta object literal for the '{@link org.eclipse.sensinact.studio.resource.impl.DeviceImpl <em>Device</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.resource.impl.DeviceImpl
+ * @see org.eclipse.sensinact.studio.resource.impl.ResourcePackageImpl#getDevice()
+ * @generated
+ */
+ EClass DEVICE = eINSTANCE.getDevice();
+
+ /**
+ * The meta object literal for the '<em><b>Friendly Name</b></em>' attribute feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EAttribute DEVICE__FRIENDLY_NAME = eINSTANCE.getDevice_FriendlyName();
+
+ /**
+ * The meta object literal for the '<em><b>Service</b></em>' containment reference list feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference DEVICE__SERVICE = eINSTANCE.getDevice_Service();
+
+ /**
+ * The meta object literal for the '{@link org.eclipse.sensinact.studio.resource.impl.NamedElementImpl <em>Named Element</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.resource.impl.NamedElementImpl
+ * @see org.eclipse.sensinact.studio.resource.impl.ResourcePackageImpl#getNamedElement()
+ * @generated
+ */
+ EClass NAMED_ELEMENT = eINSTANCE.getNamedElement();
+
+ /**
+ * The meta object literal for the '<em><b>Name</b></em>' attribute feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EAttribute NAMED_ELEMENT__NAME = eINSTANCE.getNamedElement_Name();
+
+ /**
+ * The meta object literal for the '{@link org.eclipse.sensinact.studio.resource.impl.TypedElementImpl <em>Typed Element</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.resource.impl.TypedElementImpl
+ * @see org.eclipse.sensinact.studio.resource.impl.ResourcePackageImpl#getTypedElement()
+ * @generated
+ */
+ EClass TYPED_ELEMENT = eINSTANCE.getTypedElement();
+
+ /**
+ * The meta object literal for the '<em><b>Type</b></em>' attribute feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EAttribute TYPED_ELEMENT__TYPE = eINSTANCE.getTypedElement_Type();
+
+ /**
+ * The meta object literal for the '<em><b>Value</b></em>' attribute feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EAttribute TYPED_ELEMENT__VALUE = eINSTANCE.getTypedElement_Value();
+
+ /**
+ * The meta object literal for the '{@link org.eclipse.sensinact.studio.resource.impl.ServiceImpl <em>Service</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.resource.impl.ServiceImpl
+ * @see org.eclipse.sensinact.studio.resource.impl.ResourcePackageImpl#getService()
+ * @generated
+ */
+ EClass SERVICE = eINSTANCE.getService();
+
+ /**
+ * The meta object literal for the '<em><b>Friendly Name</b></em>' attribute feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EAttribute SERVICE__FRIENDLY_NAME = eINSTANCE.getService_FriendlyName();
+
+ /**
+ * The meta object literal for the '<em><b>Resource</b></em>' containment reference list feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference SERVICE__RESOURCE = eINSTANCE.getService_Resource();
+
+ /**
+ * The meta object literal for the '{@link org.eclipse.sensinact.studio.resource.impl.ResourceImpl <em>Resource</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.resource.impl.ResourceImpl
+ * @see org.eclipse.sensinact.studio.resource.impl.ResourcePackageImpl#getResource()
+ * @generated
+ */
+ EClass RESOURCE = eINSTANCE.getResource();
+
+ /**
+ * The meta object literal for the '<em><b>Friendly Name</b></em>' attribute feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EAttribute RESOURCE__FRIENDLY_NAME = eINSTANCE.getResource_FriendlyName();
+
+ /**
+ * The meta object literal for the '<em><b>Attribute</b></em>' containment reference list feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference RESOURCE__ATTRIBUTE = eINSTANCE.getResource_Attribute();
+
+ /**
+ * The meta object literal for the '<em><b>Access Method</b></em>' containment reference list feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference RESOURCE__ACCESS_METHOD = eINSTANCE.getResource_AccessMethod();
+
+ /**
+ * The meta object literal for the '<em><b>Get Access Method</b></em>' operation.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EOperation RESOURCE___GET_ACCESS_METHOD__ACCESSMETHODTYPE = eINSTANCE.getResource__GetAccessMethod__AccessMethodType();
+
+ /**
+ * The meta object literal for the '{@link org.eclipse.sensinact.studio.resource.impl.PropertyImpl <em>Property</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.resource.impl.PropertyImpl
+ * @see org.eclipse.sensinact.studio.resource.impl.ResourcePackageImpl#getProperty()
+ * @generated
+ */
+ EClass PROPERTY = eINSTANCE.getProperty();
+
+ /**
+ * The meta object literal for the '{@link org.eclipse.sensinact.studio.resource.impl.SensorDataImpl <em>Sensor Data</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.resource.impl.SensorDataImpl
+ * @see org.eclipse.sensinact.studio.resource.impl.ResourcePackageImpl#getSensorData()
+ * @generated
+ */
+ EClass SENSOR_DATA = eINSTANCE.getSensorData();
+
+ /**
+ * The meta object literal for the '{@link org.eclipse.sensinact.studio.resource.impl.StateVariableImpl <em>State Variable</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.resource.impl.StateVariableImpl
+ * @see org.eclipse.sensinact.studio.resource.impl.ResourcePackageImpl#getStateVariable()
+ * @generated
+ */
+ EClass STATE_VARIABLE = eINSTANCE.getStateVariable();
+
+ /**
+ * The meta object literal for the '<em><b>Modifier</b></em>' reference list feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference STATE_VARIABLE__MODIFIER = eINSTANCE.getStateVariable_Modifier();
+
+ /**
+ * The meta object literal for the '{@link org.eclipse.sensinact.studio.resource.impl.ActionImpl <em>Action</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.resource.impl.ActionImpl
+ * @see org.eclipse.sensinact.studio.resource.impl.ResourcePackageImpl#getAction()
+ * @generated
+ */
+ EClass ACTION = eINSTANCE.getAction();
+
+ /**
+ * The meta object literal for the '<em><b>State</b></em>' reference list feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference ACTION__STATE = eINSTANCE.getAction_State();
+
+ /**
+ * The meta object literal for the '{@link org.eclipse.sensinact.studio.resource.impl.AttributeImpl <em>Attribute</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.resource.impl.AttributeImpl
+ * @see org.eclipse.sensinact.studio.resource.impl.ResourcePackageImpl#getAttribute()
+ * @generated
+ */
+ EClass ATTRIBUTE = eINSTANCE.getAttribute();
+
+ /**
+ * The meta object literal for the '<em><b>Metadata</b></em>' containment reference list feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference ATTRIBUTE__METADATA = eINSTANCE.getAttribute_Metadata();
+
+ /**
+ * The meta object literal for the '{@link org.eclipse.sensinact.studio.resource.impl.MetadataImpl <em>Metadata</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.resource.impl.MetadataImpl
+ * @see org.eclipse.sensinact.studio.resource.impl.ResourcePackageImpl#getMetadata()
+ * @generated
+ */
+ EClass METADATA = eINSTANCE.getMetadata();
+
+ /**
+ * The meta object literal for the '{@link org.eclipse.sensinact.studio.resource.impl.AccessMethodImpl <em>Access Method</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.resource.impl.AccessMethodImpl
+ * @see org.eclipse.sensinact.studio.resource.impl.ResourcePackageImpl#getAccessMethod()
+ * @generated
+ */
+ EClass ACCESS_METHOD = eINSTANCE.getAccessMethod();
+
+ /**
+ * The meta object literal for the '<em><b>Parameter</b></em>' containment reference list feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference ACCESS_METHOD__PARAMETER = eINSTANCE.getAccessMethod_Parameter();
+
+ /**
+ * The meta object literal for the '<em><b>Type</b></em>' attribute feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EAttribute ACCESS_METHOD__TYPE = eINSTANCE.getAccessMethod_Type();
+
+ /**
+ * The meta object literal for the '{@link org.eclipse.sensinact.studio.resource.impl.ParameterImpl <em>Parameter</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.resource.impl.ParameterImpl
+ * @see org.eclipse.sensinact.studio.resource.impl.ResourcePackageImpl#getParameter()
+ * @generated
+ */
+ EClass PARAMETER = eINSTANCE.getParameter();
+
+ /**
+ * The meta object literal for the '{@link org.eclipse.sensinact.studio.resource.impl.GatewayImpl <em>Gateway</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.resource.impl.GatewayImpl
+ * @see org.eclipse.sensinact.studio.resource.impl.ResourcePackageImpl#getGateway()
+ * @generated
+ */
+ EClass GATEWAY = eINSTANCE.getGateway();
+
+ /**
+ * The meta object literal for the '<em><b>Device</b></em>' containment reference list feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference GATEWAY__DEVICE = eINSTANCE.getGateway_Device();
+
+ /**
+ * The meta object literal for the '{@link org.eclipse.sensinact.studio.resource.AccessMethodType <em>Access Method Type</em>}' enum.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.resource.AccessMethodType
+ * @see org.eclipse.sensinact.studio.resource.impl.ResourcePackageImpl#getAccessMethodType()
+ * @generated
+ */
+ EEnum ACCESS_METHOD_TYPE = eINSTANCE.getAccessMethodType();
+
+ }
+
+} //ResourcePackage
diff --git a/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/SensorData.java b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/SensorData.java
new file mode 100644
index 0000000..526afa3
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/SensorData.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Sensor Data</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.sensinact.studio.resource.ResourcePackage#getSensorData()
+ * @model
+ * @generated
+ */
+public interface SensorData extends Resource {
+} // SensorData
diff --git a/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/Service.java b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/Service.java
new file mode 100644
index 0000000..d713629
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/Service.java
@@ -0,0 +1,77 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Service</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.resource.Service#getFriendlyName <em>Friendly Name</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.resource.Service#getResource <em>Resource</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.sensinact.studio.resource.ResourcePackage#getService()
+ * @model
+ * @generated
+ */
+public interface Service extends NamedElement {
+ /**
+ * Returns the value of the '<em><b>Friendly Name</b></em>' attribute.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Friendly 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>Friendly Name</em>' attribute.
+ * @see #setFriendlyName(String)
+ * @see org.eclipse.sensinact.studio.resource.ResourcePackage#getService_FriendlyName()
+ * @model
+ * @generated
+ */
+ String getFriendlyName();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.resource.Service#getFriendlyName <em>Friendly Name</em>}' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Friendly Name</em>' attribute.
+ * @see #getFriendlyName()
+ * @generated
+ */
+ void setFriendlyName(String value);
+
+ /**
+ * Returns the value of the '<em><b>Resource</b></em>' containment reference list.
+ * The list contents are of type {@link org.eclipse.sensinact.studio.resource.Resource}.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Resource</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>Resource</em>' containment reference list.
+ * @see org.eclipse.sensinact.studio.resource.ResourcePackage#getService_Resource()
+ * @model containment="true"
+ * @generated
+ */
+ EList<Resource> getResource();
+
+} // Service
diff --git a/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/StateVariable.java b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/StateVariable.java
new file mode 100644
index 0000000..ad4ea22
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/StateVariable.java
@@ -0,0 +1,52 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>State Variable</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.resource.StateVariable#getModifier <em>Modifier</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.sensinact.studio.resource.ResourcePackage#getStateVariable()
+ * @model
+ * @generated
+ */
+public interface StateVariable extends Resource {
+ /**
+ * Returns the value of the '<em><b>Modifier</b></em>' reference list.
+ * The list contents are of type {@link org.eclipse.sensinact.studio.resource.Action}.
+ * It is bidirectional and its opposite is '{@link org.eclipse.sensinact.studio.resource.Action#getState <em>State</em>}'.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Modifier</em>' reference list isn't clear,
+ * there really should be more of a description here...
+ * </p>
+ * <!-- end-user-doc -->
+ * @return the value of the '<em>Modifier</em>' reference list.
+ * @see org.eclipse.sensinact.studio.resource.ResourcePackage#getStateVariable_Modifier()
+ * @see org.eclipse.sensinact.studio.resource.Action#getState
+ * @model opposite="state"
+ * @generated
+ */
+ EList<Action> getModifier();
+
+} // StateVariable
diff --git a/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/Studio.java b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/Studio.java
new file mode 100644
index 0000000..2956167
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/Studio.java
@@ -0,0 +1,52 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Studio</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.resource.Studio#getGateways <em>Gateways</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.sensinact.studio.resource.ResourcePackage#getStudio()
+ * @model
+ * @generated
+ */
+public interface Studio extends EObject {
+ /**
+ * Returns the value of the '<em><b>Gateways</b></em>' containment reference list.
+ * The list contents are of type {@link org.eclipse.sensinact.studio.resource.Gateway}.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Gateways</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>Gateways</em>' containment reference list.
+ * @see org.eclipse.sensinact.studio.resource.ResourcePackage#getStudio_Gateways()
+ * @model containment="true"
+ * @generated
+ */
+ EList<Gateway> getGateways();
+
+} // Studio
diff --git a/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/TypedElement.java b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/TypedElement.java
new file mode 100644
index 0000000..82e90f4
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/TypedElement.java
@@ -0,0 +1,86 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Typed Element</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.resource.TypedElement#getType <em>Type</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.resource.TypedElement#getValue <em>Value</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.sensinact.studio.resource.ResourcePackage#getTypedElement()
+ * @model
+ * @generated
+ */
+public interface TypedElement extends NamedElement {
+ /**
+ * Returns the value of the '<em><b>Type</b></em>' attribute.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Type</em>' attribute isn't clear,
+ * there really should be more of a description here...
+ * </p>
+ * <!-- end-user-doc -->
+ * @return the value of the '<em>Type</em>' attribute.
+ * @see #setType(String)
+ * @see org.eclipse.sensinact.studio.resource.ResourcePackage#getTypedElement_Type()
+ * @model
+ * @generated
+ */
+ String getType();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.resource.TypedElement#getType <em>Type</em>}' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Type</em>' attribute.
+ * @see #getType()
+ * @generated
+ */
+ void setType(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(String)
+ * @see org.eclipse.sensinact.studio.resource.ResourcePackage#getTypedElement_Value()
+ * @model
+ * @generated
+ */
+ String getValue();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.resource.TypedElement#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(String value);
+
+} // TypedElement
diff --git a/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/impl/AccessMethodImpl.java b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/impl/AccessMethodImpl.java
new file mode 100644
index 0000000..3584547
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/impl/AccessMethodImpl.java
@@ -0,0 +1,233 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource.impl;
+
+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;
+
+import org.eclipse.sensinact.studio.resource.AccessMethod;
+import org.eclipse.sensinact.studio.resource.AccessMethodType;
+import org.eclipse.sensinact.studio.resource.Parameter;
+import org.eclipse.sensinact.studio.resource.ResourcePackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Access Method</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.resource.impl.AccessMethodImpl#getParameter <em>Parameter</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.resource.impl.AccessMethodImpl#getType <em>Type</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class AccessMethodImpl extends MinimalEObjectImpl.Container implements AccessMethod {
+ /**
+ * The cached value of the '{@link #getParameter() <em>Parameter</em>}' containment reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getParameter()
+ * @generated
+ * @ordered
+ */
+ protected EList<Parameter> parameter;
+
+ /**
+ * The default value of the '{@link #getType() <em>Type</em>}' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getType()
+ * @generated
+ * @ordered
+ */
+ protected static final AccessMethodType TYPE_EDEFAULT = AccessMethodType.GET;
+
+ /**
+ * The cached value of the '{@link #getType() <em>Type</em>}' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getType()
+ * @generated
+ * @ordered
+ */
+ protected AccessMethodType type = TYPE_EDEFAULT;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected AccessMethodImpl() {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EClass eStaticClass() {
+ return ResourcePackage.Literals.ACCESS_METHOD;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EList<Parameter> getParameter() {
+ if (parameter == null) {
+ parameter = new EObjectContainmentEList<Parameter>(Parameter.class, this, ResourcePackage.ACCESS_METHOD__PARAMETER);
+ }
+ return parameter;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public AccessMethodType getType() {
+ return type;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setType(AccessMethodType newType) {
+ AccessMethodType oldType = type;
+ type = newType == null ? TYPE_EDEFAULT : newType;
+ if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, ResourcePackage.ACCESS_METHOD__TYPE, oldType, type));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+ switch (featureID) {
+ case ResourcePackage.ACCESS_METHOD__PARAMETER:
+ return ((InternalEList<?>)getParameter()).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 ResourcePackage.ACCESS_METHOD__PARAMETER:
+ return getParameter();
+ case ResourcePackage.ACCESS_METHOD__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 ResourcePackage.ACCESS_METHOD__PARAMETER:
+ getParameter().clear();
+ getParameter().addAll((Collection<? extends Parameter>)newValue);
+ return;
+ case ResourcePackage.ACCESS_METHOD__TYPE:
+ setType((AccessMethodType)newValue);
+ return;
+ }
+ super.eSet(featureID, newValue);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eUnset(int featureID) {
+ switch (featureID) {
+ case ResourcePackage.ACCESS_METHOD__PARAMETER:
+ getParameter().clear();
+ return;
+ case ResourcePackage.ACCESS_METHOD__TYPE:
+ setType(TYPE_EDEFAULT);
+ return;
+ }
+ super.eUnset(featureID);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public boolean eIsSet(int featureID) {
+ switch (featureID) {
+ case ResourcePackage.ACCESS_METHOD__PARAMETER:
+ return parameter != null && !parameter.isEmpty();
+ case ResourcePackage.ACCESS_METHOD__TYPE:
+ return type != TYPE_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(" (type: ");
+ result.append(type);
+ result.append(')');
+ return result.toString();
+ }
+
+} //AccessMethodImpl
diff --git a/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/impl/ActionImpl.java b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/impl/ActionImpl.java
new file mode 100644
index 0000000..ae3e6f4
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/impl/ActionImpl.java
@@ -0,0 +1,175 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource.impl;
+
+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.util.EObjectWithInverseResolvingEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+import org.eclipse.sensinact.studio.resource.Action;
+import org.eclipse.sensinact.studio.resource.ResourcePackage;
+import org.eclipse.sensinact.studio.resource.StateVariable;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Action</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.resource.impl.ActionImpl#getState <em>State</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class ActionImpl extends ResourceImpl implements Action {
+ /**
+ * The cached value of the '{@link #getState() <em>State</em>}' reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getState()
+ * @generated
+ * @ordered
+ */
+ protected EList<StateVariable> state;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected ActionImpl() {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EClass eStaticClass() {
+ return ResourcePackage.Literals.ACTION;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EList<StateVariable> getState() {
+ if (state == null) {
+ state = new EObjectWithInverseResolvingEList.ManyInverse<StateVariable>(StateVariable.class, this, ResourcePackage.ACTION__STATE, ResourcePackage.STATE_VARIABLE__MODIFIER);
+ }
+ return state;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @SuppressWarnings("unchecked")
+ @Override
+ public NotificationChain eInverseAdd(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+ switch (featureID) {
+ case ResourcePackage.ACTION__STATE:
+ return ((InternalEList<InternalEObject>)(InternalEList<?>)getState()).basicAdd(otherEnd, msgs);
+ }
+ return super.eInverseAdd(otherEnd, featureID, msgs);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+ switch (featureID) {
+ case ResourcePackage.ACTION__STATE:
+ return ((InternalEList<?>)getState()).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 ResourcePackage.ACTION__STATE:
+ return getState();
+ }
+ 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 ResourcePackage.ACTION__STATE:
+ getState().clear();
+ getState().addAll((Collection<? extends StateVariable>)newValue);
+ return;
+ }
+ super.eSet(featureID, newValue);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eUnset(int featureID) {
+ switch (featureID) {
+ case ResourcePackage.ACTION__STATE:
+ getState().clear();
+ return;
+ }
+ super.eUnset(featureID);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public boolean eIsSet(int featureID) {
+ switch (featureID) {
+ case ResourcePackage.ACTION__STATE:
+ return state != null && !state.isEmpty();
+ }
+ return super.eIsSet(featureID);
+ }
+
+} //ActionImpl
diff --git a/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/impl/AttributeImpl.java b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/impl/AttributeImpl.java
new file mode 100644
index 0000000..3caa9ba
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/impl/AttributeImpl.java
@@ -0,0 +1,160 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource.impl;
+
+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.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+import org.eclipse.sensinact.studio.resource.Attribute;
+import org.eclipse.sensinact.studio.resource.Metadata;
+import org.eclipse.sensinact.studio.resource.ResourcePackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Attribute</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.resource.impl.AttributeImpl#getMetadata <em>Metadata</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class AttributeImpl extends TypedElementImpl implements Attribute {
+ /**
+ * The cached value of the '{@link #getMetadata() <em>Metadata</em>}' containment reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getMetadata()
+ * @generated
+ * @ordered
+ */
+ protected EList<Metadata> metadata;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected AttributeImpl() {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EClass eStaticClass() {
+ return ResourcePackage.Literals.ATTRIBUTE;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EList<Metadata> getMetadata() {
+ if (metadata == null) {
+ metadata = new EObjectContainmentEList<Metadata>(Metadata.class, this, ResourcePackage.ATTRIBUTE__METADATA);
+ }
+ return metadata;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+ switch (featureID) {
+ case ResourcePackage.ATTRIBUTE__METADATA:
+ return ((InternalEList<?>)getMetadata()).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 ResourcePackage.ATTRIBUTE__METADATA:
+ return getMetadata();
+ }
+ 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 ResourcePackage.ATTRIBUTE__METADATA:
+ getMetadata().clear();
+ getMetadata().addAll((Collection<? extends Metadata>)newValue);
+ return;
+ }
+ super.eSet(featureID, newValue);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eUnset(int featureID) {
+ switch (featureID) {
+ case ResourcePackage.ATTRIBUTE__METADATA:
+ getMetadata().clear();
+ return;
+ }
+ super.eUnset(featureID);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public boolean eIsSet(int featureID) {
+ switch (featureID) {
+ case ResourcePackage.ATTRIBUTE__METADATA:
+ return metadata != null && !metadata.isEmpty();
+ }
+ return super.eIsSet(featureID);
+ }
+
+} //AttributeImpl
diff --git a/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/impl/DeviceImpl.java b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/impl/DeviceImpl.java
new file mode 100644
index 0000000..dd0e81e
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/impl/DeviceImpl.java
@@ -0,0 +1,231 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource.impl;
+
+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.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+import org.eclipse.sensinact.studio.resource.Device;
+import org.eclipse.sensinact.studio.resource.ResourcePackage;
+import org.eclipse.sensinact.studio.resource.Service;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Device</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.resource.impl.DeviceImpl#getFriendlyName <em>Friendly Name</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.resource.impl.DeviceImpl#getService <em>Service</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class DeviceImpl extends NamedElementImpl implements Device {
+ /**
+ * The default value of the '{@link #getFriendlyName() <em>Friendly Name</em>}' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getFriendlyName()
+ * @generated
+ * @ordered
+ */
+ protected static final String FRIENDLY_NAME_EDEFAULT = null;
+
+ /**
+ * The cached value of the '{@link #getFriendlyName() <em>Friendly Name</em>}' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getFriendlyName()
+ * @generated
+ * @ordered
+ */
+ protected String friendlyName = FRIENDLY_NAME_EDEFAULT;
+
+ /**
+ * The cached value of the '{@link #getService() <em>Service</em>}' containment reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getService()
+ * @generated
+ * @ordered
+ */
+ protected EList<Service> service;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected DeviceImpl() {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EClass eStaticClass() {
+ return ResourcePackage.Literals.DEVICE;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public String getFriendlyName() {
+ return friendlyName;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setFriendlyName(String newFriendlyName) {
+ String oldFriendlyName = friendlyName;
+ friendlyName = newFriendlyName;
+ if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, ResourcePackage.DEVICE__FRIENDLY_NAME, oldFriendlyName, friendlyName));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EList<Service> getService() {
+ if (service == null) {
+ service = new EObjectContainmentEList<Service>(Service.class, this, ResourcePackage.DEVICE__SERVICE);
+ }
+ return service;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+ switch (featureID) {
+ case ResourcePackage.DEVICE__SERVICE:
+ return ((InternalEList<?>)getService()).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 ResourcePackage.DEVICE__FRIENDLY_NAME:
+ return getFriendlyName();
+ case ResourcePackage.DEVICE__SERVICE:
+ return getService();
+ }
+ 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 ResourcePackage.DEVICE__FRIENDLY_NAME:
+ setFriendlyName((String)newValue);
+ return;
+ case ResourcePackage.DEVICE__SERVICE:
+ getService().clear();
+ getService().addAll((Collection<? extends Service>)newValue);
+ return;
+ }
+ super.eSet(featureID, newValue);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eUnset(int featureID) {
+ switch (featureID) {
+ case ResourcePackage.DEVICE__FRIENDLY_NAME:
+ setFriendlyName(FRIENDLY_NAME_EDEFAULT);
+ return;
+ case ResourcePackage.DEVICE__SERVICE:
+ getService().clear();
+ return;
+ }
+ super.eUnset(featureID);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public boolean eIsSet(int featureID) {
+ switch (featureID) {
+ case ResourcePackage.DEVICE__FRIENDLY_NAME:
+ return FRIENDLY_NAME_EDEFAULT == null ? friendlyName != null : !FRIENDLY_NAME_EDEFAULT.equals(friendlyName);
+ case ResourcePackage.DEVICE__SERVICE:
+ return service != null && !service.isEmpty();
+ }
+ 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(" (friendlyName: ");
+ result.append(friendlyName);
+ result.append(')');
+ return result.toString();
+ }
+
+} //DeviceImpl
diff --git a/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/impl/GatewayImpl.java b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/impl/GatewayImpl.java
new file mode 100644
index 0000000..f87dc8f
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/impl/GatewayImpl.java
@@ -0,0 +1,160 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource.impl;
+
+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.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+import org.eclipse.sensinact.studio.resource.Device;
+import org.eclipse.sensinact.studio.resource.Gateway;
+import org.eclipse.sensinact.studio.resource.ResourcePackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Gateway</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.resource.impl.GatewayImpl#getDevice <em>Device</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class GatewayImpl extends NamedElementImpl implements Gateway {
+ /**
+ * The cached value of the '{@link #getDevice() <em>Device</em>}' containment reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getDevice()
+ * @generated
+ * @ordered
+ */
+ protected EList<Device> device;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected GatewayImpl() {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EClass eStaticClass() {
+ return ResourcePackage.Literals.GATEWAY;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EList<Device> getDevice() {
+ if (device == null) {
+ device = new EObjectContainmentEList<Device>(Device.class, this, ResourcePackage.GATEWAY__DEVICE);
+ }
+ return device;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+ switch (featureID) {
+ case ResourcePackage.GATEWAY__DEVICE:
+ return ((InternalEList<?>)getDevice()).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 ResourcePackage.GATEWAY__DEVICE:
+ return getDevice();
+ }
+ 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 ResourcePackage.GATEWAY__DEVICE:
+ getDevice().clear();
+ getDevice().addAll((Collection<? extends Device>)newValue);
+ return;
+ }
+ super.eSet(featureID, newValue);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eUnset(int featureID) {
+ switch (featureID) {
+ case ResourcePackage.GATEWAY__DEVICE:
+ getDevice().clear();
+ return;
+ }
+ super.eUnset(featureID);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public boolean eIsSet(int featureID) {
+ switch (featureID) {
+ case ResourcePackage.GATEWAY__DEVICE:
+ return device != null && !device.isEmpty();
+ }
+ return super.eIsSet(featureID);
+ }
+
+} //GatewayImpl
diff --git a/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/impl/MetadataImpl.java b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/impl/MetadataImpl.java
new file mode 100644
index 0000000..496d2d2
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/impl/MetadataImpl.java
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource.impl;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.sensinact.studio.resource.Metadata;
+import org.eclipse.sensinact.studio.resource.ResourcePackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Metadata</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+public class MetadataImpl extends TypedElementImpl implements Metadata {
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected MetadataImpl() {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EClass eStaticClass() {
+ return ResourcePackage.Literals.METADATA;
+ }
+
+} //MetadataImpl
diff --git a/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/impl/NamedElementImpl.java b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/impl/NamedElementImpl.java
new file mode 100644
index 0000000..8de6839
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/impl/NamedElementImpl.java
@@ -0,0 +1,173 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource.impl;
+
+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;
+
+import org.eclipse.sensinact.studio.resource.NamedElement;
+import org.eclipse.sensinact.studio.resource.ResourcePackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Named Element</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.resource.impl.NamedElementImpl#getName <em>Name</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class NamedElementImpl extends MinimalEObjectImpl.Container implements NamedElement {
+ /**
+ * 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 NamedElementImpl() {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EClass eStaticClass() {
+ return ResourcePackage.Literals.NAMED_ELEMENT;
+ }
+
+ /**
+ * <!-- 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, ResourcePackage.NAMED_ELEMENT__NAME, oldName, name));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Object eGet(int featureID, boolean resolve, boolean coreType) {
+ switch (featureID) {
+ case ResourcePackage.NAMED_ELEMENT__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 ResourcePackage.NAMED_ELEMENT__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 ResourcePackage.NAMED_ELEMENT__NAME:
+ setName(NAME_EDEFAULT);
+ return;
+ }
+ super.eUnset(featureID);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public boolean eIsSet(int featureID) {
+ switch (featureID) {
+ case ResourcePackage.NAMED_ELEMENT__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();
+ }
+
+} //NamedElementImpl
diff --git a/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/impl/ParameterImpl.java b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/impl/ParameterImpl.java
new file mode 100644
index 0000000..f14e155
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/impl/ParameterImpl.java
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource.impl;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.sensinact.studio.resource.Parameter;
+import org.eclipse.sensinact.studio.resource.ResourcePackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Parameter</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+public class ParameterImpl extends TypedElementImpl implements Parameter {
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected ParameterImpl() {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EClass eStaticClass() {
+ return ResourcePackage.Literals.PARAMETER;
+ }
+
+} //ParameterImpl
diff --git a/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/impl/PropertyImpl.java b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/impl/PropertyImpl.java
new file mode 100644
index 0000000..dc1a82f
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/impl/PropertyImpl.java
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource.impl;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.sensinact.studio.resource.Property;
+import org.eclipse.sensinact.studio.resource.ResourcePackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Property</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+public class PropertyImpl extends ResourceImpl implements Property {
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected PropertyImpl() {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EClass eStaticClass() {
+ return ResourcePackage.Literals.PROPERTY;
+ }
+
+} //PropertyImpl
diff --git a/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/impl/ResourceFactoryImpl.java b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/impl/ResourceFactoryImpl.java
new file mode 100644
index 0000000..9afffa1
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/impl/ResourceFactoryImpl.java
@@ -0,0 +1,310 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource.impl;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EDataType;
+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;
+
+import org.eclipse.sensinact.studio.resource.*;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model <b>Factory</b>.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class ResourceFactoryImpl extends EFactoryImpl implements ResourceFactory {
+ /**
+ * Creates the default factory implementation.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public static ResourceFactory init() {
+ try {
+ ResourceFactory theResourceFactory = (ResourceFactory)EPackage.Registry.INSTANCE.getEFactory(ResourcePackage.eNS_URI);
+ if (theResourceFactory != null) {
+ return theResourceFactory;
+ }
+ }
+ catch (Exception exception) {
+ EcorePlugin.INSTANCE.log(exception);
+ }
+ return new ResourceFactoryImpl();
+ }
+
+ /**
+ * Creates an instance of the factory.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public ResourceFactoryImpl() {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public EObject create(EClass eClass) {
+ switch (eClass.getClassifierID()) {
+ case ResourcePackage.STUDIO: return createStudio();
+ case ResourcePackage.DEVICE: return createDevice();
+ case ResourcePackage.NAMED_ELEMENT: return createNamedElement();
+ case ResourcePackage.TYPED_ELEMENT: return createTypedElement();
+ case ResourcePackage.SERVICE: return createService();
+ case ResourcePackage.RESOURCE: return createResource();
+ case ResourcePackage.PROPERTY: return createProperty();
+ case ResourcePackage.SENSOR_DATA: return createSensorData();
+ case ResourcePackage.STATE_VARIABLE: return createStateVariable();
+ case ResourcePackage.ACTION: return createAction();
+ case ResourcePackage.ATTRIBUTE: return createAttribute();
+ case ResourcePackage.METADATA: return createMetadata();
+ case ResourcePackage.ACCESS_METHOD: return createAccessMethod();
+ case ResourcePackage.PARAMETER: return createParameter();
+ case ResourcePackage.GATEWAY: return createGateway();
+ default:
+ throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier");
+ }
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Object createFromString(EDataType eDataType, String initialValue) {
+ switch (eDataType.getClassifierID()) {
+ case ResourcePackage.ACCESS_METHOD_TYPE:
+ return createAccessMethodTypeFromString(eDataType, initialValue);
+ default:
+ throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier");
+ }
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public String convertToString(EDataType eDataType, Object instanceValue) {
+ switch (eDataType.getClassifierID()) {
+ case ResourcePackage.ACCESS_METHOD_TYPE:
+ return convertAccessMethodTypeToString(eDataType, instanceValue);
+ default:
+ throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier");
+ }
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public Studio createStudio() {
+ StudioImpl studio = new StudioImpl();
+ return studio;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public Device createDevice() {
+ DeviceImpl device = new DeviceImpl();
+ return device;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public NamedElement createNamedElement() {
+ NamedElementImpl namedElement = new NamedElementImpl();
+ return namedElement;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public TypedElement createTypedElement() {
+ TypedElementImpl typedElement = new TypedElementImpl();
+ return typedElement;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public Service createService() {
+ ServiceImpl service = new ServiceImpl();
+ return service;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public Resource createResource() {
+ ResourceImpl resource = new ResourceImpl();
+ return resource;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public Property createProperty() {
+ PropertyImpl property = new PropertyImpl();
+ return property;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public SensorData createSensorData() {
+ SensorDataImpl sensorData = new SensorDataImpl();
+ return sensorData;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public StateVariable createStateVariable() {
+ StateVariableImpl stateVariable = new StateVariableImpl();
+ return stateVariable;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public Action createAction() {
+ ActionImpl action = new ActionImpl();
+ return action;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public Attribute createAttribute() {
+ AttributeImpl attribute = new AttributeImpl();
+ return attribute;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public Metadata createMetadata() {
+ MetadataImpl metadata = new MetadataImpl();
+ return metadata;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public AccessMethod createAccessMethod() {
+ AccessMethodImpl accessMethod = new AccessMethodImpl();
+ return accessMethod;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public Parameter createParameter() {
+ ParameterImpl parameter = new ParameterImpl();
+ return parameter;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public Gateway createGateway() {
+ GatewayImpl gateway = new GatewayImpl();
+ return gateway;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public AccessMethodType createAccessMethodTypeFromString(EDataType eDataType, String initialValue) {
+ AccessMethodType result = AccessMethodType.get(initialValue);
+ if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
+ return result;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public String convertAccessMethodTypeToString(EDataType eDataType, Object instanceValue) {
+ return instanceValue == null ? null : instanceValue.toString();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public ResourcePackage getResourcePackage() {
+ return (ResourcePackage)getEPackage();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @deprecated
+ * @generated
+ */
+ @Deprecated
+ public static ResourcePackage getPackage() {
+ return ResourcePackage.eINSTANCE;
+ }
+
+} //ResourceFactoryImpl
diff --git a/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/impl/ResourceImpl.java b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/impl/ResourceImpl.java
new file mode 100644
index 0000000..efccd01
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/impl/ResourceImpl.java
@@ -0,0 +1,299 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource.impl;
+
+import java.lang.reflect.InvocationTargetException;
+
+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.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+import org.eclipse.sensinact.studio.resource.AccessMethod;
+import org.eclipse.sensinact.studio.resource.AccessMethodType;
+import org.eclipse.sensinact.studio.resource.Attribute;
+import org.eclipse.sensinact.studio.resource.Resource;
+import org.eclipse.sensinact.studio.resource.ResourcePackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Resource</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.resource.impl.ResourceImpl#getFriendlyName <em>Friendly Name</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.resource.impl.ResourceImpl#getAttribute <em>Attribute</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.resource.impl.ResourceImpl#getAccessMethod <em>Access Method</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class ResourceImpl extends NamedElementImpl implements Resource {
+ /**
+ * The default value of the '{@link #getFriendlyName() <em>Friendly Name</em>}' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getFriendlyName()
+ * @generated
+ * @ordered
+ */
+ protected static final String FRIENDLY_NAME_EDEFAULT = null;
+
+ /**
+ * The cached value of the '{@link #getFriendlyName() <em>Friendly Name</em>}' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getFriendlyName()
+ * @generated
+ * @ordered
+ */
+ protected String friendlyName = FRIENDLY_NAME_EDEFAULT;
+
+ /**
+ * The cached value of the '{@link #getAttribute() <em>Attribute</em>}' containment reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getAttribute()
+ * @generated
+ * @ordered
+ */
+ protected EList<Attribute> attribute;
+
+ /**
+ * The cached value of the '{@link #getAccessMethod() <em>Access Method</em>}' containment reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getAccessMethod()
+ * @generated
+ * @ordered
+ */
+ protected EList<AccessMethod> accessMethod;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected ResourceImpl() {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EClass eStaticClass() {
+ return ResourcePackage.Literals.RESOURCE;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public String getFriendlyName() {
+ return friendlyName;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setFriendlyName(String newFriendlyName) {
+ String oldFriendlyName = friendlyName;
+ friendlyName = newFriendlyName;
+ if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, ResourcePackage.RESOURCE__FRIENDLY_NAME, oldFriendlyName, friendlyName));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EList<Attribute> getAttribute() {
+ if (attribute == null) {
+ attribute = new EObjectContainmentEList<Attribute>(Attribute.class, this, ResourcePackage.RESOURCE__ATTRIBUTE);
+ }
+ return attribute;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EList<AccessMethod> getAccessMethod() {
+ if (accessMethod == null) {
+ accessMethod = new EObjectContainmentEList<AccessMethod>(AccessMethod.class, this, ResourcePackage.RESOURCE__ACCESS_METHOD);
+ }
+ return accessMethod;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EList<AccessMethod> getAccessMethod(final AccessMethodType type) {
+ EList<AccessMethod> accessMethodByType = new EObjectContainmentEList<AccessMethod>(AccessMethod.class, this, ResourcePackage.RESOURCE__ACCESS_METHOD);
+ for (AccessMethod accessMethod : getAccessMethod()) {
+ if (accessMethod.getType().equals(type))
+ accessMethodByType.add(accessMethod);
+ }
+ return accessMethodByType;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+ switch (featureID) {
+ case ResourcePackage.RESOURCE__ATTRIBUTE:
+ return ((InternalEList<?>)getAttribute()).basicRemove(otherEnd, msgs);
+ case ResourcePackage.RESOURCE__ACCESS_METHOD:
+ return ((InternalEList<?>)getAccessMethod()).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 ResourcePackage.RESOURCE__FRIENDLY_NAME:
+ return getFriendlyName();
+ case ResourcePackage.RESOURCE__ATTRIBUTE:
+ return getAttribute();
+ case ResourcePackage.RESOURCE__ACCESS_METHOD:
+ return getAccessMethod();
+ }
+ 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 ResourcePackage.RESOURCE__FRIENDLY_NAME:
+ setFriendlyName((String)newValue);
+ return;
+ case ResourcePackage.RESOURCE__ATTRIBUTE:
+ getAttribute().clear();
+ getAttribute().addAll((Collection<? extends Attribute>)newValue);
+ return;
+ case ResourcePackage.RESOURCE__ACCESS_METHOD:
+ getAccessMethod().clear();
+ getAccessMethod().addAll((Collection<? extends AccessMethod>)newValue);
+ return;
+ }
+ super.eSet(featureID, newValue);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eUnset(int featureID) {
+ switch (featureID) {
+ case ResourcePackage.RESOURCE__FRIENDLY_NAME:
+ setFriendlyName(FRIENDLY_NAME_EDEFAULT);
+ return;
+ case ResourcePackage.RESOURCE__ATTRIBUTE:
+ getAttribute().clear();
+ return;
+ case ResourcePackage.RESOURCE__ACCESS_METHOD:
+ getAccessMethod().clear();
+ return;
+ }
+ super.eUnset(featureID);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public boolean eIsSet(int featureID) {
+ switch (featureID) {
+ case ResourcePackage.RESOURCE__FRIENDLY_NAME:
+ return FRIENDLY_NAME_EDEFAULT == null ? friendlyName != null : !FRIENDLY_NAME_EDEFAULT.equals(friendlyName);
+ case ResourcePackage.RESOURCE__ATTRIBUTE:
+ return attribute != null && !attribute.isEmpty();
+ case ResourcePackage.RESOURCE__ACCESS_METHOD:
+ return accessMethod != null && !accessMethod.isEmpty();
+ }
+ return super.eIsSet(featureID);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Object eInvoke(int operationID, EList<?> arguments) throws InvocationTargetException {
+ switch (operationID) {
+ case ResourcePackage.RESOURCE___GET_ACCESS_METHOD__ACCESSMETHODTYPE:
+ return getAccessMethod((AccessMethodType)arguments.get(0));
+ }
+ return super.eInvoke(operationID, arguments);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public String toString() {
+ if (eIsProxy()) return super.toString();
+
+ StringBuffer result = new StringBuffer(super.toString());
+ result.append(" (friendlyName: ");
+ result.append(friendlyName);
+ result.append(')');
+ return result.toString();
+ }
+
+} //ResourceImpl
diff --git a/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/impl/ResourcePackageImpl.java b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/impl/ResourcePackageImpl.java
new file mode 100644
index 0000000..457eef6
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/impl/ResourcePackageImpl.java
@@ -0,0 +1,713 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource.impl;
+
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EEnum;
+import org.eclipse.emf.ecore.EOperation;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EReference;
+
+import org.eclipse.emf.ecore.impl.EPackageImpl;
+
+import org.eclipse.sensinact.studio.resource.AccessMethod;
+import org.eclipse.sensinact.studio.resource.AccessMethodType;
+import org.eclipse.sensinact.studio.resource.Action;
+import org.eclipse.sensinact.studio.resource.Attribute;
+import org.eclipse.sensinact.studio.resource.Device;
+import org.eclipse.sensinact.studio.resource.Gateway;
+import org.eclipse.sensinact.studio.resource.Metadata;
+import org.eclipse.sensinact.studio.resource.NamedElement;
+import org.eclipse.sensinact.studio.resource.Parameter;
+import org.eclipse.sensinact.studio.resource.Property;
+import org.eclipse.sensinact.studio.resource.Resource;
+import org.eclipse.sensinact.studio.resource.ResourceFactory;
+import org.eclipse.sensinact.studio.resource.ResourcePackage;
+import org.eclipse.sensinact.studio.resource.SensorData;
+import org.eclipse.sensinact.studio.resource.Service;
+import org.eclipse.sensinact.studio.resource.StateVariable;
+import org.eclipse.sensinact.studio.resource.Studio;
+import org.eclipse.sensinact.studio.resource.TypedElement;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model <b>Package</b>.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class ResourcePackageImpl extends EPackageImpl implements ResourcePackage {
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ private EClass studioEClass = null;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ private EClass deviceEClass = null;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ private EClass namedElementEClass = null;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ private EClass typedElementEClass = null;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ private EClass serviceEClass = null;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ private EClass resourceEClass = null;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ private EClass propertyEClass = null;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ private EClass sensorDataEClass = null;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ private EClass stateVariableEClass = null;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ private EClass actionEClass = null;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ private EClass attributeEClass = null;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ private EClass metadataEClass = null;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ private EClass accessMethodEClass = null;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ private EClass parameterEClass = null;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ private EClass gatewayEClass = null;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ private EEnum accessMethodTypeEEnum = 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 org.eclipse.sensinact.studio.resource.ResourcePackage#eNS_URI
+ * @see #init()
+ * @generated
+ */
+ private ResourcePackageImpl() {
+ super(eNS_URI, ResourceFactory.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 ResourcePackage#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 ResourcePackage init() {
+ if (isInited) return (ResourcePackage)EPackage.Registry.INSTANCE.getEPackage(ResourcePackage.eNS_URI);
+
+ // Obtain or create and register package
+ ResourcePackageImpl theResourcePackage = (ResourcePackageImpl)(EPackage.Registry.INSTANCE.get(eNS_URI) instanceof ResourcePackageImpl ? EPackage.Registry.INSTANCE.get(eNS_URI) : new ResourcePackageImpl());
+
+ isInited = true;
+
+ // Create package meta-data objects
+ theResourcePackage.createPackageContents();
+
+ // Initialize created meta-data
+ theResourcePackage.initializePackageContents();
+
+ // Mark meta-data to indicate it can't be changed
+ theResourcePackage.freeze();
+
+
+ // Update the registry and return the package
+ EPackage.Registry.INSTANCE.put(ResourcePackage.eNS_URI, theResourcePackage);
+ return theResourcePackage;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EClass getStudio() {
+ return studioEClass;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getStudio_Gateways() {
+ return (EReference)studioEClass.getEStructuralFeatures().get(0);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EClass getDevice() {
+ return deviceEClass;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EAttribute getDevice_FriendlyName() {
+ return (EAttribute)deviceEClass.getEStructuralFeatures().get(0);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getDevice_Service() {
+ return (EReference)deviceEClass.getEStructuralFeatures().get(1);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EClass getNamedElement() {
+ return namedElementEClass;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EAttribute getNamedElement_Name() {
+ return (EAttribute)namedElementEClass.getEStructuralFeatures().get(0);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EClass getTypedElement() {
+ return typedElementEClass;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EAttribute getTypedElement_Type() {
+ return (EAttribute)typedElementEClass.getEStructuralFeatures().get(0);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EAttribute getTypedElement_Value() {
+ return (EAttribute)typedElementEClass.getEStructuralFeatures().get(1);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EClass getService() {
+ return serviceEClass;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EAttribute getService_FriendlyName() {
+ return (EAttribute)serviceEClass.getEStructuralFeatures().get(0);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getService_Resource() {
+ return (EReference)serviceEClass.getEStructuralFeatures().get(1);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EClass getResource() {
+ return resourceEClass;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EAttribute getResource_FriendlyName() {
+ return (EAttribute)resourceEClass.getEStructuralFeatures().get(0);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getResource_Attribute() {
+ return (EReference)resourceEClass.getEStructuralFeatures().get(1);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getResource_AccessMethod() {
+ return (EReference)resourceEClass.getEStructuralFeatures().get(2);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EOperation getResource__GetAccessMethod__AccessMethodType() {
+ return resourceEClass.getEOperations().get(0);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EClass getProperty() {
+ return propertyEClass;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EClass getSensorData() {
+ return sensorDataEClass;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EClass getStateVariable() {
+ return stateVariableEClass;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getStateVariable_Modifier() {
+ return (EReference)stateVariableEClass.getEStructuralFeatures().get(0);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EClass getAction() {
+ return actionEClass;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getAction_State() {
+ return (EReference)actionEClass.getEStructuralFeatures().get(0);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EClass getAttribute() {
+ return attributeEClass;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getAttribute_Metadata() {
+ return (EReference)attributeEClass.getEStructuralFeatures().get(0);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EClass getMetadata() {
+ return metadataEClass;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EClass getAccessMethod() {
+ return accessMethodEClass;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getAccessMethod_Parameter() {
+ return (EReference)accessMethodEClass.getEStructuralFeatures().get(0);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EAttribute getAccessMethod_Type() {
+ return (EAttribute)accessMethodEClass.getEStructuralFeatures().get(1);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EClass getParameter() {
+ return parameterEClass;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EClass getGateway() {
+ return gatewayEClass;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getGateway_Device() {
+ return (EReference)gatewayEClass.getEStructuralFeatures().get(0);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EEnum getAccessMethodType() {
+ return accessMethodTypeEEnum;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public ResourceFactory getResourceFactory() {
+ return (ResourceFactory)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
+ studioEClass = createEClass(STUDIO);
+ createEReference(studioEClass, STUDIO__GATEWAYS);
+
+ deviceEClass = createEClass(DEVICE);
+ createEAttribute(deviceEClass, DEVICE__FRIENDLY_NAME);
+ createEReference(deviceEClass, DEVICE__SERVICE);
+
+ namedElementEClass = createEClass(NAMED_ELEMENT);
+ createEAttribute(namedElementEClass, NAMED_ELEMENT__NAME);
+
+ typedElementEClass = createEClass(TYPED_ELEMENT);
+ createEAttribute(typedElementEClass, TYPED_ELEMENT__TYPE);
+ createEAttribute(typedElementEClass, TYPED_ELEMENT__VALUE);
+
+ serviceEClass = createEClass(SERVICE);
+ createEAttribute(serviceEClass, SERVICE__FRIENDLY_NAME);
+ createEReference(serviceEClass, SERVICE__RESOURCE);
+
+ resourceEClass = createEClass(RESOURCE);
+ createEAttribute(resourceEClass, RESOURCE__FRIENDLY_NAME);
+ createEReference(resourceEClass, RESOURCE__ATTRIBUTE);
+ createEReference(resourceEClass, RESOURCE__ACCESS_METHOD);
+ createEOperation(resourceEClass, RESOURCE___GET_ACCESS_METHOD__ACCESSMETHODTYPE);
+
+ propertyEClass = createEClass(PROPERTY);
+
+ sensorDataEClass = createEClass(SENSOR_DATA);
+
+ stateVariableEClass = createEClass(STATE_VARIABLE);
+ createEReference(stateVariableEClass, STATE_VARIABLE__MODIFIER);
+
+ actionEClass = createEClass(ACTION);
+ createEReference(actionEClass, ACTION__STATE);
+
+ attributeEClass = createEClass(ATTRIBUTE);
+ createEReference(attributeEClass, ATTRIBUTE__METADATA);
+
+ metadataEClass = createEClass(METADATA);
+
+ accessMethodEClass = createEClass(ACCESS_METHOD);
+ createEReference(accessMethodEClass, ACCESS_METHOD__PARAMETER);
+ createEAttribute(accessMethodEClass, ACCESS_METHOD__TYPE);
+
+ parameterEClass = createEClass(PARAMETER);
+
+ gatewayEClass = createEClass(GATEWAY);
+ createEReference(gatewayEClass, GATEWAY__DEVICE);
+
+ // Create enums
+ accessMethodTypeEEnum = createEEnum(ACCESS_METHOD_TYPE);
+ }
+
+ /**
+ * <!-- 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);
+
+ // Create type parameters
+
+ // Set bounds for type parameters
+
+ // Add supertypes to classes
+ deviceEClass.getESuperTypes().add(this.getNamedElement());
+ typedElementEClass.getESuperTypes().add(this.getNamedElement());
+ serviceEClass.getESuperTypes().add(this.getNamedElement());
+ resourceEClass.getESuperTypes().add(this.getNamedElement());
+ propertyEClass.getESuperTypes().add(this.getResource());
+ sensorDataEClass.getESuperTypes().add(this.getResource());
+ stateVariableEClass.getESuperTypes().add(this.getResource());
+ actionEClass.getESuperTypes().add(this.getResource());
+ attributeEClass.getESuperTypes().add(this.getTypedElement());
+ metadataEClass.getESuperTypes().add(this.getTypedElement());
+ parameterEClass.getESuperTypes().add(this.getTypedElement());
+ gatewayEClass.getESuperTypes().add(this.getNamedElement());
+
+ // Initialize classes, features, and operations; add parameters
+ initEClass(studioEClass, Studio.class, "Studio", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+ initEReference(getStudio_Gateways(), this.getGateway(), null, "gateways", null, 0, -1, Studio.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+ initEClass(deviceEClass, Device.class, "Device", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+ initEAttribute(getDevice_FriendlyName(), ecorePackage.getEString(), "friendlyName", null, 0, 1, Device.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+ initEReference(getDevice_Service(), this.getService(), null, "service", null, 0, -1, Device.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+ initEClass(namedElementEClass, NamedElement.class, "NamedElement", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+ initEAttribute(getNamedElement_Name(), ecorePackage.getEString(), "name", null, 0, 1, NamedElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+ initEClass(typedElementEClass, TypedElement.class, "TypedElement", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+ initEAttribute(getTypedElement_Type(), ecorePackage.getEString(), "type", null, 0, 1, TypedElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+ initEAttribute(getTypedElement_Value(), ecorePackage.getEString(), "value", null, 0, 1, TypedElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+ initEClass(serviceEClass, Service.class, "Service", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+ initEAttribute(getService_FriendlyName(), ecorePackage.getEString(), "friendlyName", null, 0, 1, Service.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+ initEReference(getService_Resource(), this.getResource(), null, "resource", null, 0, -1, Service.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+ initEClass(resourceEClass, Resource.class, "Resource", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+ initEAttribute(getResource_FriendlyName(), ecorePackage.getEString(), "friendlyName", null, 0, 1, Resource.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+ initEReference(getResource_Attribute(), this.getAttribute(), null, "attribute", null, 0, -1, Resource.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+ initEReference(getResource_AccessMethod(), this.getAccessMethod(), null, "accessMethod", null, 0, -1, Resource.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+ EOperation op = initEOperation(getResource__GetAccessMethod__AccessMethodType(), this.getAccessMethod(), "getAccessMethod", 0, -1, IS_UNIQUE, IS_ORDERED);
+ addEParameter(op, this.getAccessMethodType(), "type", 0, 1, IS_UNIQUE, IS_ORDERED);
+
+ initEClass(propertyEClass, Property.class, "Property", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+ initEClass(sensorDataEClass, SensorData.class, "SensorData", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+ initEClass(stateVariableEClass, StateVariable.class, "StateVariable", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+ initEReference(getStateVariable_Modifier(), this.getAction(), this.getAction_State(), "modifier", null, 0, -1, StateVariable.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+ initEClass(actionEClass, Action.class, "Action", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+ initEReference(getAction_State(), this.getStateVariable(), this.getStateVariable_Modifier(), "state", null, 0, -1, Action.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+ initEClass(attributeEClass, Attribute.class, "Attribute", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+ initEReference(getAttribute_Metadata(), this.getMetadata(), null, "metadata", null, 0, -1, Attribute.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+ initEClass(metadataEClass, Metadata.class, "Metadata", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+ initEClass(accessMethodEClass, AccessMethod.class, "AccessMethod", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+ initEReference(getAccessMethod_Parameter(), this.getParameter(), null, "parameter", null, 0, -1, AccessMethod.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+ initEAttribute(getAccessMethod_Type(), this.getAccessMethodType(), "type", null, 0, 1, AccessMethod.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+ initEClass(parameterEClass, Parameter.class, "Parameter", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+ initEClass(gatewayEClass, Gateway.class, "Gateway", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+ initEReference(getGateway_Device(), this.getDevice(), null, "device", null, 0, -1, Gateway.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+ // Initialize enums and add enum literals
+ initEEnum(accessMethodTypeEEnum, AccessMethodType.class, "AccessMethodType");
+ addEEnumLiteral(accessMethodTypeEEnum, AccessMethodType.GET);
+ addEEnumLiteral(accessMethodTypeEEnum, AccessMethodType.SET);
+ addEEnumLiteral(accessMethodTypeEEnum, AccessMethodType.ACT);
+ addEEnumLiteral(accessMethodTypeEEnum, AccessMethodType.SUBSCRIBE);
+ addEEnumLiteral(accessMethodTypeEEnum, AccessMethodType.UNSUBSCRIBE);
+
+ // Create resource
+ createResource(eNS_URI);
+ }
+
+} //ResourcePackageImpl
diff --git a/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/impl/SensorDataImpl.java b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/impl/SensorDataImpl.java
new file mode 100644
index 0000000..9421922
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/impl/SensorDataImpl.java
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource.impl;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.sensinact.studio.resource.ResourcePackage;
+import org.eclipse.sensinact.studio.resource.SensorData;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Sensor Data</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+public class SensorDataImpl extends ResourceImpl implements SensorData {
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected SensorDataImpl() {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EClass eStaticClass() {
+ return ResourcePackage.Literals.SENSOR_DATA;
+ }
+
+} //SensorDataImpl
diff --git a/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/impl/ServiceImpl.java b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/impl/ServiceImpl.java
new file mode 100644
index 0000000..50f258b
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/impl/ServiceImpl.java
@@ -0,0 +1,231 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource.impl;
+
+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.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+import org.eclipse.sensinact.studio.resource.Resource;
+import org.eclipse.sensinact.studio.resource.ResourcePackage;
+import org.eclipse.sensinact.studio.resource.Service;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Service</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.resource.impl.ServiceImpl#getFriendlyName <em>Friendly Name</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.resource.impl.ServiceImpl#getResource <em>Resource</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class ServiceImpl extends NamedElementImpl implements Service {
+ /**
+ * The default value of the '{@link #getFriendlyName() <em>Friendly Name</em>}' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getFriendlyName()
+ * @generated
+ * @ordered
+ */
+ protected static final String FRIENDLY_NAME_EDEFAULT = null;
+
+ /**
+ * The cached value of the '{@link #getFriendlyName() <em>Friendly Name</em>}' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getFriendlyName()
+ * @generated
+ * @ordered
+ */
+ protected String friendlyName = FRIENDLY_NAME_EDEFAULT;
+
+ /**
+ * The cached value of the '{@link #getResource() <em>Resource</em>}' containment reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getResource()
+ * @generated
+ * @ordered
+ */
+ protected EList<Resource> resource;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected ServiceImpl() {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EClass eStaticClass() {
+ return ResourcePackage.Literals.SERVICE;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public String getFriendlyName() {
+ return friendlyName;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setFriendlyName(String newFriendlyName) {
+ String oldFriendlyName = friendlyName;
+ friendlyName = newFriendlyName;
+ if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, ResourcePackage.SERVICE__FRIENDLY_NAME, oldFriendlyName, friendlyName));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EList<Resource> getResource() {
+ if (resource == null) {
+ resource = new EObjectContainmentEList<Resource>(Resource.class, this, ResourcePackage.SERVICE__RESOURCE);
+ }
+ return resource;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+ switch (featureID) {
+ case ResourcePackage.SERVICE__RESOURCE:
+ return ((InternalEList<?>)getResource()).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 ResourcePackage.SERVICE__FRIENDLY_NAME:
+ return getFriendlyName();
+ case ResourcePackage.SERVICE__RESOURCE:
+ return getResource();
+ }
+ 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 ResourcePackage.SERVICE__FRIENDLY_NAME:
+ setFriendlyName((String)newValue);
+ return;
+ case ResourcePackage.SERVICE__RESOURCE:
+ getResource().clear();
+ getResource().addAll((Collection<? extends Resource>)newValue);
+ return;
+ }
+ super.eSet(featureID, newValue);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eUnset(int featureID) {
+ switch (featureID) {
+ case ResourcePackage.SERVICE__FRIENDLY_NAME:
+ setFriendlyName(FRIENDLY_NAME_EDEFAULT);
+ return;
+ case ResourcePackage.SERVICE__RESOURCE:
+ getResource().clear();
+ return;
+ }
+ super.eUnset(featureID);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public boolean eIsSet(int featureID) {
+ switch (featureID) {
+ case ResourcePackage.SERVICE__FRIENDLY_NAME:
+ return FRIENDLY_NAME_EDEFAULT == null ? friendlyName != null : !FRIENDLY_NAME_EDEFAULT.equals(friendlyName);
+ case ResourcePackage.SERVICE__RESOURCE:
+ return resource != null && !resource.isEmpty();
+ }
+ 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(" (friendlyName: ");
+ result.append(friendlyName);
+ result.append(')');
+ return result.toString();
+ }
+
+} //ServiceImpl
diff --git a/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/impl/StateVariableImpl.java b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/impl/StateVariableImpl.java
new file mode 100644
index 0000000..ed66cfc
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/impl/StateVariableImpl.java
@@ -0,0 +1,175 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource.impl;
+
+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.util.EObjectWithInverseResolvingEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+import org.eclipse.sensinact.studio.resource.Action;
+import org.eclipse.sensinact.studio.resource.ResourcePackage;
+import org.eclipse.sensinact.studio.resource.StateVariable;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>State Variable</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.resource.impl.StateVariableImpl#getModifier <em>Modifier</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class StateVariableImpl extends ResourceImpl implements StateVariable {
+ /**
+ * The cached value of the '{@link #getModifier() <em>Modifier</em>}' reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getModifier()
+ * @generated
+ * @ordered
+ */
+ protected EList<Action> modifier;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected StateVariableImpl() {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EClass eStaticClass() {
+ return ResourcePackage.Literals.STATE_VARIABLE;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EList<Action> getModifier() {
+ if (modifier == null) {
+ modifier = new EObjectWithInverseResolvingEList.ManyInverse<Action>(Action.class, this, ResourcePackage.STATE_VARIABLE__MODIFIER, ResourcePackage.ACTION__STATE);
+ }
+ return modifier;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @SuppressWarnings("unchecked")
+ @Override
+ public NotificationChain eInverseAdd(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+ switch (featureID) {
+ case ResourcePackage.STATE_VARIABLE__MODIFIER:
+ return ((InternalEList<InternalEObject>)(InternalEList<?>)getModifier()).basicAdd(otherEnd, msgs);
+ }
+ return super.eInverseAdd(otherEnd, featureID, msgs);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+ switch (featureID) {
+ case ResourcePackage.STATE_VARIABLE__MODIFIER:
+ return ((InternalEList<?>)getModifier()).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 ResourcePackage.STATE_VARIABLE__MODIFIER:
+ return getModifier();
+ }
+ 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 ResourcePackage.STATE_VARIABLE__MODIFIER:
+ getModifier().clear();
+ getModifier().addAll((Collection<? extends Action>)newValue);
+ return;
+ }
+ super.eSet(featureID, newValue);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eUnset(int featureID) {
+ switch (featureID) {
+ case ResourcePackage.STATE_VARIABLE__MODIFIER:
+ getModifier().clear();
+ return;
+ }
+ super.eUnset(featureID);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public boolean eIsSet(int featureID) {
+ switch (featureID) {
+ case ResourcePackage.STATE_VARIABLE__MODIFIER:
+ return modifier != null && !modifier.isEmpty();
+ }
+ return super.eIsSet(featureID);
+ }
+
+} //StateVariableImpl
diff --git a/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/impl/StudioImpl.java b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/impl/StudioImpl.java
new file mode 100644
index 0000000..059aacb
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/impl/StudioImpl.java
@@ -0,0 +1,162 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource.impl;
+
+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.MinimalEObjectImpl;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+import org.eclipse.sensinact.studio.resource.Gateway;
+import org.eclipse.sensinact.studio.resource.ResourcePackage;
+import org.eclipse.sensinact.studio.resource.Studio;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Studio</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.resource.impl.StudioImpl#getGateways <em>Gateways</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class StudioImpl extends MinimalEObjectImpl.Container implements Studio {
+ /**
+ * The cached value of the '{@link #getGateways() <em>Gateways</em>}' containment reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getGateways()
+ * @generated
+ * @ordered
+ */
+ protected EList<Gateway> gateways;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected StudioImpl() {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EClass eStaticClass() {
+ return ResourcePackage.Literals.STUDIO;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EList<Gateway> getGateways() {
+ if (gateways == null) {
+ gateways = new EObjectContainmentEList<Gateway>(Gateway.class, this, ResourcePackage.STUDIO__GATEWAYS);
+ }
+ return gateways;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+ switch (featureID) {
+ case ResourcePackage.STUDIO__GATEWAYS:
+ return ((InternalEList<?>)getGateways()).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 ResourcePackage.STUDIO__GATEWAYS:
+ return getGateways();
+ }
+ 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 ResourcePackage.STUDIO__GATEWAYS:
+ getGateways().clear();
+ getGateways().addAll((Collection<? extends Gateway>)newValue);
+ return;
+ }
+ super.eSet(featureID, newValue);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eUnset(int featureID) {
+ switch (featureID) {
+ case ResourcePackage.STUDIO__GATEWAYS:
+ getGateways().clear();
+ return;
+ }
+ super.eUnset(featureID);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public boolean eIsSet(int featureID) {
+ switch (featureID) {
+ case ResourcePackage.STUDIO__GATEWAYS:
+ return gateways != null && !gateways.isEmpty();
+ }
+ return super.eIsSet(featureID);
+ }
+
+} //StudioImpl
diff --git a/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/impl/TypedElementImpl.java b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/impl/TypedElementImpl.java
new file mode 100644
index 0000000..c6dde15
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/impl/TypedElementImpl.java
@@ -0,0 +1,226 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.sensinact.studio.resource.ResourcePackage;
+import org.eclipse.sensinact.studio.resource.TypedElement;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Typed Element</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.resource.impl.TypedElementImpl#getType <em>Type</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.resource.impl.TypedElementImpl#getValue <em>Value</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class TypedElementImpl extends NamedElementImpl implements TypedElement {
+ /**
+ * The default value of the '{@link #getType() <em>Type</em>}' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getType()
+ * @generated
+ * @ordered
+ */
+ protected static final String TYPE_EDEFAULT = null;
+
+ /**
+ * The cached value of the '{@link #getType() <em>Type</em>}' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getType()
+ * @generated
+ * @ordered
+ */
+ protected String type = TYPE_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 String 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 String value = VALUE_EDEFAULT;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected TypedElementImpl() {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EClass eStaticClass() {
+ return ResourcePackage.Literals.TYPED_ELEMENT;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public String getType() {
+ return type;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setType(String newType) {
+ String oldType = type;
+ type = newType;
+ if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, ResourcePackage.TYPED_ELEMENT__TYPE, oldType, type));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public String getValue() {
+ return value;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setValue(String newValue) {
+ String oldValue = value;
+ value = newValue;
+ if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, ResourcePackage.TYPED_ELEMENT__VALUE, oldValue, value));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Object eGet(int featureID, boolean resolve, boolean coreType) {
+ switch (featureID) {
+ case ResourcePackage.TYPED_ELEMENT__TYPE:
+ return getType();
+ case ResourcePackage.TYPED_ELEMENT__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 ResourcePackage.TYPED_ELEMENT__TYPE:
+ setType((String)newValue);
+ return;
+ case ResourcePackage.TYPED_ELEMENT__VALUE:
+ setValue((String)newValue);
+ return;
+ }
+ super.eSet(featureID, newValue);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eUnset(int featureID) {
+ switch (featureID) {
+ case ResourcePackage.TYPED_ELEMENT__TYPE:
+ setType(TYPE_EDEFAULT);
+ return;
+ case ResourcePackage.TYPED_ELEMENT__VALUE:
+ setValue(VALUE_EDEFAULT);
+ return;
+ }
+ super.eUnset(featureID);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public boolean eIsSet(int featureID) {
+ switch (featureID) {
+ case ResourcePackage.TYPED_ELEMENT__TYPE:
+ return TYPE_EDEFAULT == null ? type != null : !TYPE_EDEFAULT.equals(type);
+ case ResourcePackage.TYPED_ELEMENT__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(" (type: ");
+ result.append(type);
+ result.append(", value: ");
+ result.append(value);
+ result.append(')');
+ return result.toString();
+ }
+
+} //TypedElementImpl
diff --git a/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/util/ResourceAdapterFactory.java b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/util/ResourceAdapterFactory.java
new file mode 100644
index 0000000..8941e2a
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/util/ResourceAdapterFactory.java
@@ -0,0 +1,382 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource.util;
+
+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;
+
+import org.eclipse.sensinact.studio.resource.*;
+
+/**
+ * <!-- 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 org.eclipse.sensinact.studio.resource.ResourcePackage
+ * @generated
+ */
+public class ResourceAdapterFactory extends AdapterFactoryImpl {
+ /**
+ * The cached model package.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected static ResourcePackage modelPackage;
+
+ /**
+ * Creates an instance of the adapter factory.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public ResourceAdapterFactory() {
+ if (modelPackage == null) {
+ modelPackage = ResourcePackage.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 ResourceSwitch<Adapter> modelSwitch =
+ new ResourceSwitch<Adapter>() {
+ @Override
+ public Adapter caseStudio(Studio object) {
+ return createStudioAdapter();
+ }
+ @Override
+ public Adapter caseDevice(Device object) {
+ return createDeviceAdapter();
+ }
+ @Override
+ public Adapter caseNamedElement(NamedElement object) {
+ return createNamedElementAdapter();
+ }
+ @Override
+ public Adapter caseTypedElement(TypedElement object) {
+ return createTypedElementAdapter();
+ }
+ @Override
+ public Adapter caseService(Service object) {
+ return createServiceAdapter();
+ }
+ @Override
+ public Adapter caseResource(Resource object) {
+ return createResourceAdapter();
+ }
+ @Override
+ public Adapter caseProperty(Property object) {
+ return createPropertyAdapter();
+ }
+ @Override
+ public Adapter caseSensorData(SensorData object) {
+ return createSensorDataAdapter();
+ }
+ @Override
+ public Adapter caseStateVariable(StateVariable object) {
+ return createStateVariableAdapter();
+ }
+ @Override
+ public Adapter caseAction(Action object) {
+ return createActionAdapter();
+ }
+ @Override
+ public Adapter caseAttribute(Attribute object) {
+ return createAttributeAdapter();
+ }
+ @Override
+ public Adapter caseMetadata(Metadata object) {
+ return createMetadataAdapter();
+ }
+ @Override
+ public Adapter caseAccessMethod(AccessMethod object) {
+ return createAccessMethodAdapter();
+ }
+ @Override
+ public Adapter caseParameter(Parameter object) {
+ return createParameterAdapter();
+ }
+ @Override
+ public Adapter caseGateway(Gateway object) {
+ return createGatewayAdapter();
+ }
+ @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 org.eclipse.sensinact.studio.resource.Studio <em>Studio</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 org.eclipse.sensinact.studio.resource.Studio
+ * @generated
+ */
+ public Adapter createStudioAdapter() {
+ return null;
+ }
+
+ /**
+ * Creates a new adapter for an object of class '{@link org.eclipse.sensinact.studio.resource.Device <em>Device</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 org.eclipse.sensinact.studio.resource.Device
+ * @generated
+ */
+ public Adapter createDeviceAdapter() {
+ return null;
+ }
+
+ /**
+ * Creates a new adapter for an object of class '{@link org.eclipse.sensinact.studio.resource.NamedElement <em>Named Element</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 org.eclipse.sensinact.studio.resource.NamedElement
+ * @generated
+ */
+ public Adapter createNamedElementAdapter() {
+ return null;
+ }
+
+ /**
+ * Creates a new adapter for an object of class '{@link org.eclipse.sensinact.studio.resource.TypedElement <em>Typed Element</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 org.eclipse.sensinact.studio.resource.TypedElement
+ * @generated
+ */
+ public Adapter createTypedElementAdapter() {
+ return null;
+ }
+
+ /**
+ * Creates a new adapter for an object of class '{@link org.eclipse.sensinact.studio.resource.Service <em>Service</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 org.eclipse.sensinact.studio.resource.Service
+ * @generated
+ */
+ public Adapter createServiceAdapter() {
+ return null;
+ }
+
+ /**
+ * Creates a new adapter for an object of class '{@link org.eclipse.sensinact.studio.resource.Resource <em>Resource</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 org.eclipse.sensinact.studio.resource.Resource
+ * @generated
+ */
+ public Adapter createResourceAdapter() {
+ return null;
+ }
+
+ /**
+ * Creates a new adapter for an object of class '{@link org.eclipse.sensinact.studio.resource.Property <em>Property</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 org.eclipse.sensinact.studio.resource.Property
+ * @generated
+ */
+ public Adapter createPropertyAdapter() {
+ return null;
+ }
+
+ /**
+ * Creates a new adapter for an object of class '{@link org.eclipse.sensinact.studio.resource.SensorData <em>Sensor Data</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 org.eclipse.sensinact.studio.resource.SensorData
+ * @generated
+ */
+ public Adapter createSensorDataAdapter() {
+ return null;
+ }
+
+ /**
+ * Creates a new adapter for an object of class '{@link org.eclipse.sensinact.studio.resource.StateVariable <em>State Variable</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 org.eclipse.sensinact.studio.resource.StateVariable
+ * @generated
+ */
+ public Adapter createStateVariableAdapter() {
+ return null;
+ }
+
+ /**
+ * Creates a new adapter for an object of class '{@link org.eclipse.sensinact.studio.resource.Action <em>Action</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 org.eclipse.sensinact.studio.resource.Action
+ * @generated
+ */
+ public Adapter createActionAdapter() {
+ return null;
+ }
+
+ /**
+ * Creates a new adapter for an object of class '{@link org.eclipse.sensinact.studio.resource.Attribute <em>Attribute</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 org.eclipse.sensinact.studio.resource.Attribute
+ * @generated
+ */
+ public Adapter createAttributeAdapter() {
+ return null;
+ }
+
+ /**
+ * Creates a new adapter for an object of class '{@link org.eclipse.sensinact.studio.resource.Metadata <em>Metadata</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 org.eclipse.sensinact.studio.resource.Metadata
+ * @generated
+ */
+ public Adapter createMetadataAdapter() {
+ return null;
+ }
+
+ /**
+ * Creates a new adapter for an object of class '{@link org.eclipse.sensinact.studio.resource.AccessMethod <em>Access Method</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 org.eclipse.sensinact.studio.resource.AccessMethod
+ * @generated
+ */
+ public Adapter createAccessMethodAdapter() {
+ return null;
+ }
+
+ /**
+ * Creates a new adapter for an object of class '{@link org.eclipse.sensinact.studio.resource.Parameter <em>Parameter</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 org.eclipse.sensinact.studio.resource.Parameter
+ * @generated
+ */
+ public Adapter createParameterAdapter() {
+ return null;
+ }
+
+ /**
+ * Creates a new adapter for an object of class '{@link org.eclipse.sensinact.studio.resource.Gateway <em>Gateway</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 org.eclipse.sensinact.studio.resource.Gateway
+ * @generated
+ */
+ public Adapter createGatewayAdapter() {
+ 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;
+ }
+
+} //ResourceAdapterFactory
diff --git a/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/util/ResourceSwitch.java b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/util/ResourceSwitch.java
new file mode 100644
index 0000000..21b4913
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource/src-gen/org/eclipse/sensinact/studio/resource/util/ResourceSwitch.java
@@ -0,0 +1,433 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ */
+package org.eclipse.sensinact.studio.resource.util;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+
+import org.eclipse.emf.ecore.util.Switch;
+
+import org.eclipse.sensinact.studio.resource.*;
+
+/**
+ * <!-- 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 org.eclipse.sensinact.studio.resource.ResourcePackage
+ * @generated
+ */
+public class ResourceSwitch<T> extends Switch<T> {
+ /**
+ * The cached model package
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected static ResourcePackage modelPackage;
+
+ /**
+ * Creates an instance of the switch.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public ResourceSwitch() {
+ if (modelPackage == null) {
+ modelPackage = ResourcePackage.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 ResourcePackage.STUDIO: {
+ Studio studio = (Studio)theEObject;
+ T result = caseStudio(studio);
+ if (result == null) result = defaultCase(theEObject);
+ return result;
+ }
+ case ResourcePackage.DEVICE: {
+ Device device = (Device)theEObject;
+ T result = caseDevice(device);
+ if (result == null) result = caseNamedElement(device);
+ if (result == null) result = defaultCase(theEObject);
+ return result;
+ }
+ case ResourcePackage.NAMED_ELEMENT: {
+ NamedElement namedElement = (NamedElement)theEObject;
+ T result = caseNamedElement(namedElement);
+ if (result == null) result = defaultCase(theEObject);
+ return result;
+ }
+ case ResourcePackage.TYPED_ELEMENT: {
+ TypedElement typedElement = (TypedElement)theEObject;
+ T result = caseTypedElement(typedElement);
+ if (result == null) result = caseNamedElement(typedElement);
+ if (result == null) result = defaultCase(theEObject);
+ return result;
+ }
+ case ResourcePackage.SERVICE: {
+ Service service = (Service)theEObject;
+ T result = caseService(service);
+ if (result == null) result = caseNamedElement(service);
+ if (result == null) result = defaultCase(theEObject);
+ return result;
+ }
+ case ResourcePackage.RESOURCE: {
+ Resource resource = (Resource)theEObject;
+ T result = caseResource(resource);
+ if (result == null) result = caseNamedElement(resource);
+ if (result == null) result = defaultCase(theEObject);
+ return result;
+ }
+ case ResourcePackage.PROPERTY: {
+ Property property = (Property)theEObject;
+ T result = caseProperty(property);
+ if (result == null) result = caseResource(property);
+ if (result == null) result = caseNamedElement(property);
+ if (result == null) result = defaultCase(theEObject);
+ return result;
+ }
+ case ResourcePackage.SENSOR_DATA: {
+ SensorData sensorData = (SensorData)theEObject;
+ T result = caseSensorData(sensorData);
+ if (result == null) result = caseResource(sensorData);
+ if (result == null) result = caseNamedElement(sensorData);
+ if (result == null) result = defaultCase(theEObject);
+ return result;
+ }
+ case ResourcePackage.STATE_VARIABLE: {
+ StateVariable stateVariable = (StateVariable)theEObject;
+ T result = caseStateVariable(stateVariable);
+ if (result == null) result = caseResource(stateVariable);
+ if (result == null) result = caseNamedElement(stateVariable);
+ if (result == null) result = defaultCase(theEObject);
+ return result;
+ }
+ case ResourcePackage.ACTION: {
+ Action action = (Action)theEObject;
+ T result = caseAction(action);
+ if (result == null) result = caseResource(action);
+ if (result == null) result = caseNamedElement(action);
+ if (result == null) result = defaultCase(theEObject);
+ return result;
+ }
+ case ResourcePackage.ATTRIBUTE: {
+ Attribute attribute = (Attribute)theEObject;
+ T result = caseAttribute(attribute);
+ if (result == null) result = caseTypedElement(attribute);
+ if (result == null) result = caseNamedElement(attribute);
+ if (result == null) result = defaultCase(theEObject);
+ return result;
+ }
+ case ResourcePackage.METADATA: {
+ Metadata metadata = (Metadata)theEObject;
+ T result = caseMetadata(metadata);
+ if (result == null) result = caseTypedElement(metadata);
+ if (result == null) result = caseNamedElement(metadata);
+ if (result == null) result = defaultCase(theEObject);
+ return result;
+ }
+ case ResourcePackage.ACCESS_METHOD: {
+ AccessMethod accessMethod = (AccessMethod)theEObject;
+ T result = caseAccessMethod(accessMethod);
+ if (result == null) result = defaultCase(theEObject);
+ return result;
+ }
+ case ResourcePackage.PARAMETER: {
+ Parameter parameter = (Parameter)theEObject;
+ T result = caseParameter(parameter);
+ if (result == null) result = caseTypedElement(parameter);
+ if (result == null) result = caseNamedElement(parameter);
+ if (result == null) result = defaultCase(theEObject);
+ return result;
+ }
+ case ResourcePackage.GATEWAY: {
+ Gateway gateway = (Gateway)theEObject;
+ T result = caseGateway(gateway);
+ if (result == null) result = caseNamedElement(gateway);
+ if (result == null) result = defaultCase(theEObject);
+ return result;
+ }
+ default: return defaultCase(theEObject);
+ }
+ }
+
+ /**
+ * Returns the result of interpreting the object as an instance of '<em>Studio</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>Studio</em>'.
+ * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+ * @generated
+ */
+ public T caseStudio(Studio object) {
+ return null;
+ }
+
+ /**
+ * Returns the result of interpreting the object as an instance of '<em>Device</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>Device</em>'.
+ * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+ * @generated
+ */
+ public T caseDevice(Device object) {
+ return null;
+ }
+
+ /**
+ * Returns the result of interpreting the object as an instance of '<em>Named Element</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 Element</em>'.
+ * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+ * @generated
+ */
+ public T caseNamedElement(NamedElement object) {
+ return null;
+ }
+
+ /**
+ * Returns the result of interpreting the object as an instance of '<em>Typed Element</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 Element</em>'.
+ * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+ * @generated
+ */
+ public T caseTypedElement(TypedElement object) {
+ return null;
+ }
+
+ /**
+ * Returns the result of interpreting the object as an instance of '<em>Service</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>Service</em>'.
+ * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+ * @generated
+ */
+ public T caseService(Service object) {
+ return null;
+ }
+
+ /**
+ * Returns the result of interpreting the object as an instance of '<em>Resource</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>Resource</em>'.
+ * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+ * @generated
+ */
+ public T caseResource(Resource object) {
+ return null;
+ }
+
+ /**
+ * Returns the result of interpreting the object as an instance of '<em>Property</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>Property</em>'.
+ * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+ * @generated
+ */
+ public T caseProperty(Property object) {
+ return null;
+ }
+
+ /**
+ * Returns the result of interpreting the object as an instance of '<em>Sensor Data</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>Sensor Data</em>'.
+ * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+ * @generated
+ */
+ public T caseSensorData(SensorData object) {
+ return null;
+ }
+
+ /**
+ * Returns the result of interpreting the object as an instance of '<em>State Variable</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>State Variable</em>'.
+ * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+ * @generated
+ */
+ public T caseStateVariable(StateVariable object) {
+ return null;
+ }
+
+ /**
+ * Returns the result of interpreting the object as an instance of '<em>Action</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>Action</em>'.
+ * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+ * @generated
+ */
+ public T caseAction(Action object) {
+ return null;
+ }
+
+ /**
+ * Returns the result of interpreting the object as an instance of '<em>Attribute</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>Attribute</em>'.
+ * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+ * @generated
+ */
+ public T caseAttribute(Attribute object) {
+ return null;
+ }
+
+ /**
+ * Returns the result of interpreting the object as an instance of '<em>Metadata</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>Metadata</em>'.
+ * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+ * @generated
+ */
+ public T caseMetadata(Metadata object) {
+ return null;
+ }
+
+ /**
+ * Returns the result of interpreting the object as an instance of '<em>Access Method</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>Access Method</em>'.
+ * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+ * @generated
+ */
+ public T caseAccessMethod(AccessMethod object) {
+ return null;
+ }
+
+ /**
+ * Returns the result of interpreting the object as an instance of '<em>Parameter</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>Parameter</em>'.
+ * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+ * @generated
+ */
+ public T caseParameter(Parameter object) {
+ return null;
+ }
+
+ /**
+ * Returns the result of interpreting the object as an instance of '<em>Gateway</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>Gateway</em>'.
+ * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+ * @generated
+ */
+ public T caseGateway(Gateway 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;
+ }
+
+} //ResourceSwitch
diff --git a/services/org.eclipse.sensinact.studio.model.resource/src/org/eclipse/sensinact/studio/model/resource/utils/Constants.java b/services/org.eclipse.sensinact.studio.model.resource/src/org/eclipse/sensinact/studio/model/resource/utils/Constants.java
new file mode 100644
index 0000000..d8b2a8e
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource/src/org/eclipse/sensinact/studio/model/resource/utils/Constants.java
@@ -0,0 +1,30 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+
+package org.eclipse.sensinact.studio.model.resource.utils;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class Constants {
+
+ public static final ResourceDescriptor createLastEventRD(String gatewayID) {
+ return new ResourceDescriptor(gatewayID, "sensiNact", "system", "event");
+ }
+
+ public static final ResourceDescriptor createInstallAppRD(String gatewayID) {
+ return new ResourceDescriptor(gatewayID, "AppManager", "admin", "INSTALL");
+ }
+
+ public static final ResourceDescriptor createUninstallAppRD(String gatewayID) {
+ return new ResourceDescriptor(gatewayID, "AppManager", "admin", "UNINSTALL");
+ }
+}
diff --git a/services/org.eclipse.sensinact.studio.model.resource/src/org/eclipse/sensinact/studio/model/resource/utils/DeviceDescriptor.java b/services/org.eclipse.sensinact.studio.model.resource/src/org/eclipse/sensinact/studio/model/resource/utils/DeviceDescriptor.java
new file mode 100644
index 0000000..cb32332
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource/src/org/eclipse/sensinact/studio/model/resource/utils/DeviceDescriptor.java
@@ -0,0 +1,68 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.model.resource.utils;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class DeviceDescriptor {
+
+ private final String gateway;
+ private final String device;
+
+ public DeviceDescriptor(String gateway, String device) {
+ this.gateway = gateway;
+ this.device = device;
+ }
+
+ public String getGateway() {
+ return gateway;
+ }
+
+ public String getDevice() {
+ return device;
+ }
+
+ @Override
+ public String toString() {
+ return getGateway() + "/" + getDevice();
+ }
+
+ public boolean equals(Object other) {
+ if (this == other)
+ return true;
+ if (!(other instanceof ResourceDescriptor))
+ return false;
+ final ResourceDescriptor that = (ResourceDescriptor) other;
+ return eqStr(this.getGateway(), that.getGateway()) && eqStr(this.getDevice(), that.getDevice());
+ }
+
+ public int hashCode() {
+ return hash(gateway) * hash(device);
+ }
+
+ private boolean eqStr(String str1, String str2) {
+ if (str1 == null)
+ if (str2 == null)
+ return true;
+ else
+ return false;
+ else
+ return str1.equals(str2);
+ }
+
+ private int hash(String str) {
+ if (str == null)
+ return 2;
+ else
+ return str.hashCode();
+ }
+}
diff --git a/services/org.eclipse.sensinact.studio.model.resource/src/org/eclipse/sensinact/studio/model/resource/utils/GPScoordinates.java b/services/org.eclipse.sensinact.studio.model.resource/src/org/eclipse/sensinact/studio/model/resource/utils/GPScoordinates.java
new file mode 100644
index 0000000..644d6d9
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource/src/org/eclipse/sensinact/studio/model/resource/utils/GPScoordinates.java
@@ -0,0 +1,70 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.model.resource.utils;
+
+import javax.naming.directory.InvalidAttributesException;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class GPScoordinates {
+
+ private final double lat;
+ private final double lng;
+
+ public GPScoordinates(double lat, double lng) {
+ this.lat = lat;
+ this.lng = lng;
+ }
+
+ /**
+ *
+ * @param coords expected format is two flots separated by a ','. ie "3.1245,4.365212"
+ * @throws InvalidAttributesException
+ */
+ public GPScoordinates(String coords) throws InvalidAttributesException {
+ try {
+ coords = coords.replace(':', ',');
+ final String[] coordinates = coords.split(",");
+ lat = Double.valueOf(coordinates[0].trim());
+ lng = Double.valueOf(coordinates[1].trim());
+ } catch (Exception e) {
+ throw new InvalidAttributesException("Can't convert " + coords + " into gps coordinates");
+ }
+ }
+
+ public double getLat() {
+ return lat;
+ }
+
+ public double getLng() {
+ return lng;
+ }
+
+ @Override
+ public String toString() {
+ return "[" + lat + "," + lng + "]";
+ }
+
+ public boolean equals(Object other) {
+ if (this == other)
+ return true;
+ if (!(other instanceof GPScoordinates))
+ return false;
+ final GPScoordinates that = (GPScoordinates) other;
+ return this.getLat() == that.getLat() && this.getLng() == that.getLng();
+ }
+
+ public int hashCode() {
+ // basic hash, only with lat
+ return new Double(lat).hashCode();
+ }
+}
diff --git a/services/org.eclipse.sensinact.studio.model.resource/src/org/eclipse/sensinact/studio/model/resource/utils/JsonUtil.java b/services/org.eclipse.sensinact.studio.model.resource/src/org/eclipse/sensinact/studio/model/resource/utils/JsonUtil.java
new file mode 100644
index 0000000..01f7de8
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource/src/org/eclipse/sensinact/studio/model/resource/utils/JsonUtil.java
@@ -0,0 +1,194 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.model.resource.utils;
+
+import java.math.BigDecimal;
+import java.util.Iterator;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class JsonUtil {
+
+ public static final String NAME_KEY = "name";
+ public static final String TYPE_KEY = "type";
+ public static final String VALUE_KEY = "value";
+
+ public static JSONObject createObject(Object... keysValues) throws JSONException {
+ JSONObject retval = new JSONObject();
+
+ for (int i = 0; i < keysValues.length; i += 2) {
+ retval.put((String) keysValues[i], keysValues[i + 1]);
+ }
+
+ return retval;
+ }
+
+ public static JSONArray createArray(Object... elements) throws JSONException {
+ JSONArray jsonArray = new JSONArray();
+ for (Object element : elements) {
+ jsonArray.put(element);
+ }
+ return jsonArray;
+ }
+
+ public static JSONObject createNameTypeValue(String name, String type, Object value) throws JSONException {
+ JSONObject retval = new JSONObject();
+
+ if (value == null)
+ throw new RuntimeException("value is null (name=" + name + " type=" + type + ")");
+
+ // Types definition
+ final String intType = int.class.toString(); // int
+ final String integerType = Integer.class.getName(); // java.lang.Integer
+ final String bigDecimalType = BigDecimal.class.getName(); // java.math.BigDecimal
+ final String doubleType = double.class.toString(); // double
+ final String objectDoubleType = Double.class.getName(); // java.lang.Double
+ final String booleanType = boolean.class.toString(); // boolean
+ final String objectBooleanType = Boolean.class.getName(); // java.lang.Boolean
+ final String stringType = String.class.getName(); // java.lang.String
+ final String JSONObjectType = JSONObject.class.getName(); // org.json.JSONObject
+
+ retval.put(NAME_KEY, name);
+
+ // Integer
+ if (intType.equals(type) || integerType.equals(type) || bigDecimalType.equals(type)) {
+ retval.put(TYPE_KEY, integerType);
+ if (value instanceof Integer) {
+ retval.put(VALUE_KEY, ((Integer) value).intValue());
+ return retval;
+ } else if (value instanceof String) {
+ retval.put(VALUE_KEY, Integer.parseInt((String) value));
+ return retval;
+ } else if (value instanceof BigDecimal) {
+ retval.put(VALUE_KEY, ((BigDecimal) value).intValue());
+ return retval;
+ } else {
+ throw new RuntimeException("expected type is " + type + " but value is of type " + value.getClass().getName());
+ }
+ }
+
+ // Double
+ if (doubleType.equals(type) || objectDoubleType.equals(type)) {
+ retval.put(TYPE_KEY, objectDoubleType);
+ if (value instanceof Double) {
+ retval.put(VALUE_KEY, ((Double) value).doubleValue());
+ return retval;
+ } else if (value instanceof BigDecimal) {
+ retval.put(VALUE_KEY, ((BigDecimal) value).doubleValue());
+ return retval;
+ } else if (value instanceof String) {
+ retval.put(VALUE_KEY, Double.parseDouble((String) value));
+ return retval;
+ } else {
+ throw new RuntimeException("expected type is " + type + " but value is of type " + value.getClass().getName());
+ }
+ }
+
+ // Boolean
+ if (booleanType.equals(type) || objectBooleanType.equals(type)) {
+ retval.put(TYPE_KEY, objectBooleanType);
+ if (value instanceof Boolean) {
+ retval.put(VALUE_KEY, ((Boolean) value).booleanValue());
+ return retval;
+ } else if (value instanceof String) {
+ retval.put(VALUE_KEY, Boolean.parseBoolean((String) value));
+ return retval;
+ } else {
+ throw new RuntimeException("expected type is " + type + " but value is of type " + value.getClass().getCanonicalName());
+ }
+ }
+
+ // String
+ if (stringType.equals(type) || "string".equals(type)) {
+ retval.put(TYPE_KEY, stringType);
+ if (value instanceof String) {
+ String val = (String) value;
+ if (val.length() >= 2) {
+ if ((val.startsWith("\"") && val.endsWith("\"")) || (val.startsWith("'") && val.endsWith("'"))) {
+ val = val.substring(1, val.length() - 1);
+ }
+ }
+ retval.put(VALUE_KEY, val);
+ return retval;
+ } else {
+ throw new RuntimeException("expected type is " + type + " but value is of type " + value.getClass().getCanonicalName());
+ }
+ }
+
+ // JSON Object
+ if (JSONObjectType.equals(type)) {
+ retval.put(TYPE_KEY, JSONObjectType);
+ if (value instanceof JSONObject) {
+ retval.put(VALUE_KEY, (JSONObject) value);
+ return retval;
+ } else if (value instanceof String) {
+ retval.put(VALUE_KEY, new JSONObject((String) value));
+ return retval;
+ } else {
+ throw new RuntimeException("expected type is " + type + " but value is of type " + value.getClass().getCanonicalName());
+ }
+ }
+
+ // Other...
+ throw new RuntimeException("Should never happen");
+ }
+
+ public static String prettyPrintJsonArray(JSONArray array, boolean fullMessage) {
+ StringBuilder sb = new StringBuilder();
+
+ try {
+ if (array.length() == 0) {
+ sb.append("<empty array>");
+ } else if (array.length() == 1) {
+ sb.append("1 element : ");
+ sb.append(array.getString(0));
+ } else {
+ sb.append(array.length() + " elements");
+ if (fullMessage) {
+ for (int i = 0; i < array.length(); i++) {
+ sb.append("\n * " + array.getString(i));
+ }
+ }
+ }
+ } catch (JSONException e) {
+ return "<Error during JSON decoding>";
+ }
+
+ return sb.toString();
+ }
+
+ public static String prettyPrintJsonObject(JSONObject object) {
+ StringBuilder sb = new StringBuilder();
+
+ try {
+ boolean begin = true;
+ Iterator<?> keys = object.keys();
+ while (keys.hasNext()) {
+ String key = (String) keys.next();
+ String value = object.get(key).toString();
+ if (begin)
+ begin = false;
+ else
+ sb.append("\n");
+ sb.append(" * ").append(key).append(" = ").append(value);
+ }
+ } catch (JSONException e) {
+ return "<Error during JSON decoding>";
+ }
+
+ return sb.toString();
+ }
+}
diff --git a/services/org.eclipse.sensinact.studio.model.resource/src/org/eclipse/sensinact/studio/model/resource/utils/ResourceDescriptor.java b/services/org.eclipse.sensinact.studio.model.resource/src/org/eclipse/sensinact/studio/model/resource/utils/ResourceDescriptor.java
new file mode 100644
index 0000000..15011ce
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource/src/org/eclipse/sensinact/studio/model/resource/utils/ResourceDescriptor.java
@@ -0,0 +1,104 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.model.resource.utils;
+
+
+/**
+ * @author Etienne Gandrille
+ */
+public class ResourceDescriptor {
+
+ private final String gateway;
+ private final String device;
+ private final String service;
+ private final String resource;
+
+ public ResourceDescriptor(String gateway, String device, String service, String resource) {
+ this.gateway = gateway;
+ this.device = device;
+ this.service = service;
+ this.resource = resource;
+ }
+
+ public ResourceDescriptor(String text) {
+ // The substring removes the prefix and suffix used to refer to a resource in the SNA DSL, respectively remove the '[' and ']'.
+ text = text.trim();
+ if (text.startsWith("/") || text.startsWith("["))
+ text = text.substring(1);
+ if (text.endsWith("/") || text.endsWith("]"))
+ text = text.substring(0, text.length()-1);
+
+ String[] tokens = text.split("/");
+ if (tokens.length != 4 && tokens.length != 5)
+ throw new RuntimeException("Parsing fail while building ResourceDescriptor");
+
+ this.gateway = tokens[0];
+ this.device = tokens[1];
+ this.service = tokens[2];
+ this.resource = tokens[3];
+ }
+
+ public DeviceDescriptor toDeviceDescriptor() {
+ return new DeviceDescriptor(gateway, device);
+ }
+
+ public String getDevice() {
+ return device;
+ }
+
+ public String getService() {
+ return service;
+ }
+
+ public String getResource() {
+ return resource;
+ }
+
+ public String getGateway() {
+ return gateway;
+ }
+
+ @Override
+ public String toString() {
+ return getGateway() + "/" + getDevice() + "/" + getService() + "/" + getResource();
+ }
+
+ public boolean equals(Object other) {
+ if (this == other)
+ return true;
+ if (!(other instanceof ResourceDescriptor))
+ return false;
+ final ResourceDescriptor that = (ResourceDescriptor) other;
+ return eqStr(this.getGateway(), that.getGateway()) && eqStr(this.getDevice(), that.getDevice()) && eqStr(this.getService(), that.getService())
+ && eqStr(this.getResource(), that.getResource());
+ }
+
+ public int hashCode() {
+ return hash(gateway) * hash(device) * hash(service) * hash(resource);
+ }
+
+ private boolean eqStr(String str1, String str2) {
+ if (str1 == null)
+ if (str2 == null)
+ return true;
+ else
+ return false;
+ else
+ return str1.equals(str2);
+ }
+
+ private int hash(String str) {
+ if (str == null)
+ return 2;
+ else
+ return str.hashCode();
+ }
+}
diff --git a/services/org.eclipse.sensinact.studio.model.resource/src/org/eclipse/sensinact/studio/model/resource/utils/Segments.java b/services/org.eclipse.sensinact.studio.model.resource/src/org/eclipse/sensinact/studio/model/resource/utils/Segments.java
new file mode 100644
index 0000000..7e13ac1
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.resource/src/org/eclipse/sensinact/studio/model/resource/utils/Segments.java
@@ -0,0 +1,212 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+
+package org.eclipse.sensinact.studio.model.resource.utils;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.restlet.resource.ClientResource;
+
+import org.eclipse.sensinact.studio.resource.AccessMethodType;
+
+/**
+ * This class is used to represents a REST path in the sensinact API.
+ * For any refactoring in the rest API, just update this (and only this)
+ * class.
+ *
+ * There is a nested class, called Builder, which goal is to build
+ * Segment instance, checking if constraints are satisfied.
+ * @author Etienne Gandrille
+ */
+public class Segments {
+
+ private final List<String> segments;
+ private final String gateway;
+
+ private static final String ROOT_SEGMENT = "sensinact";
+ private static final String PROVIDERS = "providers";
+ private static final String SERVICES = "services";
+ private static final String RESOURCES = "resources";
+
+ private Segments(String gateway, List<String> segments) {
+ this.gateway = gateway;
+ this.segments = segments;
+ }
+
+ public void addToClientResource(ClientResource clientResource) {
+ for (String segment : segments) {
+ clientResource.addSegment(segment);
+ }
+ }
+
+ public String getGateway() {
+ return gateway;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ for (String seg : segments) {
+ sb.append("/");
+ sb.append(seg);
+ }
+ return sb.toString();
+ }
+
+ public static class Builder {
+
+ public Builder() {
+ }
+
+ public BuilderGateway gateway(String gatewayName) {
+ return new BuilderGateway(gatewayName);
+ }
+
+ public BuilderResouce resource(ResourceDescriptor resource) {
+ String gateway = resource.getGateway();
+ String device = resource.getDevice();
+ String service = resource.getService();
+ String res = resource.getResource();
+
+ return new BuilderResouce(gateway, device, service, res);
+ }
+
+ public BuilderDevice device(DeviceDescriptor descriptor) {
+ return new BuilderDevice(descriptor.getGateway(), descriptor.getDevice());
+ }
+
+ }
+
+ public static class BuilderGateway {
+ private final String gateway;
+ public BuilderGateway(String gateway) {
+ this.gateway = gateway;
+ }
+
+ public BuilderDevice device(String deviceId) {
+ return new BuilderDevice(gateway, deviceId);
+ }
+
+ public BuilderLocation locations() {
+ return new BuilderLocation(gateway);
+ }
+
+ public BuilderReady devices() {
+ return new BuilderReady(gateway, ROOT_SEGMENT, PROVIDERS);
+ }
+ public BuilderJsonPath jsonpath(DeviceDescriptor descriptor) {
+ return new BuilderJsonPath(descriptor.getGateway(), descriptor.getDevice());
+ }
+ }
+
+ public static class BuilderDevice {
+ private final String gateway;
+ private final String device;
+ public BuilderDevice(String gateway, String device) {
+ this.gateway = gateway;
+ this.device = device;
+ }
+
+ public BuilderReady services() {
+ return new BuilderReady(gateway, ROOT_SEGMENT, PROVIDERS, device, SERVICES);
+ }
+
+ public BuilderService service(String serviceId) {
+ return new BuilderService(gateway, device, serviceId);
+ }
+ }
+
+ public static class BuilderJsonPath {
+ private final String gateway;
+ private final String device;
+ public BuilderJsonPath(String gateway,String device) {
+ this.gateway = gateway;
+ this.device=device;
+ }
+
+ public BuilderReady getResult() {
+ return new BuilderReady(gateway, "jsonpath", "filter");
+ }
+ }
+
+ public static class BuilderLocation {
+ private final String gateway;
+ public BuilderLocation(String gateway) {
+ this.gateway = gateway;
+ }
+
+ public BuilderReady getLocations() {
+ return new BuilderReady(gateway, "jsonpath", "location","GET");
+ }
+ }
+
+ public static class BuilderService {
+ private final String gateway;
+ private final String device;
+ private final String service;
+ public BuilderService(String gateway, String device, String service) {
+ this.gateway = gateway;
+ this.device = device;
+ this.service = service;
+ }
+
+ public BuilderReady resources() {
+ return new BuilderReady(gateway, ROOT_SEGMENT, PROVIDERS, device, SERVICES, service, RESOURCES);
+ }
+
+ public BuilderResouce resource(String resource) {
+ return new BuilderResouce(gateway, device, service, resource);
+ }
+ }
+
+ public static class BuilderResouce {
+ private final String gateway;
+ private final String device;
+ private final String service;
+ private final String resource;
+
+ public BuilderResouce(String gateway, String device, String service, String resource) {
+ this.gateway = gateway;
+ this.device = device;
+ this.service = service;
+ this.resource = resource;
+ }
+
+ public Segments build() {
+ return new BuilderReady(gateway, ROOT_SEGMENT, PROVIDERS, device, SERVICES, service, RESOURCES, resource).build();
+ }
+
+ public BuilderReady method(AccessMethodType access) {
+ return new BuilderReady(gateway, ROOT_SEGMENT, PROVIDERS, device, SERVICES, service, RESOURCES, resource, access.getName());
+ }
+ }
+
+ public static class BuilderReady {
+ private final List<String> segments;
+ private final String gateway;
+
+ private BuilderReady(String gateway, String... segments) {
+ this.gateway = gateway;
+ this.segments = Arrays.asList(segments);
+ if (this.segments.size() == 0)
+ throw new IllegalArgumentException("no segments available");
+ for (String segment : segments) {
+ if (segment == null || segment.isEmpty())
+ throw new IllegalArgumentException("a segment is null or empty");
+ }
+ }
+
+ public Segments build() {
+ return new Segments(gateway, segments);
+ }
+ }
+}
diff --git a/services/org.eclipse.sensinact.studio.preferences/META-INF/MANIFEST.MF b/services/org.eclipse.sensinact.studio.preferences/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..5cbc83e
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.preferences/META-INF/MANIFEST.MF
@@ -0,0 +1,11 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Preferences
+Bundle-SymbolicName: org.eclipse.sensinact.studio.preferences
+Bundle-Version: 1.0.0.qualifier
+Bundle-Activator: org.eclipse.sensinact.studio.preferences.Activator
+Require-Bundle: org.eclipse.core.runtime
+Bundle-RequiredExecutionEnvironment: JavaSE-1.7
+Bundle-ActivationPolicy: lazy
+Import-Package: org.apache.log4j
+Export-Package: org.eclipse.sensinact.studio.preferences
diff --git a/services/org.eclipse.sensinact.studio.preferences/about.html b/services/org.eclipse.sensinact.studio.preferences/about.html
new file mode 100644
index 0000000..3b39f88
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.preferences/about.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"><head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 5, 2006</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+
+</body></html>
\ No newline at end of file
diff --git a/services/org.eclipse.sensinact.studio.preferences/build.properties b/services/org.eclipse.sensinact.studio.preferences/build.properties
new file mode 100644
index 0000000..f489d86
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.preferences/build.properties
@@ -0,0 +1,15 @@
+#
+# Copyright (c) 2017 CEA.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+# CEA - initial API and implementation and/or initial documentation
+#
+
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .
diff --git a/services/org.eclipse.sensinact.studio.preferences/src/org/eclipse/sensinact/studio/preferences/Activator.java b/services/org.eclipse.sensinact.studio.preferences/src/org/eclipse/sensinact/studio/preferences/Activator.java
new file mode 100644
index 0000000..ac9d267
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.preferences/src/org/eclipse/sensinact/studio/preferences/Activator.java
@@ -0,0 +1,40 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.preferences;
+
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+public class Activator implements BundleActivator {
+
+ private static BundleContext context;
+
+ static BundleContext getContext() {
+ return context;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
+ */
+ public void start(BundleContext bundleContext) throws Exception {
+ Activator.context = bundleContext;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
+ */
+ public void stop(BundleContext bundleContext) throws Exception {
+ Activator.context = null;
+ }
+
+}
diff --git a/services/org.eclipse.sensinact.studio.preferences/src/org/eclipse/sensinact/studio/preferences/ConfigurationListerner.java b/services/org.eclipse.sensinact.studio.preferences/src/org/eclipse/sensinact/studio/preferences/ConfigurationListerner.java
new file mode 100644
index 0000000..880bc62
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.preferences/src/org/eclipse/sensinact/studio/preferences/ConfigurationListerner.java
@@ -0,0 +1,20 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.preferences;
+
+public interface ConfigurationListerner {
+
+ void gatewayAddedOrUpdatedNotif(GatewayHttpConfig gateway);
+
+ void gatewayRemovedNotif(String name);
+
+ void studioPortUpdatedNotif(int port);
+}
diff --git a/services/org.eclipse.sensinact.studio.preferences/src/org/eclipse/sensinact/studio/preferences/ConfigurationManager.java b/services/org.eclipse.sensinact.studio.preferences/src/org/eclipse/sensinact/studio/preferences/ConfigurationManager.java
new file mode 100644
index 0000000..c26dfac
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.preferences/src/org/eclipse/sensinact/studio/preferences/ConfigurationManager.java
@@ -0,0 +1,193 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.preferences;
+
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.osgi.service.prefs.BackingStoreException;
+import org.osgi.service.prefs.Preferences;
+import org.apache.log4j.Logger;
+import org.eclipse.core.runtime.preferences.ConfigurationScope;
+import org.eclipse.core.runtime.preferences.IEclipsePreferences;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class ConfigurationManager {
+
+ private static String NODE = ConfigurationManager.class.getName();
+ private static String GATEWAYS_NODE = "gateway";
+ private static String STUDIO_NODE = "studio";
+ private static String ADDRESS_KEY = "address";
+ private static String PORT_KEY = "port";
+ private static String TIMEOUT_KEY = "timeout";
+ private static String USERNAME_KEY = "username";
+ private static String PASSWORD_KEY = "password";
+
+ private static final Logger logger = Logger.getLogger(ConfigurationManager.class);
+
+ public static final List<ConfigurationListerner> listeners = new ArrayList<>();
+
+ private ConfigurationManager() {
+ }
+
+ /* ========= */
+ /* LISTENERS */
+ /* ========= */
+
+ public static void addListener(ConfigurationListerner listener) {
+ listeners.add(listener);
+ }
+
+ public static void removeListener(ConfigurationListerner listener) {
+ listeners.remove(listener);
+ }
+
+ /* ======= */
+ /* GETTERS */
+ /* ======= */
+
+ public static GatewayHttpConfig[] getGateways() {
+ List<GatewayHttpConfig> gateways = new ArrayList<GatewayHttpConfig>();
+
+ IEclipsePreferences root = ConfigurationScope.INSTANCE.getNode(NODE);
+ Preferences gatewaysNode = root.node(GATEWAYS_NODE);
+
+ try {
+ for (String name : gatewaysNode.childrenNames()) {
+ Preferences gwPref = gatewaysNode.node(name);
+ String address = gwPref.get(ADDRESS_KEY, "");
+ int port = gwPref.getInt(PORT_KEY, 0);
+ int timeout = gwPref.getInt(TIMEOUT_KEY, 0);
+ String username = gwPref.get(USERNAME_KEY, "");
+ String password = gwPref.get(PASSWORD_KEY, "");
+
+ try {
+ GatewayHttpConfig gateway = new GatewayHttpConfig(name, address, port, timeout, username, password);
+ gateways.add(gateway);
+ } catch (IllegalArgumentException e) {
+ // ignore
+ }
+ }
+ } catch (BackingStoreException e) {
+ logger.error("Preferences read failed", e);
+ }
+
+ return gateways.toArray(new GatewayHttpConfig[0]);
+ }
+
+ public static String[] getGatewayNames() {
+ List<String> names = new ArrayList<>();
+
+ for (GatewayHttpConfig gateway : getGateways())
+ names.add(gateway.getName());
+
+ return names.toArray(new String[0]);
+ }
+
+ public static GatewayHttpConfig getGateway(String name) {
+ for (GatewayHttpConfig gateway : getGateways())
+ if (gateway.getName().equals(name))
+ return gateway;
+ return null;
+ }
+
+
+
+ public static int getStudioPort() {
+ IEclipsePreferences root = ConfigurationScope.INSTANCE.getNode(NODE);
+ Preferences studioNode = root.node(STUDIO_NODE);
+ return studioNode.getInt(PORT_KEY, 8081);
+ }
+
+ /* ======= */
+ /* UPDATES */
+ /* ======= */
+
+ public static boolean addGateway(GatewayHttpConfig gateway) {
+
+ IEclipsePreferences root = ConfigurationScope.INSTANCE.getNode(NODE);
+ Preferences gatewaysNode = root.node(GATEWAYS_NODE);
+
+ Preferences curGatewayNode = gatewaysNode.node(gateway.getName());
+ curGatewayNode.put(ADDRESS_KEY, gateway.getURL().getHost());
+ curGatewayNode.putInt(PORT_KEY, gateway.getURL().getPort());
+ curGatewayNode.putInt(TIMEOUT_KEY, gateway.getTimeout());
+ curGatewayNode.put(USERNAME_KEY, gateway.getUsername());
+ curGatewayNode.put(PASSWORD_KEY, gateway.getPassword());
+
+ try {
+ root.flush();
+ } catch (BackingStoreException e) {
+ logger.error("Preferences write failed", e);
+ return false;
+ }
+ logger.info("Preferences write success");
+
+ gatewayAddedOrUpdated(gateway);
+
+ return true;
+ }
+
+ private static void gatewayAddedOrUpdated(GatewayHttpConfig gateway) {
+ for (ConfigurationListerner listener : listeners)
+ listener.gatewayAddedOrUpdatedNotif(gateway);
+ }
+
+ public static boolean removeGateway(String name) {
+ IEclipsePreferences root = ConfigurationScope.INSTANCE.getNode(NODE);
+ Preferences gatewaysNode = root.node(GATEWAYS_NODE);
+
+ try {
+ gatewaysNode.node(name).clear();
+ root.flush();
+ } catch (BackingStoreException e) {
+ logger.error("Preferences remove failed", e);
+ return false;
+ }
+ logger.trace("Preferences remove success");
+
+ gatewayRemoved(name);
+
+ return true;
+ }
+
+ private static void gatewayRemoved(String name) {
+ for (ConfigurationListerner listener : listeners)
+ listener.gatewayRemovedNotif(name);
+ }
+
+ public static boolean setStudioPort(int port) {
+ IEclipsePreferences root = ConfigurationScope.INSTANCE.getNode(NODE);
+ Preferences studioNode = root.node(STUDIO_NODE);
+
+ studioNode.putInt(PORT_KEY, port);
+
+ try {
+ root.flush();
+ } catch (BackingStoreException e) {
+ logger.error("Preferences write failed", e);
+ return false;
+ }
+ logger.info("Preferences write success");
+
+ studioPortUpdated(port);
+
+ return true;
+ }
+
+ private static void studioPortUpdated(int port) {
+ for (ConfigurationListerner listener : listeners)
+ listener.studioPortUpdatedNotif(port);
+ }
+}
diff --git a/services/org.eclipse.sensinact.studio.preferences/src/org/eclipse/sensinact/studio/preferences/GatewayHttpConfig.java b/services/org.eclipse.sensinact.studio.preferences/src/org/eclipse/sensinact/studio/preferences/GatewayHttpConfig.java
new file mode 100644
index 0000000..8625191
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.preferences/src/org/eclipse/sensinact/studio/preferences/GatewayHttpConfig.java
@@ -0,0 +1,103 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+
+package org.eclipse.sensinact.studio.preferences;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class GatewayHttpConfig {
+
+ private final String name;
+ private final URL gatewayURL;
+ private final int timeout;
+ private final String username;
+ private final String password;
+
+ public GatewayHttpConfig(String name, String address, int port, int timeout, String username, String password) {
+ this(name, generateGatewayURL(address, port), timeout, username, password);
+ }
+
+ private static URL generateGatewayURL(String address, int port) {
+ if (address == null || address.isEmpty())
+ throw new IllegalArgumentException("address can't be null or empty");
+ if (address.startsWith("http://")) {
+ address = address.substring(7, address.length());
+ }
+
+ if (port <= 0)
+ throw new IllegalArgumentException("port must be positive");
+
+ try {
+ return new URL("http", address, port, "");
+ } catch (MalformedURLException e) {
+ throw new IllegalArgumentException("Malformed URL", e);
+ }
+ }
+
+ public GatewayHttpConfig(String name, URL gatewayURL, int timeout, String username, String password) {
+ if (name == null || name.isEmpty())
+ throw new IllegalArgumentException("name can't be null or empty");
+ this.name = name;
+
+ if (gatewayURL == null)
+ throw new IllegalArgumentException("gatewayURL can't be null");
+ this.gatewayURL = gatewayURL ;
+
+ if (timeout <= 0)
+ throw new IllegalArgumentException("timeout must be positive");
+ this.timeout = timeout;
+
+ this.username = username == null ? "" : username;
+ this.password = password == null ? "" : password;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public URL getURL() {
+ return gatewayURL;
+ }
+
+ public int getTimeout() {
+ return timeout;
+ }
+
+ public String getUsername() {
+ return username;
+ }
+
+ public String getPassword() {
+ return password;
+ }
+
+ @Override
+ public String toString() {
+ return gatewayURL.toString();
+ }
+
+ public boolean equals(Object other) {
+ if (this == other)
+ return true;
+ if (!(other instanceof GatewayHttpConfig))
+ return false;
+ final GatewayHttpConfig that = (GatewayHttpConfig) other;
+ return this.getTimeout() == that.getTimeout() && this.getURL() == that.getURL();
+ }
+
+ public int hashCode() {
+ return gatewayURL.hashCode() + timeout;
+ }
+}
diff --git a/services/org.eclipse.sensinact.studio.preferences/src/org/eclipse/sensinact/studio/preferences/StudioHttpConfig.java b/services/org.eclipse.sensinact.studio.preferences/src/org/eclipse/sensinact/studio/preferences/StudioHttpConfig.java
new file mode 100644
index 0000000..f560e82
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.preferences/src/org/eclipse/sensinact/studio/preferences/StudioHttpConfig.java
@@ -0,0 +1,131 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.preferences;
+
+import java.io.IOException;
+import java.net.Inet4Address;
+import java.net.Inet6Address;
+import java.net.InetAddress;
+import java.net.NetworkInterface;
+import java.net.SocketException;
+import java.net.URL;
+import java.util.Enumeration;
+
+import org.apache.log4j.Logger;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class StudioHttpConfig {
+
+ private final int port;
+ private final URL url;
+
+ private static final Logger logger = Logger.getLogger(StudioHttpConfig.class);
+
+ public StudioHttpConfig(GatewayHttpConfig gwConfig, int port) {
+ this.port = port;
+ URL url = null;
+ try {
+ url = computeStudioURL(port, gwConfig);
+ } catch (IOException e) {
+ logger.error("Can't compute studio URL");
+ }
+ this.url = url;
+ }
+
+ public int getPort() {
+ return port;
+ }
+
+ public URL getUrl() throws IOException {
+ if (isValid())
+ return url;
+ throw new IOException("Didn't mange to compute the Studio URL");
+ }
+
+ public boolean isValid() {
+ return url != null;
+ }
+
+ private static URL computeStudioURL(int studioPort, GatewayHttpConfig gwConfig) throws IOException {
+ try {
+ String gwHost = gwConfig.getURL().getHost();
+ InetAddress inetAddressGateway = InetAddress.getByName(gwHost);
+ String hostAddress = getHostAddress(inetAddressGateway, 1000);
+ return new URL("http", hostAddress, studioPort, "");
+ } catch (Exception e) {
+ throw new IOException("Can't compute studio URL", e);
+ }
+ }
+
+ private static String getHostAddress(InetAddress gatewayAddress, int timeout) throws SocketException, IOException {
+ Enumeration<NetworkInterface> localInterfaces = NetworkInterface.getNetworkInterfaces();
+ logger.info("Gateway address: " + gatewayAddress.getHostAddress());
+ while (localInterfaces.hasMoreElements()) {
+ NetworkInterface localInterface = localInterfaces.nextElement();
+ logger.info(" * Analyzing Interface: " + localInterface.getInterfaceAddresses());
+
+ Enumeration<InetAddress> addresses = localInterface.getInetAddresses();
+
+ if(localInterface.isUp())
+ while (addresses.hasMoreElements()) {
+ InetAddress address = addresses.nextElement();
+ logger.info(" - Verify IPv4: " + address.getHostAddress());
+ if (address instanceof Inet4Address) {
+ logger.debug(" - Checking IPv4 address: " + address);
+ Inet4Address ipv4 = (Inet4Address) address;
+ String retval = address.getHostAddress();
+ if (retval != null && ! retval.isEmpty() && gatewayAddress.isReachable(localInterface, 64, timeout)) {
+ logger.info("--> Selected for Studio IP --->"+retval);
+ return retval;
+ }
+ } else if (address instanceof Inet6Address) {
+ logger.debug(" - IPv6 address ignored: " + address);
+ }
+ }
+ }
+ throw new IOException("Can't compute studio IP address");
+ }
+
+ public boolean equals(Object other) {
+ if (this == other)
+ return true;
+ if (!(other instanceof StudioHttpConfig))
+ return false;
+ final StudioHttpConfig that = (StudioHttpConfig) other;
+
+ if (this.getPort() != that.getPort())
+ return false;
+
+ URL thisURL = null;
+ try {
+ thisURL = this.getUrl();
+ } catch (IOException e) {
+ // doNothing
+ }
+
+ URL thatURL = null;
+ try {
+ thatURL = that.getUrl();
+ } catch (IOException e) {
+ // doNothing
+ }
+
+ if (thisURL == null)
+ return thatURL == null;
+ return thisURL.equals(thatURL);
+ }
+
+ public int hashCode() {
+ return url.hashCode() % (port+7);
+ }
+}
diff --git a/ui/org.eclipse.sensinact.studio.navigator.device/META-INF/MANIFEST.MF b/ui/org.eclipse.sensinact.studio.navigator.device/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..e517cbd
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.navigator.device/META-INF/MANIFEST.MF
@@ -0,0 +1,25 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Sensinact Studio Device Navigator
+Bundle-SymbolicName: org.eclipse.sensinact.studio.navigator.device;singleton:=true
+Bundle-Version: 1.0.0.qualifier
+Bundle-Activator: org.eclipse.sensinact.studio.navigator.device.Activator
+Bundle-Vendor: CEA LETI
+Bundle-RequiredExecutionEnvironment: JavaSE-1.7
+Bundle-ActivationPolicy: lazy
+Require-Bundle: org.eclipse.ui.navigator,
+ org.eclipse.ui,
+ org.restlet,
+ org.eclipse.core.runtime,
+ org.eclipse.sensinact.studio.model.resource,
+ org.json,
+ org.eclipse.sensinact.studio.view.outdoor,
+ org.eclipse.sensinact.studio.http,
+ org.eclipse.sensinact.studio.model.manager,
+ org.apache.log4j,
+ org.eclipse.sensinact.studio.ui.common,
+ org.eclipse.emf.transaction,
+ org.eclipse.jface,
+ org.eclipse.sensinact.studio.preferences
+Export-Package: org.eclipse.sensinact.studio.navigator.device
+Import-Package: org.apache.log4j,org.eclipse.jetty.websocket.client,org.eclipse.jetty.websocket.api.annotations,org.eclipse.jetty.websocket.api,org.eclipse.jetty.util.component
diff --git a/ui/org.eclipse.sensinact.studio.navigator.device/about.html b/ui/org.eclipse.sensinact.studio.navigator.device/about.html
new file mode 100644
index 0000000..3b39f88
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.navigator.device/about.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"><head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 5, 2006</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+
+</body></html>
\ No newline at end of file
diff --git a/ui/org.eclipse.sensinact.studio.navigator.device/build.properties b/ui/org.eclipse.sensinact.studio.navigator.device/build.properties
new file mode 100644
index 0000000..833aa8b
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.navigator.device/build.properties
@@ -0,0 +1,20 @@
+#
+# Copyright (c) 2017 CEA.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+# CEA - initial API and implementation and/or initial documentation
+#
+
+source.. = src/
+bin.includes = plugin.xml,\
+ .,\
+ .project,\
+ icons/,\
+ .classpath,\
+ build.properties,\
+ META-INF/,\
+ .settings/
diff --git a/ui/org.eclipse.sensinact.studio.navigator.device/icons/add.png b/ui/org.eclipse.sensinact.studio.navigator.device/icons/add.png
new file mode 100644
index 0000000..b9f0ac6
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.navigator.device/icons/add.png
Binary files differ
diff --git a/ui/org.eclipse.sensinact.studio.navigator.device/icons/connect-icon.xcf b/ui/org.eclipse.sensinact.studio.navigator.device/icons/connect-icon.xcf
new file mode 100644
index 0000000..fd2d097
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.navigator.device/icons/connect-icon.xcf
Binary files differ
diff --git a/ui/org.eclipse.sensinact.studio.navigator.device/icons/connect.png b/ui/org.eclipse.sensinact.studio.navigator.device/icons/connect.png
new file mode 100644
index 0000000..582cb3b
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.navigator.device/icons/connect.png
Binary files differ
diff --git a/ui/org.eclipse.sensinact.studio.navigator.device/icons/disconnect.png b/ui/org.eclipse.sensinact.studio.navigator.device/icons/disconnect.png
new file mode 100644
index 0000000..7f23224
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.navigator.device/icons/disconnect.png
Binary files differ
diff --git a/ui/org.eclipse.sensinact.studio.navigator.device/icons/remove.png b/ui/org.eclipse.sensinact.studio.navigator.device/icons/remove.png
new file mode 100644
index 0000000..dbbc6c3
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.navigator.device/icons/remove.png
Binary files differ
diff --git a/ui/org.eclipse.sensinact.studio.navigator.device/plugin.xml b/ui/org.eclipse.sensinact.studio.navigator.device/plugin.xml
new file mode 100644
index 0000000..f1283ad
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.navigator.device/plugin.xml
@@ -0,0 +1,217 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Copyright (c) 2017 CEA.
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+
+ Contributors:
+ CEA - initial API and implementation and/or initial documentation
+
+-->
+<?eclipse version="3.4"?>
+<plugin>
+ <extension
+ point="org.eclipse.ui.views">
+ <view
+ category="org.eclipse.sensinact.studio.views.category"
+ class="org.eclipse.sensinact.studio.navigator.device.DeviceNavigatorFilterView"
+ id="org.eclipse.sensinact.studio.navigator.device"
+ name="Device Navigator"
+ restorable="true">
+ </view>
+ </extension>
+ <extension
+ point="org.eclipse.ui.navigator.navigatorContent">
+ <navigatorContent
+ activeByDefault="true"
+ contentProvider="org.eclipse.sensinact.studio.navigator.device.DeviceNavigatorContentProvider"
+ id="org.eclipse.sensinact.studio.navigator.device.navigatorContent"
+ labelProvider="org.eclipse.sensinact.studio.navigator.device.DeviceNavigatorLabelProvider"
+ name="Device Navigator Content"
+ priority="normal">
+ <triggerPoints>
+ <or>
+ <instanceof
+ value="org.eclipse.sensinact.studio.resource.Studio">
+ </instanceof>
+ </or>
+ </triggerPoints>
+ <possibleChildren>
+ <or>
+ <instanceof
+ value="org.eclipse.sensinact.studio.resource.Resource">
+ </instanceof>
+ <instanceof
+ value="org.eclipse.sensinact.studio.resource.Device">
+ </instanceof>
+ <instanceof
+ value="org.eclipse.sensinact.studio.resource.Service">
+ </instanceof>
+ <instanceof
+ value="org.eclipse.sensinact.studio.resource.Gateway">
+ </instanceof>
+ </or>
+ </possibleChildren>
+ <dropAssistant
+ class="org.eclipse.sensinact.studio.navigator.device.SensinactDropAdapterAssistant"
+ id="org.eclipse.sensinact.studio.navigator.device.SensinactDropAdapterAssistant">
+ <possibleDropTargets>
+ <with
+ variable="selection">
+ <iterate
+ ifEmpty="false"
+ operator="and">
+ <instanceof
+ value="org.eclipse.sensinact.studio.resource.Device">
+ </instanceof>
+ </iterate>
+ </with>
+ </possibleDropTargets>
+ </dropAssistant>
+ <commonSorter
+ class="org.eclipse.sensinact.studio.navigator.device.DeviceNavigatorSorter">
+ </commonSorter>
+ </navigatorContent>
+ </extension>
+ <extension
+ point="org.eclipse.ui.navigator.viewer">
+ <viewer
+ popupMenuId="org.eclipse.sensinact.studio.navigator.device"
+ viewerId="org.eclipse.sensinact.studio.navigator.device">
+ </viewer>
+ <viewerContentBinding
+ viewerId="org.eclipse.sensinact.studio.navigator.device">
+ <includes>
+ <contentExtension
+ isRoot="false"
+ pattern="org.eclipse.sensinact.studio.navigator.device.navigatorContent">
+ </contentExtension>
+ </includes>
+ </viewerContentBinding>
+ <dragAssistant
+ class="org.eclipse.sensinact.studio.navigator.device.SensinactDragAdapterAssistant"
+ viewerId="org.eclipse.sensinact.studio.navigator.device">
+ </dragAssistant>
+ </extension>
+ <extension
+ point="org.eclipse.ui.commands">
+ <command
+ id="org.eclipse.sensinact.studio.navigator.device.openResourceInvokerHandler"
+ name="Open Resource Invoker">
+ </command>
+ <command id="org.eclipse.sensinact.studio.navigator.device.toolbar.add" name="Add Gateway"></command>
+ <command id="org.eclipse.sensinact.studio.navigator.device.toolbar.remove" name="Remove Gateway"></command>
+ <command id="org.eclipse.sensinact.studio.navigator.device.toolbar.connect" name="Connect Gateway"></command>
+ <command id="org.eclipse.sensinact.studio.navigator.device.toolbar.disconnect" name="Disconnect Gateway"></command>
+ </extension>
+ <extension
+ point="org.eclipse.ui.menus">
+ <menuContribution
+ allPopups="false"
+ locationURI="popup:org.eclipse.sensinact.studio.navigator.device">
+ <command
+ commandId="org.eclipse.sensinact.studio.navigator.device.openResourceInvokerHandler"
+ label="Open resource invoker"
+ style="push">
+ <visibleWhen
+ checkEnabled="false">
+ <with
+ variable="selection">
+ <iterate
+ ifEmpty="false"
+ operator="and">
+ <instanceof
+ value="org.eclipse.sensinact.studio.resource.Resource">
+ </instanceof>
+ </iterate>
+ </with>
+ </visibleWhen>
+ </command>
+ </menuContribution>
+ <menuContribution
+ allPopups="false"
+ locationURI="toolbar:org.eclipse.sensinact.studio.navigator.device">
+ <command
+ commandId="org.eclipse.sensinact.studio.navigator.device.toolbar.add"
+ icon="icons/add.png"
+ label="Add Gateway"
+ style="push">
+ </command>
+ <command
+ commandId="org.eclipse.sensinact.studio.navigator.device.toolbar.remove"
+ icon="icons/remove.png"
+ label="Remove Gateway"
+ style="push">
+ </command>
+ <command
+ commandId="org.eclipse.sensinact.studio.navigator.device.toolbar.connect"
+ icon="icons/connect.png"
+ label="Connect Gateway"
+ style="push">
+ </command>
+ <command
+ commandId="org.eclipse.sensinact.studio.navigator.device.toolbar.disconnect"
+ icon="icons/disconnect.png"
+ label="Disconnect Gateway"
+ style="push">
+ </command>
+ </menuContribution>
+ </extension>
+ <extension
+ point="org.eclipse.ui.handlers">
+ <handler
+ class="org.eclipse.sensinact.studio.navigator.device.commands.OpenResourceInvokerHandler"
+ commandId="org.eclipse.sensinact.studio.navigator.device.openResourceInvokerHandler">
+ <enabledWhen>
+ <with
+ variable="selection">
+ <iterate
+ ifEmpty="false"
+ operator="and">
+ <instanceof
+ value="org.eclipse.sensinact.studio.resource.Resource">
+ </instanceof>
+ </iterate>
+ </with>
+ </enabledWhen>
+ </handler>
+ <handler
+ class="org.eclipse.sensinact.studio.navigator.device.toolbar.AddHandler"
+ commandId="org.eclipse.sensinact.studio.navigator.device.toolbar.add">
+ </handler>
+ <handler
+ class="org.eclipse.sensinact.studio.navigator.device.toolbar.RemoveHandler"
+ commandId="org.eclipse.sensinact.studio.navigator.device.toolbar.remove">
+ </handler>
+ <handler
+ class="org.eclipse.sensinact.studio.navigator.device.toolbar.ConnectHandler"
+ commandId="org.eclipse.sensinact.studio.navigator.device.toolbar.connect">
+ </handler>
+ <handler
+ class="org.eclipse.sensinact.studio.navigator.device.toolbar.DisconnectHandler"
+ commandId="org.eclipse.sensinact.studio.navigator.device.toolbar.disconnect">
+ </handler>
+ </extension>
+ <extension
+ point="org.eclipse.ui.decorators">
+ <decorator
+ adaptable="true"
+ class="org.eclipse.sensinact.studio.navigator.device.DeviceNavigatorDecorator"
+ id="org.eclipse.sensinact.studio.navigator.device.decorators.ReadOnly"
+ label="SNA decorator"
+ lightweight="true"
+ state="true">
+ <enablement>
+ <or>
+ <objectClass name="org.eclipse.sensinact.studio.resource.Device"></objectClass>
+ <objectClass name="org.eclipse.sensinact.studio.resource.Service"></objectClass>
+ <objectClass name="org.eclipse.sensinact.studio.resource.Resource"></objectClass>
+ </or>
+ </enablement>
+ </decorator>
+ </extension>
+
+</plugin>
diff --git a/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/Activator.java b/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/Activator.java
new file mode 100644
index 0000000..5b1256c
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/Activator.java
@@ -0,0 +1,40 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.navigator.device;
+
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+public class Activator implements BundleActivator {
+
+ private static BundleContext context;
+
+ static BundleContext getContext() {
+ return context;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
+ */
+ public void start(BundleContext bundleContext) throws Exception {
+ Activator.context = bundleContext;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
+ */
+ public void stop(BundleContext bundleContext) throws Exception {
+ Activator.context = null;
+ }
+
+}
diff --git a/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/DeviceNavigatorContentProvider.java b/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/DeviceNavigatorContentProvider.java
new file mode 100644
index 0000000..068a041
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/DeviceNavigatorContentProvider.java
@@ -0,0 +1,112 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.navigator.device;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.sensinact.studio.model.manager.modelupdater.ModelEditor;
+import org.eclipse.sensinact.studio.model.manager.modelupdater.ModelUpdater;
+import org.eclipse.sensinact.studio.navigator.device.filter.SensinactTreeViewer;
+import org.eclipse.sensinact.studio.resource.Device;
+import org.eclipse.sensinact.studio.resource.Gateway;
+import org.eclipse.sensinact.studio.resource.Resource;
+import org.eclipse.sensinact.studio.resource.Service;
+import org.eclipse.sensinact.studio.resource.Studio;
+import org.eclipse.sensinact.studio.resource.impl.DeviceImpl;
+import org.eclipse.sensinact.studio.resource.impl.GatewayImpl;
+
+/**
+ * @author Nicolas Hili, Etienne Gandrille
+ *
+ */
+public class DeviceNavigatorContentProvider implements ITreeContentProvider {
+
+ protected SensinactTreeViewer viewer;
+
+ public DeviceNavigatorContentProvider() {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.IContentProvider#dispose()
+ */
+ @Override
+ public void dispose() {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
+ */
+ @Override
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ this.viewer=(SensinactTreeViewer)viewer;
+ this.viewer.setLabelProvider(new DeviceNavigatorLabelProvider());
+ }
+
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ITreeContentProvider#getElements(java.lang.Object)
+ */
+ @Override
+ public Object[] getElements(Object inputElement) {
+ return getChildren(inputElement);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
+ */
+ @Override
+ public Object[] getChildren(Object parentElement) {
+ if (parentElement instanceof Studio) {
+ return ((Studio) parentElement).getGateways().toArray();
+ } else if (parentElement instanceof Gateway) {
+ return ((Gateway) parentElement).getDevice().toArray();
+ } else if (parentElement instanceof Device) {
+ try {
+ DeviceImpl device=(DeviceImpl)parentElement;
+ GatewayImpl gateway=(GatewayImpl)device.eContainer();
+ if(ModelEditor.getInstance().getServicesId(gateway.getName(),device.getName()).size()==0){
+ ModelUpdater.getInstance().updateServicesOnly(gateway.getName(),device.getName());
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return ((Device) parentElement).getService().toArray();
+ } else if (parentElement instanceof Service) {
+ return ((Service) parentElement).getResource().toArray();
+ }
+
+ return new Object[0];
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
+ */
+ @Override
+ public Object getParent(Object element) {
+ return ((EObject) element).eContainer();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
+ */
+ @Override
+ public boolean hasChildren(Object element) {
+ EObject eobject=(EObject)element;
+ if(element instanceof Device){
+ return true;
+ }else if(element instanceof Resource){
+ return false;
+ }
+ return eobject.eContents().size()>0;
+ }
+
+}
diff --git a/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/DeviceNavigatorDecorator.java b/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/DeviceNavigatorDecorator.java
new file mode 100644
index 0000000..7593f2c
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/DeviceNavigatorDecorator.java
@@ -0,0 +1,82 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.navigator.device;
+
+import org.apache.log4j.Logger;
+import org.eclipse.jface.viewers.IDecoration;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.jface.viewers.ILightweightLabelDecorator;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class DeviceNavigatorDecorator implements ILightweightLabelDecorator {
+
+ private static final Logger logger = Logger.getLogger(DeviceNavigatorDecorator.class);
+
+ public void decorate(Object element, IDecoration decoration) {
+
+ /* TODO Santander Decorator
+
+ if (element instanceof Service) {
+ Service service = (Service) element;
+
+ String deviceName = ((NamedElement) service.eContainer()).getName();
+ String serviceName = service.getName();
+ String resourceName = "accuracy";
+ ResourceDescriptor descriptor = new ResourceDescriptor(deviceName, serviceName, resourceName);
+
+ try {
+ if (ModelEditor.existsResource(descriptor)) {
+ StudioRequest request = new StudioRequest(descriptor, AccessMethodType.GET);
+ try {
+ HttpMessage response = request.sendRequest();
+ if (response.isValid()) {
+ ObjectMessage object = (ObjectMessage) response;
+ String value = object.getJsonObject("value").getString("value");
+ decoration.addPrefix("[" + value + "] ");
+ double doubleVal = Double.parseDouble(value.replace(",", "."));
+
+ if (doubleVal == 1) {
+ decoration.setForegroundColor(green);
+ } else if (doubleVal >= 0.50) {
+ decoration.setForegroundColor(orange);
+ } else {
+ decoration.setForegroundColor(red);
+ }
+ }
+ } catch (IOException | JSONException e) {
+ logger.error("decorator error", e);
+ }
+ }
+ } catch (InterruptedException e) {
+ logger.error("decorator error", e);
+ }
+ }
+ */
+
+ // ImageDescriptor descriptor = icons.get(readOnlyIconPath);
+ // decoration.addOverlay(descriptor, IDecoration.BOTTOM_RIGHT);
+ }
+
+ public void addListener(ILabelProviderListener listener) {
+ }
+
+ public void dispose() {
+ }
+
+ public boolean isLabelProperty(Object element, String property) {
+ return false;
+ }
+
+ public void removeListener(ILabelProviderListener listener) {
+ }
+}
\ No newline at end of file
diff --git a/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/DeviceNavigatorFilterView.java b/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/DeviceNavigatorFilterView.java
new file mode 100644
index 0000000..e3b4b90
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/DeviceNavigatorFilterView.java
@@ -0,0 +1,169 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * Navigator Widget with the filter bar on the top
+
+
+ */
+package org.eclipse.sensinact.studio.navigator.device;
+
+import org.apache.log4j.Logger;
+import org.eclipse.emf.transaction.ResourceSetChangeEvent;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.DoubleClickEvent;
+import org.eclipse.jface.viewers.IDoubleClickListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.window.Window;
+import org.eclipse.sensinact.studio.model.manager.listener.modelset.ResourceModelSetListener;
+import org.eclipse.sensinact.studio.model.manager.listener.modelset.ResourceModelSetManager;
+import org.eclipse.sensinact.studio.model.manager.modelupdater.ModelEditor;
+import org.eclipse.sensinact.studio.navigator.device.commands.OpenResourceInvokerHandler;
+import org.eclipse.sensinact.studio.navigator.device.doubleclick.BasicQueryResourceHelper;
+import org.eclipse.sensinact.studio.navigator.device.filter.SensinactFilteredTree;
+import org.eclipse.sensinact.studio.navigator.device.filter.SensinactPatternFilter;
+import org.eclipse.sensinact.studio.navigator.device.toolbar.dialog.GatewayConfigDialog;
+import org.eclipse.sensinact.studio.preferences.ConfigurationManager;
+import org.eclipse.sensinact.studio.preferences.GatewayHttpConfig;
+import org.eclipse.sensinact.studio.resource.Gateway;
+import org.eclipse.sensinact.studio.resource.Resource;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.dnd.TextTransfer;
+import org.eclipse.swt.dnd.Transfer;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.dialogs.FilteredTree;
+import org.eclipse.ui.dialogs.PatternFilter;
+import org.eclipse.ui.handlers.IHandlerService;
+import org.eclipse.ui.internal.navigator.NavigatorContentService;
+import org.eclipse.ui.navigator.CommonDragAdapter;
+import org.eclipse.ui.navigator.INavigatorContentService;
+import org.eclipse.ui.part.ViewPart;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class DeviceNavigatorFilterView extends ViewPart implements ResourceModelSetListener,IDoubleClickListener {
+
+ private static final Logger logger = Logger.getLogger(DeviceNavigatorFilterView.class);
+
+ public static final String VIEW_ID = "org.eclipse.sensinact.studio.navigator.device";
+
+ private TreeViewer viewer;
+ private NavigatorContentService contentService;
+
+ private FilteredTree tree;
+
+ @Override
+ public void createPartControl(Composite aParent) {
+
+ contentService = new NavigatorContentService(super.getViewSite().getId());
+
+ PatternFilter filter = new SensinactPatternFilter();
+ filter.setIncludeLeadingWildcard(true);
+ tree = new SensinactFilteredTree(this, aParent, SWT.H_SCROLL | SWT.V_SCROLL, filter, true);
+ viewer = tree.getViewer();
+ getSite().setSelectionProvider(viewer);
+ GridData gd = new GridData(GridData.FILL_BOTH);
+ tree.setLayoutData(gd);
+
+ viewer.setSorter(new DeviceNavigatorSorter());
+ viewer.setContentProvider(new DeviceNavigatorContentProvider());
+ viewer.setLabelProvider(new DeviceNavigatorLabelProvider());
+ viewer.setSelection(getSite().getSelectionProvider().getSelection());
+
+ INavigatorContentService ncs = contentService;//getSite().getService(INavigatorContentService.class);
+ CommonDragAdapter cd = new CommonDragAdapter(ncs, getSite().getSelectionProvider());
+ int ops = org.eclipse.swt.dnd.DND.DROP_MOVE | org.eclipse.swt.dnd.DND.DROP_COPY;
+ Transfer[] transfers = new Transfer[] { TextTransfer.getInstance() };
+ viewer.addDragSupport(ops, transfers, cd);
+ viewer.addDoubleClickListener(this);
+
+ try {
+ tree.getViewer().setInput(ModelEditor.getInstance().getViewerInput());
+ } catch (InterruptedException e) {
+ logger.error("Error while setting input for the view", e);
+ }
+
+ IHandlerService handlerService = (IHandlerService) getSite()
+ .getService(IHandlerService.class);
+ OpenResourceInvokerHandler invoker=new OpenResourceInvokerHandler();
+ handlerService.activateHandler(VIEW_ID,invoker);
+
+ MenuManager menuMgr = new MenuManager();
+ Menu menu = menuMgr.createContextMenu(tree.getViewer().getControl());
+ tree.getViewer().getControl().setMenu(menu);
+ getSite().registerContextMenu(menuMgr, tree.getViewer());
+
+ ResourceModelSetManager.getInstance().subscribe(this);
+ }
+
+ @Override
+ public void doubleClick(DoubleClickEvent event) {
+
+ IStructuredSelection selection = (IStructuredSelection) event.getSelection();
+ Object element = selection.getFirstElement();
+ Shell parent = getViewSite().getShell();
+
+ if (element != null && element instanceof Resource) {
+ Resource resource = (Resource) element;
+ BasicQueryResourceHelper manager = new BasicQueryResourceHelper(parent, resource);
+ try {
+ manager.execute();
+ } catch (InterruptedException e) {
+ logger.error("Error during double click handler processing", e);
+ }
+ }
+
+ if (element != null && element instanceof Gateway) {
+ Gateway gateway = (Gateway) element;
+ GatewayHttpConfig config = ConfigurationManager.getGateway(gateway.getName());
+
+ if (config == null) {
+ MessageDialog.openError(parent, "Error", "Can't find gateway " + gateway.getName());
+ logger.error("Can't find gateway " + gateway.getName());
+ } else {
+ GatewayConfigDialog dialog = new GatewayConfigDialog(parent, config.getName(), config.getURL().getHost(), config.getURL().getPort(), config.getTimeout(), config.getUsername(), config.getPassword());
+
+ if (dialog.open() == Window.OK) {
+ GatewayHttpConfig gatewayConfig = dialog.getGateway();
+ if (! ConfigurationManager.addGateway(gatewayConfig))
+ MessageDialog.openError(parent, "Update Error", "Please check logs.");
+ }
+ }
+ }
+ }
+
+
+ @Override
+ public void modelSetUpdated(ResourceSetChangeEvent event) {
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ if(contentService!=null){
+ contentService.getActivationService().persistExtensionActivations();
+ contentService.update();
+ contentService.dispose();
+ }
+// tree.update();
+ viewer.refresh();
+ }
+ });
+ }
+
+ @Override
+ public void setFocus() {
+ viewer.getTree().setFocus();
+ }
+}
diff --git a/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/DeviceNavigatorLabelProvider.java b/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/DeviceNavigatorLabelProvider.java
new file mode 100644
index 0000000..dc93d5b
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/DeviceNavigatorLabelProvider.java
@@ -0,0 +1,153 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.navigator.device;
+
+import org.eclipse.jface.viewers.IBaseLabelProvider;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.sensinact.studio.ui.common.images.StudioImage;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.ISharedImages;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.navigator.IDescriptionProvider;
+
+import org.eclipse.sensinact.studio.resource.Action;
+import org.eclipse.sensinact.studio.resource.Device;
+import org.eclipse.sensinact.studio.resource.Gateway;
+import org.eclipse.sensinact.studio.resource.Property;
+import org.eclipse.sensinact.studio.resource.Resource;
+import org.eclipse.sensinact.studio.resource.SensorData;
+import org.eclipse.sensinact.studio.resource.Service;
+import org.eclipse.sensinact.studio.resource.StateVariable;
+import org.eclipse.sensinact.studio.resource.Studio;
+
+/**
+ * @author Nicolas Hili, Etienne Gandrille
+ *
+ */
+public class DeviceNavigatorLabelProvider extends LabelProvider implements ILabelProvider, IDescriptionProvider,IBaseLabelProvider {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.LabelProvider#getText(java.lang.Object)
+ */
+ @Override
+ public String getText(Object element) {
+
+ if (element instanceof Studio) {
+ return getText((Studio) element);
+ } else if (element instanceof Gateway) {
+ return getText((Gateway) element);
+ } else if (element instanceof Device) {
+ return getText((Device) element);
+ } else if (element instanceof Service) {
+ return getText((Service) element);
+ } else if (element instanceof Resource) {
+ return getText((Resource) element);
+ }
+ return null;
+ }
+
+ public String getText(Studio studio) {
+ return "Root";
+ }
+
+ public String getText(Gateway gateway) {
+ return gateway.getName();
+ }
+
+ public String getText(Device device) {
+ if (device.getService().size() == 0) {
+ return device.getName();// + " [loading...]";
+ }
+
+ return device.getName();
+ }
+
+ public String getText(Service service) {
+ if (service.getResource().size() == 0) {
+ return service.getName();// + " [loading...]";
+ }
+ return service.getName();
+ }
+
+ public String getText(Resource resource) {
+ return resource.getName();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.LabelProvider#getImage(java.lang.Object)
+ */
+ @Override
+ public Image getImage(Object element) {
+
+ if (element instanceof Studio) {
+ return getImage((Studio) element);
+ } else if (element instanceof Gateway) {
+ return getImage((Gateway) element);
+ } else if (element instanceof Device) {
+ return getImage((Device)element);
+ } else if (element instanceof Service) {
+ return getImage((Service)element);
+ } else if (element instanceof Resource) {
+ return getImage((Resource)element);
+ }
+ return null;
+ }
+
+ public Image getImage(Studio studio) {
+ return PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJ_FOLDER);
+ }
+
+ public Image getImage(Gateway gateway) {
+ return PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJ_ELEMENT);
+ }
+
+ public Image getImage(Device device) {
+ //if (device.getService().size() == 0) {
+ // return StudioImage.LOAD.getImage();
+ //}
+ return PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJ_FOLDER);
+ }
+
+ public Image getImage(Service service) {
+ if (service.getResource().size() == 0) {
+ return StudioImage.LOAD.getImage();
+ }
+ return PlatformUI.getWorkbench().getSharedImages()
+ .getImage(ISharedImages.IMG_OBJ_FILE);
+ }
+
+ public Image getImage(Resource resource) {
+
+ String img = ISharedImages.IMG_OBJ_ADD;
+
+ if (resource instanceof StateVariable) {
+ img = ISharedImages.IMG_OBJS_INFO_TSK;
+ } else if (resource instanceof Action) {
+ img = ISharedImages.IMG_OBJ_ADD;
+ } else if (resource instanceof Property) {
+ img = ISharedImages.IMG_LCL_LINKTO_HELP;
+ } else if (resource instanceof SensorData) {
+ img = ISharedImages.IMG_ETOOL_HOME_NAV;
+ }
+ return PlatformUI.getWorkbench().getSharedImages()
+ .getImage(img);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.navigator.IDescriptionProvider#getDescription(java.lang.Object)
+ */
+ @Override
+ public String getDescription(Object element) {
+ String text = getText(element);
+ return "This is a description of " + text;
+ }
+}
diff --git a/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/DeviceNavigatorSorter.java b/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/DeviceNavigatorSorter.java
new file mode 100644
index 0000000..af27b8f
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/DeviceNavigatorSorter.java
@@ -0,0 +1,39 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.navigator.device;
+
+import java.text.Collator;
+
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+
+import org.eclipse.sensinact.studio.resource.impl.NamedElementImpl;
+
+/**
+ * @author Etienne Gandrille
+ */
+ public class DeviceNavigatorSorter extends ViewerSorter {
+
+ public DeviceNavigatorSorter() {
+ }
+
+ public DeviceNavigatorSorter(Collator collator) {
+ super(collator);
+ }
+
+ @Override
+ public int compare(Viewer viewer, Object e1, Object e2) {
+ NamedElementImpl object1 = (NamedElementImpl) e1;
+ NamedElementImpl object2 = (NamedElementImpl) e2;
+
+ return object1.getName().compareToIgnoreCase(object2.getName());
+ }
+}
diff --git a/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/DeviceNavigatorView.java b/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/DeviceNavigatorView.java
new file mode 100644
index 0000000..fb8422f
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/DeviceNavigatorView.java
@@ -0,0 +1,85 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.navigator.device;
+
+import org.apache.log4j.Logger;
+import org.eclipse.emf.transaction.ResourceSetChangeEvent;
+import org.eclipse.jface.viewers.DoubleClickEvent;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.sensinact.studio.model.manager.listener.modelset.ResourceModelSetListener;
+import org.eclipse.sensinact.studio.model.manager.listener.modelset.ResourceModelSetManager;
+import org.eclipse.sensinact.studio.model.manager.modelupdater.ModelEditor;
+import org.eclipse.sensinact.studio.navigator.device.doubleclick.BasicQueryResourceHelper;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.navigator.CommonNavigator;
+import org.eclipse.ui.navigator.INavigatorContentService;
+
+import org.eclipse.sensinact.studio.resource.Resource;
+
+/**
+ * @author Nicolas Hili, Etienne Gandrille
+ */
+public class DeviceNavigatorView extends CommonNavigator implements ResourceModelSetListener {
+
+ private static final Logger logger = Logger.getLogger(DeviceNavigatorView.class);
+
+ public static final String VIEW_ID = "org.eclipse.sensinact.studio.navigator.device";
+
+ @Override
+ protected void initListeners(TreeViewer viewer) {
+ super.initListeners(viewer);
+ ResourceModelSetManager.getInstance().subscribe(this);
+ }
+
+ @Override
+ public void modelSetUpdated(ResourceSetChangeEvent event) {
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ INavigatorContentService contentService = getNavigatorContentService();
+ contentService.getActivationService().persistExtensionActivations();
+ contentService.update();
+ contentService.dispose();
+ }
+ });
+ }
+
+ @Override
+ protected Object getInitialInput() {
+ try {
+ return ModelEditor.getInstance().getViewerInput();
+ } catch (InterruptedException e) {
+ logger.error("Can't get initial value for tree viewer", e);
+ return null;
+ }
+ }
+
+ @Override
+ protected void handleDoubleClick(DoubleClickEvent event) {
+
+ IStructuredSelection selection = (IStructuredSelection) event.getSelection();
+ Object element = selection.getFirstElement();
+
+ if (element != null && element instanceof Resource) {
+ Resource resource = (Resource) element;
+ BasicQueryResourceHelper manager = new BasicQueryResourceHelper(getViewSite().getShell(), resource);
+ try {
+ manager.execute();
+ return;
+ } catch (InterruptedException e) {
+ logger.error("Error during double click handler processing", e);
+ }
+ }
+
+ // if no special action, perform the default one
+ super.handleDoubleClick(event);
+ }
+}
diff --git a/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/SensinactDragAdapterAssistant.java b/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/SensinactDragAdapterAssistant.java
new file mode 100644
index 0000000..577a898
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/SensinactDragAdapterAssistant.java
@@ -0,0 +1,134 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.navigator.device;
+
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.sensinact.studio.view.outdoor.OutdoorDeploymentView;
+import org.eclipse.swt.dnd.DragSourceEvent;
+import org.eclipse.swt.dnd.TextTransfer;
+import org.eclipse.swt.dnd.Transfer;
+import org.eclipse.ui.navigator.CommonDragAdapterAssistant;
+
+import org.eclipse.sensinact.studio.resource.Device;
+import org.eclipse.sensinact.studio.resource.Gateway;
+import org.eclipse.sensinact.studio.resource.NamedElement;
+import org.eclipse.sensinact.studio.resource.Resource;
+import org.eclipse.sensinact.studio.resource.Service;
+
+/**
+ * @author Nicolas Hili
+ */
+public class SensinactDragAdapterAssistant extends CommonDragAdapterAssistant {
+
+ public SensinactDragAdapterAssistant() {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.ui.navigator.CommonDragAdapterAssistant#getSupportedTransferTypes
+ * ()
+ */
+ @Override
+ public Transfer[] getSupportedTransferTypes() {
+ Transfer[] transferTypes = new Transfer[] { TextTransfer.getInstance() };
+ return transferTypes;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.ui.navigator.CommonDragAdapterAssistant#setDragData(org.eclipse
+ * .swt.dnd.DragSourceEvent, org.eclipse.jface.viewers.IStructuredSelection)
+ */
+ @Override
+ public boolean setDragData(DragSourceEvent event, IStructuredSelection selection) {
+
+ // Gateway
+ if (selection.getFirstElement() instanceof Gateway) {
+ Gateway gateway = (Gateway) selection.getFirstElement();
+ if (TextTransfer.getInstance().isSupportedType(event.dataType)) {
+ event.data = "["+gateway.getName()+"/]";
+ }
+ return true;
+ }
+
+ // Device
+ if (selection.getFirstElement() instanceof Device) {
+ Device device = (Device) selection.getFirstElement();
+ if (TextTransfer.getInstance().isSupportedType(event.dataType)) {
+ String gatewayName = ((NamedElement) device.eContainer()).getName();
+ event.data = "["+gatewayName + "/" + device.getName()+"/]";
+ }
+ return true;
+ }
+
+ // Service
+ if (selection.getFirstElement() instanceof Service) {
+ Service service = (Service) selection.getFirstElement();
+ if (TextTransfer.getInstance().isSupportedType(event.dataType)) {
+ String gatewayName = ((NamedElement) service.eContainer().eContainer()).getName();
+ String deviceName = ((NamedElement) service.eContainer()).getName();
+ String serviceName = ((NamedElement) service).getName();
+ event.data = "["+gatewayName + "/" + deviceName + "/" + serviceName+"/]";
+ }
+ return true;
+ }
+
+ // Resource
+ if (selection.getFirstElement() instanceof Resource) {
+ Resource resource = (Resource) selection.getFirstElement();
+ if (TextTransfer.getInstance().isSupportedType(event.dataType)) {
+ String gatewayName = ((NamedElement) resource.eContainer().eContainer().eContainer()).getName();
+ String deviceName = ((NamedElement) resource.eContainer().eContainer()).getName();
+ String serviceName = ((NamedElement) resource.eContainer()).getName();
+ String resourceName = ((NamedElement) resource).getName();
+ event.data = "["+gatewayName + "/" + deviceName + "/" + serviceName + "/" + resourceName+"]";
+ }
+ return true;
+ }
+
+ return false;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.ui.navigator.CommonDragAdapterAssistant#dragStart(org.eclipse
+ * .swt.dnd.DragSourceEvent, org.eclipse.jface.viewers.IStructuredSelection)
+ */
+ @Override
+ public void dragStart(DragSourceEvent event, IStructuredSelection selection) {
+ super.dragStart(event, selection);
+ if (selection.getFirstElement() instanceof Device) {
+ OutdoorDeploymentView.beginDrag();
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.ui.navigator.CommonDragAdapterAssistant#dragFinished(org.
+ * eclipse.swt.dnd.DragSourceEvent,
+ * org.eclipse.jface.viewers.IStructuredSelection)
+ */
+ @Override
+ public void dragFinished(DragSourceEvent event, IStructuredSelection selection) {
+ super.dragFinished(event, selection);
+ if (selection.getFirstElement() instanceof Device) {
+ OutdoorDeploymentView.endDrag();
+ }
+ }
+}
diff --git a/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/SensinactDropAdapterAssistant.java b/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/SensinactDropAdapterAssistant.java
new file mode 100644
index 0000000..f932be0
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/SensinactDropAdapterAssistant.java
@@ -0,0 +1,53 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.navigator.device;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.sensinact.studio.view.outdoor.OutdoorDeploymentView;
+import org.eclipse.swt.dnd.DropTargetEvent;
+import org.eclipse.swt.dnd.TransferData;
+import org.eclipse.ui.navigator.CommonDropAdapter;
+import org.eclipse.ui.navigator.CommonDropAdapterAssistant;
+
+/**
+ * @author Nicolas Hili
+ * @since Nov 13, 2014
+ *
+ */
+public class SensinactDropAdapterAssistant extends CommonDropAdapterAssistant {
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.ui.navigator.CommonDropAdapterAssistant#validateDrop(java
+ * .lang.Object, int, org.eclipse.swt.dnd.TransferData)
+ */
+ @Override
+ public IStatus validateDrop(Object target, int operation, TransferData transferType) {
+ return Status.OK_STATUS;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.ui.navigator.CommonDropAdapterAssistant#handleDrop(org.eclipse
+ * .ui.navigator.CommonDropAdapter, org.eclipse.swt.dnd.DropTargetEvent,
+ * java.lang.Object)
+ */
+ @Override
+ public IStatus handleDrop(CommonDropAdapter aDropAdapter, DropTargetEvent aDropTargetEvent, Object aTarget) {
+ OutdoorDeploymentView.endDrag();
+ return null;
+ }
+}
diff --git a/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/commands/OpenResourceInvokerHandler.java b/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/commands/OpenResourceInvokerHandler.java
new file mode 100644
index 0000000..56e4910
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/commands/OpenResourceInvokerHandler.java
@@ -0,0 +1,75 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.navigator.device.commands;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.sensinact.studio.model.resource.utils.ResourceDescriptor;
+import org.eclipse.sensinact.studio.navigator.device.ui.dialogs.resourceInvoker.ResourceInvokerDialog;
+import org.eclipse.sensinact.studio.navigator.device.ui.dialogs.resourceInvoker.methodprovider.GUIDefinedMethodProvider;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.PlatformUI;
+
+import org.eclipse.sensinact.studio.resource.Device;
+import org.eclipse.sensinact.studio.resource.Gateway;
+import org.eclipse.sensinact.studio.resource.Resource;
+import org.eclipse.sensinact.studio.resource.Service;
+
+/**
+ * @author Nicolas Hili
+ */
+public class OpenResourceInvokerHandler extends AbstractHandler {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+ */
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ showMenu(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getSelectionService().getSelection());
+ return null;
+ }
+
+ public void showMenu(ISelection iselection){
+ Object selection = iselection;
+ // Get first element if the selection is an IStructuredSelection
+ if(selection instanceof IStructuredSelection) {
+ IStructuredSelection structuredSelection = (IStructuredSelection)selection;
+ selection = structuredSelection.getFirstElement();
+ }
+
+ // Treat non-null selected object (try to adapt and return EObject)
+ if(selection instanceof Resource) {
+ Resource resource = (Resource) selection;
+ Service service = (Service) resource.eContainer();
+ Device device = (Device) service.eContainer();
+ Gateway gateway = (Gateway) device.eContainer();
+
+ String deviceId = device.getName();
+ String serviceId = service.getName();
+ String resourceId = resource.getName();
+ String gatewayId = gateway.getName();
+ ResourceDescriptor descriptor = new ResourceDescriptor(gatewayId, deviceId, serviceId, resourceId);
+
+ // TODO new Shell() pour le parent ????
+ ResourceInvokerDialog dialog = new ResourceInvokerDialog(null, descriptor, new GUIDefinedMethodProvider(descriptor));
+ dialog.create();
+ dialog.open();
+ }
+ }
+
+ @Override
+ public boolean isEnabled() {
+ return super.isEnabled();
+ }
+}
diff --git a/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/doubleclick/BasicQueryResourceHelper.java b/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/doubleclick/BasicQueryResourceHelper.java
new file mode 100644
index 0000000..70756e7
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/doubleclick/BasicQueryResourceHelper.java
@@ -0,0 +1,132 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.navigator.device.doubleclick;
+
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.sensinact.studio.http.client.StudioRequest;
+import org.eclipse.sensinact.studio.http.client.UIResult;
+import org.eclipse.sensinact.studio.model.manager.modelupdater.ModelEditor;
+import org.eclipse.sensinact.studio.model.resource.utils.ResourceDescriptor;
+import org.eclipse.sensinact.studio.navigator.device.ui.dialogs.resourceInvoker.ResourceInvokerDialog;
+import org.eclipse.sensinact.studio.navigator.device.ui.dialogs.resourceInvoker.methodprovider.APIDefinedMethodProvider;
+import org.eclipse.sensinact.studio.ui.common.dialog.SimpleDialog;
+import org.eclipse.sensinact.studio.ui.common.notification.NotifierDialog;
+import org.eclipse.swt.widgets.Shell;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import org.eclipse.sensinact.studio.resource.AccessMethod;
+import org.eclipse.sensinact.studio.resource.AccessMethodType;
+import org.eclipse.sensinact.studio.resource.NamedElement;
+import org.eclipse.sensinact.studio.resource.Resource;
+import org.eclipse.sensinact.studio.resource.ResourcePackage;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class BasicQueryResourceHelper {
+
+ private final ResourceDescriptor descriptor;
+
+ private final int resourceClassClassifierID;
+
+ private final Shell parent;
+
+ public BasicQueryResourceHelper(Shell parent, Resource resource) {
+ this.parent = parent;
+
+ String gatewayID = ((NamedElement) resource.eContainer().eContainer().eContainer()).getName();
+ String deviceID = ((NamedElement) resource.eContainer().eContainer()).getName();
+ String serviceID = ((NamedElement) resource.eContainer()).getName();
+ String resourceID = resource.getName();
+ descriptor = new ResourceDescriptor(gatewayID, deviceID, serviceID, resourceID);
+
+ // Represents the type of the resource as an integer
+ resourceClassClassifierID = resource.eClass().getClassifierID();
+ }
+
+ public void execute() throws InterruptedException {
+
+ // access method selection
+ AccessMethodType type = null;
+ int nbParam = -1;
+ AccessMethod selectedMethod = null;
+ for (AccessMethod method : ModelEditor.getInstance().getAccessMethods(descriptor)) {
+
+ int curSize = method.getParameter().size();
+ AccessMethodType curType = method.getType();
+
+ if (isCompatibleResourceMethod(curType)) {
+ if (nbParam == -1 || curSize < nbParam) {
+ nbParam = curSize;
+ type = curType;
+ selectedMethod = method;
+ }
+ }
+ }
+
+ // no access method available
+ if (nbParam == -1) {
+ MessageDialog.openError(parent, "Error", "No default access method available");
+
+ // method with NO parameters available (great !)
+ } else if (nbParam == 0) {
+ executeWithoutParameters(type);
+
+ // execution WITH parameters
+ } else {
+ executeWithParameters(selectedMethod);
+ }
+ }
+
+ private boolean isCompatibleResourceMethod(AccessMethodType type) {
+ if (resourceClassClassifierID == ResourcePackage.ACTION)
+ if (type == AccessMethodType.ACT)
+ return true;
+ else
+ return false;
+ if (type == AccessMethodType.GET)
+ return true;
+ if (type == AccessMethodType.SET)
+ return true;
+ return false;
+ }
+
+ private void executeWithParameters(AccessMethod selectedMethod) {
+ ResourceInvokerDialog dialog = new ResourceInvokerDialog(null, descriptor, new APIDefinedMethodProvider(descriptor, selectedMethod));
+ dialog.open();
+ }
+
+ private void executeWithoutParameters(AccessMethodType type) {
+ StudioRequest request = new StudioRequest(descriptor, type);
+ UIResult result = request.sendRequestForIU();
+
+ switch(result.getStatus()) {
+ case SUCCESS:
+ if (type != AccessMethodType.ACT)
+ try {
+ new SimpleDialog(parent, result.getTitle(), new JSONObject(result.getMessage()).toString(4), MessageDialog.INFORMATION).open();
+ } catch (JSONException e) {
+ new SimpleDialog(parent, result.getTitle(), result.getMessage(), MessageDialog.INFORMATION).open();
+ }
+ else
+ NotifierDialog.notify(result.getTitle(), result.getMessage());
+ break;
+ case ERROR:
+ try {
+ new SimpleDialog(parent, result.getTitle(), new JSONObject(result.getMessage()).toString(4), MessageDialog.ERROR).open();
+ } catch (JSONException e) {
+ new SimpleDialog(parent, result.getTitle(), result.getMessage(), MessageDialog.ERROR).open();
+ }
+ break;
+ }
+ }
+}
diff --git a/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/filter/SensinactFilteredTree.java b/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/filter/SensinactFilteredTree.java
new file mode 100644
index 0000000..1f53bdb
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/filter/SensinactFilteredTree.java
@@ -0,0 +1,81 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.navigator.device.filter;
+
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.sensinact.studio.model.manager.listener.modelset.ResourceModelSetListener;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.KeyListener;
+import org.eclipse.swt.events.TraverseEvent;
+import org.eclipse.swt.events.TraverseListener;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.dialogs.FilteredTree;
+import org.eclipse.ui.dialogs.PatternFilter;
+
+/**
+ * Class that allows to interfere with the filter submitted to the tree
+ *
+ * @author Jander Nascimento
+ *
+ */
+public class SensinactFilteredTree extends FilteredTree {
+
+ private ResourceModelSetListener listener;
+
+ public SensinactFilteredTree(Composite parent, boolean useNewLook) {
+ super(parent, useNewLook);
+ }
+
+ public SensinactFilteredTree(ResourceModelSetListener listener, Composite parent, int treeStyle,
+ PatternFilter filter, boolean useNewLook) {
+ super(parent, treeStyle, filter, useNewLook);
+ this.listener = listener;
+ super.getFilterControl().addTraverseListener(new TraverseListener() {
+
+ @Override
+ public void keyTraversed(TraverseEvent e) {
+ if(e.keyCode==13){
+ doCreateRefreshJob();
+ }
+ }
+ });
+ }
+
+ @Override
+ protected TreeViewer doCreateTreeViewer(Composite parent, int style) {
+ // TODO Auto-generated method stub
+ return new SensinactTreeViewer(parent,style);//super.doCreateTreeViewer(parent, style);
+ }
+
+ @Override
+ protected void updateToolbar(boolean visible) {
+ super.updateToolbar(visible);
+ }
+
+ @Override
+ protected void textChanged() {
+
+ super.textChanged();
+/*
+ if(super.getFilterString().trim().equals("")){
+ doCreateRefreshJob();
+ }
+
+ if (listener != null) {
+ listener.modelSetUpdated(null);
+ }
+
+ */
+ }
+
+
+
+}
diff --git a/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/filter/SensinactPatternFilter.java b/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/filter/SensinactPatternFilter.java
new file mode 100644
index 0000000..e0f9d58
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/filter/SensinactPatternFilter.java
@@ -0,0 +1,49 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.navigator.device.filter;
+
+import org.eclipse.jface.viewers.AbstractTreeViewer;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.ui.dialogs.PatternFilter;
+
+/**
+ * PatternFilter extension that add the Children of those who matches in the
+ * result list
+ *
+ * @author Jander Nascimento
+ *
+ */
+public class SensinactPatternFilter extends PatternFilter {
+
+ protected boolean isChildMatch(Viewer viewer, Object element) {
+ Object parent = ((ITreeContentProvider) ((AbstractTreeViewer) viewer).getContentProvider()).getParent(element);
+
+ if (parent != null) {
+ return (isLeafMatch(viewer, parent) ? true : isChildMatch(viewer, parent));
+ }
+ return false;
+
+ }
+
+ @Override
+ protected boolean isLeafMatch(Viewer viewer, Object element) {
+ String labelText = ((ILabelProvider) ((StructuredViewer) viewer).getLabelProvider()).getText(element);
+
+ if (labelText == null) {
+ return false;
+ }
+
+ return (wordMatches(labelText) ? true : isChildMatch(viewer, element));
+ }
+}
diff --git a/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/filter/SensinactTreeViewer.java b/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/filter/SensinactTreeViewer.java
new file mode 100644
index 0000000..1250c74
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/filter/SensinactTreeViewer.java
@@ -0,0 +1,41 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.navigator.device.filter;
+
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.swt.events.TreeEvent;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Tree;
+
+public class SensinactTreeViewer extends TreeViewer {
+
+ public SensinactTreeViewer(Composite parent) {
+ super(parent);
+ }
+
+
+ public SensinactTreeViewer(Composite parent, int style) {
+ super(parent, style);
+ }
+
+
+
+ public SensinactTreeViewer(Tree tree) {
+ super(tree);
+ }
+
+
+
+ public void handleEvent(TreeEvent event){
+ super.handleTreeExpand(event);
+ }
+
+}
diff --git a/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/toolbar/AddHandler.java b/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/toolbar/AddHandler.java
new file mode 100644
index 0000000..1b374ec
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/toolbar/AddHandler.java
@@ -0,0 +1,48 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.navigator.device.toolbar;
+
+import org.apache.log4j.Logger;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.window.Window;
+import org.eclipse.sensinact.studio.navigator.device.toolbar.dialog.GatewayConfigDialog;
+import org.eclipse.sensinact.studio.preferences.ConfigurationManager;
+import org.eclipse.sensinact.studio.preferences.GatewayHttpConfig;
+import org.eclipse.sensinact.studio.ui.common.dialog.SnaHandler;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * @author Etienne Gandrille
+ */public class AddHandler extends SnaHandler {
+
+ private static final Logger logger = Logger.getLogger(AddHandler.class);
+
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+
+ Shell shell = getShell(event);
+
+ GatewayConfigDialog dialog = new GatewayConfigDialog(shell, ConfigurationManager.getGatewayNames());
+ dialog.create();
+
+ if (dialog.open() == Window.OK) {
+ GatewayHttpConfig gateway = dialog.getGateway();
+ if (! ConfigurationManager.addGateway(gateway)) {
+ MessageDialog.openError(shell, "Update Error", "Please check logs.");
+ logger.error("Error while adding a new gateway with config:" + gateway);
+ }
+ }
+
+ return null;
+ }
+}
diff --git a/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/toolbar/ConnectHandler.java b/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/toolbar/ConnectHandler.java
new file mode 100644
index 0000000..d3b1ed8
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/toolbar/ConnectHandler.java
@@ -0,0 +1,98 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.navigator.device.toolbar;
+
+import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
+import java.net.URI;
+
+import org.apache.log4j.Logger;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.dialogs.ProgressMonitorDialog;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.sensinact.studio.model.manager.modelupdater.ModelUpdater;
+import org.eclipse.sensinact.studio.preferences.ConfigurationManager;
+import org.eclipse.sensinact.studio.preferences.GatewayHttpConfig;
+import org.eclipse.sensinact.studio.ui.common.dialog.SnaHandler;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+
+import org.eclipse.sensinact.studio.resource.Gateway;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class ConnectHandler extends SnaHandler {
+
+ private static final Logger logger = Logger.getLogger(ConnectHandler.class);
+
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+
+ Shell parent = getShell(event);
+
+ Object element = getSelectedElement(event);
+ if (element != null && element instanceof Gateway) {
+ Gateway gateway = (Gateway) element;
+ String name = gateway.getName();
+ GatewayHttpConfig gwConfig = ConfigurationManager.getGateway(name);
+ if (gwConfig == null) {
+ MessageDialog.openError(parent, "Error", "Can't find gateway info.");
+ logger.error("Error while getting gateway config for " + name);
+ } else if (ModelUpdater.getInstance().isConnected(name)) {
+ MessageDialog.openError(parent, "Error", "Gateway already connected.");
+ } else {
+ connect(parent, gwConfig);
+ }
+ } else {
+ MessageDialog.openError(parent, "Error", "Please select a gateway in the tree viewer.");
+ }
+
+ return null;
+ }
+
+ private void connect(final Shell parent, final GatewayHttpConfig gateway) {
+
+ ProgressMonitorDialog dialog = new ProgressMonitorDialog(parent);
+
+ try {
+ dialog.run(false, false, new IRunnableWithProgress() {
+ public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
+ ModelUpdater mu = ModelUpdater.getInstance();
+ monitor.subTask("Fetching devices from:"+gateway.getURL());
+ try {
+ mu.updateDevices(gateway.getName());
+ if (monitor.isCanceled()) {
+ throw new InterruptedException("Operation Canceled");
+ }
+ monitor.worked(100);
+ Job connectJob=new ConnectJob(gateway,parent);
+ connectJob.schedule();
+ } catch (Exception e) {
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ MessageDialog.openError(parent, "Connection Error", "Connection failed.");
+ }
+ });
+ throw new InvocationTargetException(new Exception("Connection Failed"));
+ }
+ }
+ });
+ } catch (Exception e2) {
+ logger.error("Exception during update", e2);
+ }
+
+ }
+}
diff --git a/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/toolbar/ConnectJob.java b/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/toolbar/ConnectJob.java
new file mode 100644
index 0000000..cff5b78
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/toolbar/ConnectJob.java
@@ -0,0 +1,91 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.navigator.device.toolbar;
+
+import java.net.ConnectException;
+import java.net.URI;
+
+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.dialogs.MessageDialog;
+import org.eclipse.sensinact.studio.model.manager.modelupdater.ModelUpdater;
+import org.eclipse.sensinact.studio.preferences.ConfigurationManager;
+import org.eclipse.sensinact.studio.preferences.GatewayHttpConfig;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class ConnectJob extends Job{
+
+ private final GatewayHttpConfig gateway;
+ private Shell parent;
+ public ConnectJob(final GatewayHttpConfig gateway,Shell parent){
+ super(gateway.getName());
+ this.gateway=gateway;
+ this.parent=parent;
+ }
+
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ super.setThread(new Thread());
+ monitor.beginTask("Connecting..", 100);
+ try {
+
+ ModelUpdater mu = ModelUpdater.getInstance();
+ if (monitor.isCanceled()) {
+ throw new InterruptedException("Operation Canceled");
+ }
+ monitor.setTaskName("Subscribing to server events");
+ Boolean callbackRegistered=mu.subscribeLastEvent(gateway.getName());
+ Boolean websocketConnected=false;
+ monitor.worked(50);
+ monitor.setTaskName("Connecting websocket");
+ GatewayHttpConfig gatewayConfig=ConfigurationManager.getGateway(gateway.getName());
+ System.out.println("Connecting ws:"+String.format("ws://%s:8080/ws/sensinact", gatewayConfig.getURL().getHost()));
+ URI echoUri = new URI(String.format("ws://%s:8080/ws/sensinact", gatewayConfig.getURL().getHost()));
+ try {
+ SensinactWebSocketConnectionManager.getInstance().connect(gateway.getName(), echoUri);
+ websocketConnected=true;
+ }catch(ConnectException e){
+ websocketConnected=false;
+ }
+ monitor.worked(50);
+ monitor.setTaskName("Done.");
+
+ if(!callbackRegistered && !websocketConnected){
+ throw new Exception();
+ }
+
+ } catch (Exception e) {
+ monitor.setCanceled(true);
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ MessageDialog.openError(parent, "Connection Error", "Connection to the gateway couldn't be established");
+ }
+ });
+
+ return Status.CANCEL_STATUS;
+ } finally {
+ monitor.done();
+ }
+
+ return Status.OK_STATUS;
+ }
+
+
+
+
+
+}
diff --git a/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/toolbar/DisconnectHandler.java b/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/toolbar/DisconnectHandler.java
new file mode 100644
index 0000000..8281397
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/toolbar/DisconnectHandler.java
@@ -0,0 +1,63 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.navigator.device.toolbar;
+
+import org.apache.log4j.Logger;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.sensinact.studio.model.manager.modelupdater.ModelEditor;
+import org.eclipse.sensinact.studio.model.manager.modelupdater.ModelUpdater;
+import org.eclipse.sensinact.studio.preferences.ConfigurationManager;
+import org.eclipse.sensinact.studio.preferences.GatewayHttpConfig;
+import org.eclipse.sensinact.studio.ui.common.dialog.SnaHandler;
+import org.eclipse.swt.widgets.Shell;
+
+import org.eclipse.sensinact.studio.resource.Gateway;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class DisconnectHandler extends SnaHandler {
+
+ private static final Logger logger = Logger.getLogger(DisconnectHandler.class);
+
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+
+ Shell parent = getShell(event);
+
+ Object element = getSelectedElement(event);
+ if (element != null && element instanceof Gateway) {
+ Gateway gateway = (Gateway) element;
+ String name = gateway.getName();
+ GatewayHttpConfig gwConfig = ConfigurationManager.getGateway(name);
+ if (gwConfig == null) {
+ MessageDialog.openError(parent, "Error", "Can't find gateway info.");
+ logger.error("Error while getting gateway config for " + name);
+ } else if ( ! ModelUpdater.getInstance().isConnected(name)) {
+ MessageDialog.openError(parent, "Error", "Gateway is not connected.");
+ } else {
+ disconnect(parent, gwConfig);
+ }
+ } else {
+ MessageDialog.openError(parent, "Error", "Please select a gateway in the tree viewer.");
+ }
+
+ return null;
+ }
+
+ private void disconnect(Shell parent, GatewayHttpConfig gwConfig) {
+ ModelUpdater.getInstance().unsubscribeLastEvent(gwConfig.getName());
+ SensinactWebSocketConnectionManager.getInstance().disconnect(gwConfig.getName());
+ ModelEditor.getInstance().clearGatewayContent(gwConfig.getName());
+ }
+}
diff --git a/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/toolbar/RemoveHandler.java b/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/toolbar/RemoveHandler.java
new file mode 100644
index 0000000..b326fda
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/toolbar/RemoveHandler.java
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.navigator.device.toolbar;
+
+import org.apache.log4j.Logger;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.sensinact.studio.preferences.ConfigurationManager;
+import org.eclipse.sensinact.studio.ui.common.dialog.SnaHandler;
+
+import org.eclipse.sensinact.studio.resource.Gateway;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class RemoveHandler extends SnaHandler {
+
+ private static final Logger logger = Logger.getLogger(RemoveHandler.class);
+
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+
+ Object element = getSelectedElement(event);
+ if (element != null && element instanceof Gateway) {
+ Gateway gateway = (Gateway) element;
+ String name = gateway.getName();
+ if (MessageDialog.openConfirm(getShell(event), "Please confirm", "Do you want to remove the gateway " + name + "?")) {
+ if (!ConfigurationManager.removeGateway(name)) {
+ logger.error("Error while removing gateway with name " + name);
+ }
+ }
+ } else {
+ MessageDialog.openError(getShell(event), "Error", "Please select the gateway to be deleted in the ree viewer.");
+ }
+
+ return null;
+ }
+}
diff --git a/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/toolbar/SensinactSocket.java b/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/toolbar/SensinactSocket.java
new file mode 100644
index 0000000..9a70fae
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/toolbar/SensinactSocket.java
@@ -0,0 +1,105 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.navigator.device.toolbar;
+
+import java.util.List;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+import java.util.logging.Level;
+
+import org.apache.log4j.Logger;
+import org.apache.log4j.Priority;
+import org.eclipse.jetty.websocket.api.Session;
+import org.eclipse.jetty.websocket.api.annotations.OnWebSocketClose;
+import org.eclipse.jetty.websocket.api.annotations.OnWebSocketConnect;
+import org.eclipse.jetty.websocket.api.annotations.OnWebSocketMessage;
+import org.eclipse.jetty.websocket.api.annotations.WebSocket;
+import org.eclipse.sensinact.studio.model.manager.listener.subscription.SubscriptionManager;
+import org.eclipse.sensinact.studio.model.manager.modelupdater.ModelEditor;
+import org.eclipse.sensinact.studio.model.manager.modelupdater.ModelUpdater;
+import org.eclipse.sensinact.studio.model.resource.utils.Constants;
+import org.eclipse.sensinact.studio.preferences.ConfigurationManager;
+import org.eclipse.sensinact.studio.preferences.GatewayHttpConfig;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+@SuppressWarnings("serial")
+@WebSocket(maxTextMessageSize = 64 * 1024)
+public class SensinactSocket {
+
+ private static final Logger logger = Logger.getLogger(SensinactSocket.class);
+
+ private final CountDownLatch closeLatch;
+ private Session session;
+ private String gatewayID;
+
+ public SensinactSocket(String gatewayID) {
+ this.closeLatch = new CountDownLatch(1);
+ this.gatewayID=gatewayID;
+ }
+
+ public boolean awaitClose(int duration, TimeUnit unit) throws InterruptedException {
+ return this.closeLatch.await(duration, unit);
+ }
+
+ @OnWebSocketClose
+ public void onClose(int statusCode, String reason) {
+ session=null;
+ System.out.println("WebSocket connection closed from the gateway "+gatewayID);
+ this.closeLatch.countDown();
+ try {
+ GatewayHttpConfig gwConfig = ConfigurationManager.getGateway(gatewayID);
+ ModelUpdater.getInstance().unsubscribeLastEvent(gwConfig.getName());
+ SensinactWebSocketConnectionManager.getInstance().disconnect(gwConfig.getName());
+ ModelEditor.getInstance().clearGatewayContent(gwConfig.getName());
+ }catch(Exception e){
+ logger.log(Priority.DEBUG, (Object)("Websocket clients was disconnected from the server "+gatewayID));
+ }
+
+
+ }
+
+ @OnWebSocketConnect
+ public void onConnect(Session session) {
+ System.out.println("WebSocket connected to the gateway "+gatewayID);
+ this.session = session;
+ }
+
+ @OnWebSocketMessage
+ public void onMessage(String msg) {
+ logger.log(Priority.INFO, (Object)("Websocket message received from "+gatewayID));
+ String uri;
+ try {
+ JSONObject jsonMessage=new JSONObject(msg);
+ uri = jsonMessage.getString("uri");
+ SubscriptionManager sm=SubscriptionManager.getInstance();
+ List<String> subscriptionids=sm.getSubscriptionIDFromResourceURI(uri);
+ //Find subscription with a given destination
+ if(subscriptionids.size()!=0)
+ for(String subscriptionID:subscriptionids){
+ logger.log(Priority.DEBUG, (Object)("Sending notification to subscriptionID:"+subscriptionID));
+ sm.callbackRecieved(msg, subscriptionID);
+ }
+ else {
+ //Case so far the notification was not dispatched, dispatch system message if that correspond to one
+ String subscriptionID=sm.getSubscriptionId(Constants.createLastEventRD(gatewayID));
+ sm.callbackRecieved(msg, subscriptionID);
+ }
+ } catch (JSONException e) {
+ logger.log(Priority.DEBUG, (Object)("Error receiving message:"+e.getMessage()));
+ }
+
+ }
+
+ public Session getSession(){
+ return session;
+ }
+}
diff --git a/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/toolbar/SensinactWebSocketConnectionManager.java b/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/toolbar/SensinactWebSocketConnectionManager.java
new file mode 100644
index 0000000..f77ba57
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/toolbar/SensinactWebSocketConnectionManager.java
@@ -0,0 +1,76 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.navigator.device.toolbar;
+
+import java.net.ConnectException;
+import java.net.URI;
+import java.util.HashMap;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.log4j.Logger;
+import org.eclipse.jetty.websocket.client.ClientUpgradeRequest;
+import org.eclipse.jetty.websocket.client.WebSocketClient;
+
+public class SensinactWebSocketConnectionManager implements Cloneable {
+ private static final Logger logger = Logger.getLogger(SensinactWebSocketConnectionManager.class);
+ private static SensinactWebSocketConnectionManager instance;
+ private HashMap<String, WebSocketClient> servers=new HashMap<String, WebSocketClient>();
+ private HashMap<String, SensinactSocket> sockets=new HashMap<String, SensinactSocket>();
+
+ private SensinactWebSocketConnectionManager() {
+ }
+
+ public static SensinactWebSocketConnectionManager getInstance() {
+
+ if (instance == null) {
+ instance = new SensinactWebSocketConnectionManager();
+ }
+
+ return instance;
+
+ }
+
+ public void connect(String gatewayName, URI url) throws ConnectException {
+ ClientUpgradeRequest request = new ClientUpgradeRequest();
+ SensinactSocket socket = new SensinactSocket(gatewayName);
+ WebSocketClient client = new WebSocketClient();
+ try {
+ client.start();
+ client.connect(socket, url, request);
+ socket.awaitClose(5, TimeUnit.SECONDS);
+ servers.put(gatewayName,client);
+ sockets.put(gatewayName,socket);
+ } catch (Throwable t) {
+ throw new ConnectException();
+ }
+ }
+
+ public void disconnect(String gatewayName){
+ WebSocketClient client=servers.remove(gatewayName);
+ SensinactSocket socket=sockets.remove(gatewayName);
+ if(client!=null&&socket.getSession()!=null&&socket.getSession().getRemote()!=null){
+ try {
+ socket.getSession().getRemote().sendString(gatewayName+": Bye bye");
+ client.stop();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }else {
+ logger.warn(String.format("Client %s is not available thus could not be removed from the list of connected websocket servers",gatewayName).toString());
+ }
+ }
+
+ @Override
+ protected Object clone() throws CloneNotSupportedException {
+ throw new CloneNotSupportedException("This class is a singleton and cannot be cloned");
+ }
+
+}
diff --git a/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/toolbar/dialog/BasicListDialog.java b/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/toolbar/dialog/BasicListDialog.java
new file mode 100644
index 0000000..427173e
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/toolbar/dialog/BasicListDialog.java
@@ -0,0 +1,61 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.navigator.device.toolbar.dialog;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.dialogs.ListDialog;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class BasicListDialog extends ListDialog {
+ public BasicListDialog(Shell parent, String title, String message, String[] elements) {
+ super(parent);
+ setTitle(title);
+ setMessage(message);
+ setAddCancelButton(true);
+ setInput(elements);
+ setHelpAvailable(false);
+
+ setContentProvider(new IStructuredContentProvider() {
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ }
+
+ public void dispose() {
+ }
+
+ public Object[] getElements(Object inputElement) {
+ return (String[]) inputElement;
+ }
+ });
+
+ setLabelProvider(new LabelProvider());
+ }
+
+ @Override
+ public String[] getResult() {
+ Object[] result = super.getResult();
+ if (result == null || result.length == 0)
+ return null;
+
+ List<String> list = new ArrayList<String>();
+ for (Object o : result)
+ list.add((String) o);
+
+ return list.toArray(new String[0]);
+ }
+}
diff --git a/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/toolbar/dialog/GatewayConfigDialog.java b/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/toolbar/dialog/GatewayConfigDialog.java
new file mode 100644
index 0000000..fb0f0b7
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/toolbar/dialog/GatewayConfigDialog.java
@@ -0,0 +1,235 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.navigator.device.toolbar.dialog;
+
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.TitleAreaDialog;
+import org.eclipse.sensinact.studio.preferences.GatewayHttpConfig;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.FocusEvent;
+import org.eclipse.swt.events.FocusListener;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.KeyListener;
+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.Spinner;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class GatewayConfigDialog extends TitleAreaDialog {
+
+ // default model values
+ // also used for storing values while closing window
+ private String name = "NewConfiguration";
+ private String address = "";
+ private int port = 8080;
+ private int timeout = 10000;
+ private String username;
+ private String password;
+
+
+ // Widgets
+ private Text nameText;
+ private Text addressText;
+ private Spinner portSpinner;
+ private Spinner timeoutSpinner;
+ private Text usernameText;
+ private Text passwordText;
+ private boolean isEditable;
+ private final String[] gatewayNames;
+
+ public GatewayConfigDialog(Shell parent, String[] gatewayNames) {
+ super(parent);
+ isEditable = true;
+ this.gatewayNames = gatewayNames;
+ this.username = "";
+ this.password = "";
+ }
+
+ public GatewayConfigDialog(Shell parent, String name, String address, int port, int timeout, String username, String password) {
+ super(parent);
+ this.name = name;
+ this.address = address;
+ this.port = port;
+ this.timeout = timeout;
+ this.isEditable = false;
+ this.gatewayNames = null;
+ this.username = username;
+ this.password = password;
+ }
+
+ public GatewayHttpConfig getGateway() {
+ return new GatewayHttpConfig(name, address, port, timeout, username, password);
+ }
+
+ @Override
+ public void create() {
+ super.create();
+ setTitle("New gateway configuration");
+ validateAll(gatewayNames);
+ }
+
+ @Override
+ protected Control createDialogArea(Composite parent) {
+ Composite area = (Composite) super.createDialogArea(parent);
+
+ // container with two columns
+ Composite container = new Composite(area, SWT.NONE);
+ container.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, true));
+ container.setLayout(new GridLayout(2, false));
+
+ // text fields
+ nameText = createTextField(container, "Configuration Name", gatewayNames, name, isEditable, false);
+ addressText = createTextField(container, "Address", gatewayNames, address, true, false);
+ addressText.setToolTipText("The address of the gateway.\navailable addresses:\nhttp://localhost\nhttp://192.168.1.69\nlocalhost\n192.168.1.69");
+
+ // Spinner fields
+ portSpinner = createSpinnerField(container, "Port", 10000, port);
+ timeoutSpinner = createSpinnerField(container, "Timeout (ms)", 60000, timeout);
+
+ // credentials
+ usernameText = createTextField(container, "Username", new String[0], username, true, false);
+ passwordText = createTextField(container, "Password", new String[0], password, true, true);
+
+ return area;
+ }
+
+ private Text createTextField(Composite container, String label, final String[] gatewayNames, String initValue, boolean readOnly, boolean ispassword) {
+
+ // label
+ new Label(container, SWT.NONE).setText(label);
+
+ // field
+ Text text = new Text(container, SWT.BORDER);
+ if (ispassword)
+ text.setEchoChar('*');
+ text.setText(initValue);
+ text.setEditable(readOnly);
+ text.setLayoutData(new GridData(GridData.FILL, SWT.TOP, true, false));
+
+
+ // listeners
+ text.addFocusListener(new FocusListener() {
+ @Override
+ public void focusGained(FocusEvent e) {}
+ @Override
+ public void focusLost(FocusEvent e) {
+ validateAll(gatewayNames);
+ }
+ });
+ text.addKeyListener(new KeyListener() {
+ @Override
+ public void keyPressed(KeyEvent e) {}
+ @Override
+ public void keyReleased(KeyEvent e) {
+ validateAll(gatewayNames);
+ }
+ });
+
+ return text;
+ }
+
+ private Spinner createSpinnerField(Composite container, String label, int maximum, int initValue) {
+
+ // label
+ new Label(container, SWT.NONE).setText(label);
+
+ // field
+ Spinner portSpinner = new Spinner(container, SWT.BORDER);
+ portSpinner.setMaximum(maximum);
+ portSpinner.setSelection(initValue);
+ portSpinner.setLayoutData(new GridData(GridData.FILL, SWT.TOP, true, false));
+
+ return portSpinner;
+ }
+
+ protected void createButtonsForButtonBar(Composite parent) {
+ createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
+ createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
+ }
+
+ @Override
+ protected void okPressed() {
+ this.name = nameText.getText();
+ this.address = addressText.getText();
+ this.port = portSpinner.getSelection();
+ this.timeout = timeoutSpinner.getSelection();
+ this.username = usernameText.getText();
+ this.password = passwordText.getText();
+ super.okPressed();
+ }
+
+ // ==========
+ // Validation
+ // ==========
+
+ private void validateAll(String[] gatewayNames) {
+ String error = getError(gatewayNames);
+ if (error != null) {
+ setErrorMessage(error);
+ getButton(OK).setEnabled(false);
+ } else {
+ setErrorMessage(null);
+ getButton(OK).setEnabled(true);
+ }
+ }
+
+ private String getError(String[] gatewayNames) {
+ String nameError = checkName(gatewayNames);
+ if (nameError != null) {
+ return nameError;
+ }
+
+ String addressError = checkAddress();
+ if (addressError != null) {
+ return addressError;
+ }
+
+ return null;
+ }
+
+ private String checkName(String[] gatewayNames) {
+ String name = nameText.getText();
+ if (name.trim().equals("")) {
+ return "The configuration name must be set";
+ }
+ if (gatewayNames != null) {
+ for (String gatewayName : gatewayNames) {
+ if (gatewayName.trim().equals(name.trim()))
+ return "The gateway " + name + " already exists";
+ }
+ }
+
+ return null;
+ }
+
+ private String checkAddress() {
+ String address = addressText.getText().trim();
+ if (address.equals("")) {
+ return "The gateway address must be set";
+ }
+
+ boolean isLocalhost = address.equals("localhost") || address.equals("http://localhost");
+ boolean isIPv4 = address.matches("^(http://)?[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$");
+ boolean isDnsName = address.matches("^(http://)?[0-9A-Za-z\\.]+\\.[A-Za-z]{2,8}$");
+ if (!isLocalhost && !isIPv4 & !isDnsName) {
+ return "The gateway address is not well formed";
+ }
+
+ return null;
+ }
+}
diff --git a/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/ui/dialogs/resourceInvoker/ParametersComposite.java b/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/ui/dialogs/resourceInvoker/ParametersComposite.java
new file mode 100644
index 0000000..40b6e33
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/ui/dialogs/resourceInvoker/ParametersComposite.java
@@ -0,0 +1,129 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.navigator.device.ui.dialogs.resourceInvoker;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.sensinact.studio.http.client.GatewayHttpClient.RequestParameter;
+import org.eclipse.sensinact.studio.navigator.device.ui.dialogs.resourceInvoker.parameterfield.ParameterField;
+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.sensinact.studio.resource.AccessMethod;
+import org.eclipse.sensinact.studio.resource.Parameter;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class ParametersComposite {
+
+ private Composite globalComposite;
+ private Label header;
+ private Composite parameterListComposite;
+ private List<ParameterField> fields = new ArrayList<>();
+
+ ParametersComposite(Composite area) {
+ globalComposite = new Composite(area, SWT.NONE);
+ globalComposite.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false, 1, 1));
+ globalComposite.setLayout(new GridLayout(1, false));
+ globalComposite.setVisible(false);
+
+ initHeader();
+ initparameterListComposite(false);
+ }
+
+ private void initHeader() {
+ header = new Label(globalComposite, SWT.NONE);
+ header.setText("Parameters:");
+ }
+
+ private void initparameterListComposite(boolean visible) {
+ parameterListComposite = new Composite(globalComposite, SWT.BORDER);
+ parameterListComposite.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false, 1, 1));
+ parameterListComposite.setLayout(new GridLayout(3, false));
+ parameterListComposite.setVisible(visible);
+ }
+
+ private void init() {
+ initHeader();
+ initparameterListComposite(true);
+ }
+
+ /**
+ * This method is in charge of clearing the parameter composite by disposing
+ * all its children (the label as well as the parameter list) When the
+ * parameter composite is cleared, it is layouted
+ */
+ void clearContent() {
+ for (Control children : globalComposite.getChildren())
+ if (children != null && !children.isDisposed())
+ children.dispose();
+ globalComposite.layout(true);
+ fields.clear();
+ }
+
+ /**
+ * This method create the parameter list according to the access method
+ * (type and signature) selected. It begins to clear the parameter parameter
+ * composite if it already contains children (i.e. is an other access method
+ * has been selected before)
+ *
+ * @param AccessMethod
+ * accessMethod : the current access method
+ */
+ void createParameterList(AccessMethod accessMethod) {
+ clearContent();
+
+ if (accessMethod.getParameter().size() == 0)
+ return;
+
+ init();
+
+ // For each parameter
+ for (int i = 0; i < accessMethod.getParameter().size(); i++) {
+ final Parameter parameter = accessMethod.getParameter().get(i);
+ String name = parameter.getName();
+ String type = parameter.getType();
+ ParameterField field = ParameterField.create(parameterListComposite, name, type);
+ fields.add(field);
+ }
+
+ globalComposite.setVisible(true);
+ globalComposite.layout(true);
+ }
+
+ public RequestParameter[] getParametersValues(AccessMethod accessMethod) {
+ List<RequestParameter> params = new ArrayList<>();
+ if (accessMethod != null) {
+ for (int i = 0; i < accessMethod.getParameter().size(); i++) {
+ Parameter parameter = accessMethod.getParameter().get(i);
+ String name = parameter.getName();
+ String type = parameter.getType();
+ String value = getParameterValue(name);
+ params.add(new RequestParameter(name, type, value));
+ }
+ }
+ return params.toArray(new RequestParameter[0]);
+ }
+
+ private String getParameterValue(String name) {
+ for (ParameterField field : fields)
+ if (field.getName().equals(name))
+ return field.getValue();
+ throw new RuntimeException("No available field with name " + name);
+ }
+}
+
diff --git a/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/ui/dialogs/resourceInvoker/ResourceInvokerDialog.java b/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/ui/dialogs/resourceInvoker/ResourceInvokerDialog.java
new file mode 100644
index 0000000..4d64678
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/ui/dialogs/resourceInvoker/ResourceInvokerDialog.java
@@ -0,0 +1,242 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.navigator.device.ui.dialogs.resourceInvoker;
+
+import org.apache.log4j.Logger;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.TitleAreaDialog;
+import org.eclipse.sensinact.studio.http.client.GatewayHttpClient;
+import org.eclipse.sensinact.studio.http.client.GatewayHttpClient.RequestParameter;
+import org.eclipse.sensinact.studio.http.client.snamessage.SnaMessage;
+import org.eclipse.sensinact.studio.model.manager.listener.subscription.SubscriptionListener;
+import org.eclipse.sensinact.studio.model.manager.listener.subscription.SubscriptionManager;
+import org.eclipse.sensinact.studio.model.resource.utils.ResourceDescriptor;
+import org.eclipse.sensinact.studio.model.resource.utils.Segments;
+import org.eclipse.sensinact.studio.navigator.device.ui.dialogs.resourceInvoker.methodprovider.MethodProvider;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseListener;
+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.sensinact.studio.resource.AccessMethod;
+import org.eclipse.sensinact.studio.resource.AccessMethodType;
+
+/**
+ * @author Nicolas Hili
+ */
+public class ResourceInvokerDialog extends TitleAreaDialog implements SubscriptionListener {
+
+ private static final Logger logger = Logger.getLogger(ResourceInvokerDialog.class);
+
+ private final ResourceDescriptor descriptor;
+ private final MethodProvider methodProvider;
+
+ private ParametersComposite parameterComposite;
+ private ResultLabel resultLabel;
+
+ public ResourceInvokerDialog(Shell parent, ResourceDescriptor descriptor, MethodProvider methodProvider) {
+ super(parent);
+
+ this.descriptor = descriptor;
+
+ this.methodProvider = methodProvider;
+ methodProvider.registerResourceInvokerDialog(this);
+ setHelpAvailable(false);
+ }
+
+ @Override
+ public void create() {
+ super.create();
+ setTitle("Resource Invoker");
+ setShellStyle(SWT.DIALOG_TRIM | SWT.RESIZE | SWT.MAX);
+ }
+
+ @Override
+ protected Control createDialogArea(Composite parent) {
+ Composite area = (Composite) super.createDialogArea(parent);
+ configureDialogArea(area);
+
+ methodProvider.createDialogArea(area);
+ parameterComposite = new ParametersComposite(area);
+ resultLabel = new ResultLabel(area);
+
+ return area;
+ }
+
+ @Override
+ protected Control createContents(Composite parent) {
+ Control control = super.createContents(parent);
+ updateWidgets();
+ return control;
+ }
+
+
+ private static void configureDialogArea(Composite area) {
+ GridLayout gridLayout = (GridLayout) area.getLayout();
+ gridLayout.marginRight = 5;
+ gridLayout.marginLeft = 5;
+ GridData gridData = (GridData) area.getLayoutData();
+ gridData.widthHint = 640;
+ }
+
+ @Override
+ protected void createButtonsForButtonBar(Composite parent) {
+ createButton(parent, IDialogConstants.PROCEED_ID, "Proceed", true);
+ getButton(IDialogConstants.PROCEED_ID).setEnabled(false);
+ super.createButtonsForButtonBar(parent);
+ getButton(OK).setVisible(false);
+ getButton(CANCEL).setText("Close");
+ setDialogHelpAvailable(false);
+ getButton(IDialogConstants.PROCEED_ID).addMouseListener(new MouseListener() {
+ @Override
+ public void mouseUp(MouseEvent e) {
+ launchRequest(e);
+ }
+
+ @Override
+ public void mouseDown(MouseEvent e) {}
+
+ @Override
+ public void mouseDoubleClick(MouseEvent e) {}
+ });
+ }
+
+ public void updateWidgets() {
+ String type = methodProvider.getAccessMethodType();
+ AccessMethod method = methodProvider.getAccessMethod();
+
+ // update parameters
+ if (method != null) {
+ parameterComposite.createParameterList(method);
+ getShell().pack(true);
+ getShell().setSize(getShell().computeSize(SWT.DEFAULT, SWT.DEFAULT, true));
+ } else {
+ parameterComposite.clearContent();
+ }
+
+ // button value
+ if (type != null) {
+ getButton(IDialogConstants.PROCEED_ID).setText(type);
+ } else {
+ getButton(IDialogConstants.PROCEED_ID).setText("Proceed");
+ }
+
+ // click button
+ if (method != null && type != null) {
+ getButton(IDialogConstants.PROCEED_ID).setEnabled(true);
+ } else {
+ getButton(IDialogConstants.PROCEED_ID).setEnabled(false);
+ }
+ }
+
+ protected void launchRequest(MouseEvent e) {
+ AccessMethodType type = AccessMethodType.get(methodProvider.getAccessMethodType());
+ String message = "";
+ switch (type) {
+ case GET:
+ message = actionPressed();
+ break;
+ case ACT:
+ message = actionPressed();
+ break;
+ case SUBSCRIBE:
+ message = subscribePressed();
+ break;
+ case UNSUBSCRIBE:
+ message = unsubscribePressed();
+ break;
+ case SET:
+ message = actionPressed();
+ break;
+ default:
+ break;
+ }
+
+ resultLabel.setText(message);
+ }
+
+ /**
+ * This method is called when the user selected an ACT/GET/SET access method.
+ * It sends an ACT/GET/SET request to the gateway and get the result of the request
+ * @return the result of the request
+ */
+ private String actionPressed() {
+ try {
+ AccessMethod method = methodProvider.getAccessMethod();
+ AccessMethodType type = method.getType();
+ Segments segments = new Segments.Builder().resource(descriptor).method(type).build();
+ if (type.equals(AccessMethodType.GET)) {
+ return GatewayHttpClient.sendGetRequest(segments).getFullDescription();
+ } else {
+ RequestParameter[] params = parameterComposite.getParametersValues(method);
+ return GatewayHttpClient.sendPostRequest(segments,null, params).getFullDescription();
+ }
+ } catch (Exception e) {
+ logger.error("action failure", e);
+ return "[ERROR] " + e.getMessage();
+ }
+ }
+
+ /**
+ * This method is called when the user selected an GET access method.
+ * It sends an GET request to the gateway and get the result of the request
+ * @return the result of the request
+ */
+ private String subscribePressed()
+ {
+ try {
+ String id = SubscriptionManager.getInstance().subscribeResource(descriptor, this);
+ return "Subscribe success id=" + id;
+ } catch (Exception e) {
+ logger.error("Subscribe failure", e);
+ return "[ERROR] " + e.getMessage();
+ }
+ }
+
+ /**
+ * This method is called when the user selected an UNSUBSCRIBE access method.
+ * It sends an UNSUBSCRIBE request to the gateway using the current subscriptionId
+ * of the resource passed as parameter
+ *
+ * @return the result of the request
+ */
+ private String unsubscribePressed()
+ {
+ try {
+ SubscriptionManager.getInstance().unsubscribeResource(descriptor, this);
+ return "unsubscribe success";
+ } catch (Exception e) {
+ logger.error("Unsubscribe failure",e);
+ return "[ERROR] " + e.getMessage();
+ }
+ }
+
+ @Override
+ public void onEvent(SnaMessage response, ResourceDescriptor resource)
+ {
+// Segments segments = new Segments.Builder().resource(resource
+// ).method(AccessMethodType.GET).build();
+// //String msg = "";
+// try {
+// //msg = GatewayHttpClient.sendGetRequest(segments).getPrettyPrintedValue();
+// } catch (Exception e)
+// {
+// logger.error("unsubscribe failure", e);
+// //msg = e.getMessage();
+// }
+ resultLabel.setText("[SUBSCRIBE EVENT] " + response.getPrettyPrintedValue());
+
+ }
+}
diff --git a/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/ui/dialogs/resourceInvoker/ResultLabel.java b/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/ui/dialogs/resourceInvoker/ResultLabel.java
new file mode 100644
index 0000000..9eeb123
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/ui/dialogs/resourceInvoker/ResultLabel.java
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.navigator.device.ui.dialogs.resourceInvoker;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class ResultLabel {
+
+ /**
+ * The label of the result Text
+ */
+ private Label resultLabel;
+
+ /**
+ * The Text widget to display the return value of the gateway, for an ACT, GET, SET
+ */
+ private Text resultText;
+
+ ResultLabel(Composite area) {
+ resultLabel = new Label(area, SWT.NONE);
+ resultLabel.setText("Result:");
+
+ resultText = new Text(area, SWT.BORDER | SWT.READ_ONLY | SWT.MULTI | SWT.WRAP);
+ GridData gridData = new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1);
+ gridData.heightHint = 5 * resultText.getLineHeight();
+ resultText.setLayoutData(gridData);
+ }
+
+ void setText(String text) {
+ resultText.setText(text);
+ }
+}
diff --git a/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/ui/dialogs/resourceInvoker/methodprovider/APIDefinedMethodProvider.java b/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/ui/dialogs/resourceInvoker/methodprovider/APIDefinedMethodProvider.java
new file mode 100644
index 0000000..4ee8ca9
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/ui/dialogs/resourceInvoker/methodprovider/APIDefinedMethodProvider.java
@@ -0,0 +1,49 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.navigator.device.ui.dialogs.resourceInvoker.methodprovider;
+
+import org.eclipse.sensinact.studio.model.resource.utils.ResourceDescriptor;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+
+import org.eclipse.sensinact.studio.resource.AccessMethod;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class APIDefinedMethodProvider extends MethodProvider {
+
+ private final AccessMethod method;
+
+ public APIDefinedMethodProvider(ResourceDescriptor descriptor, AccessMethod method) {
+ super(descriptor);
+ this.method = method;
+ }
+
+ @Override
+ public Control createDialogArea(Composite area) {
+ return area;
+ }
+
+ protected void updateWidgets() {
+ super.updateWidgets();
+ }
+
+ @Override
+ public String getAccessMethodType() {
+ return method.getType().getLiteral();
+ }
+
+ @Override
+ public AccessMethod getAccessMethod() {
+ return method;
+ }
+}
diff --git a/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/ui/dialogs/resourceInvoker/methodprovider/GUIDefinedMethodProvider.java b/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/ui/dialogs/resourceInvoker/methodprovider/GUIDefinedMethodProvider.java
new file mode 100644
index 0000000..b52ca8e
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/ui/dialogs/resourceInvoker/methodprovider/GUIDefinedMethodProvider.java
@@ -0,0 +1,97 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.navigator.device.ui.dialogs.resourceInvoker.methodprovider;
+
+import org.apache.log4j.Logger;
+import org.eclipse.jface.dialogs.IMessageProvider;
+import org.eclipse.sensinact.studio.model.resource.utils.ResourceDescriptor;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+
+import org.eclipse.sensinact.studio.resource.AccessMethod;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class GUIDefinedMethodProvider extends MethodProvider {
+
+ private MethodComposite methodComposite;
+
+ private static final Logger logger = Logger.getLogger(GUIDefinedMethodProvider.class);
+
+ public GUIDefinedMethodProvider(ResourceDescriptor descriptor) {
+ super(descriptor);
+ }
+
+ @Override
+ public Control createDialogArea(Composite area) {
+ methodComposite = new MethodComposite(area, descriptor) ;
+ addListeners();
+ return area;
+ }
+
+ private void addListeners() {
+ // listeners
+ methodComposite.addTypeComboListener(new SelectionListener() {
+ @Override
+ public void widgetSelected(SelectionEvent event) {
+ updateWidgets();
+ try {
+ methodComposite.updateAccessMethods();
+ } catch (InterruptedException e) {
+ logger.error("Error while updating access methods", e);
+ }
+ }
+ @Override
+ public void widgetDefaultSelected(SelectionEvent e) {}
+ });
+
+ methodComposite.addSignatureComboListener(new SelectionListener() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ updateWidgets();
+ }
+ @Override
+ public void widgetDefaultSelected(SelectionEvent e) {}
+ });
+ }
+
+ protected void updateWidgets() {
+ super.updateWidgets();
+
+ if (getAccessMethod() != null) {
+ setDialogMessage("", IMessageProvider.NONE);
+ } else {
+ if (getAccessMethodType() == null) {
+ setDialogMessage("Select one access method", IMessageProvider.WARNING);
+ } else {
+ setDialogMessage("Multiple signatures for the access method " + getAccessMethodType() + ". Please select one signature", IMessageProvider.INFORMATION);
+ }
+ }
+ }
+
+ @Override
+ public String getAccessMethodType() {
+ return methodComposite.getSelectedAccessMethodType();
+ }
+
+ @Override
+ public AccessMethod getAccessMethod() {
+ try {
+ return methodComposite.getSelectedAccessMethod();
+ } catch (InterruptedException e) {
+ logger.error("Error while getting selected access method", e);
+ return null;
+ }
+ }
+}
diff --git a/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/ui/dialogs/resourceInvoker/methodprovider/MethodComposite.java b/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/ui/dialogs/resourceInvoker/methodprovider/MethodComposite.java
new file mode 100644
index 0000000..357e13c
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/ui/dialogs/resourceInvoker/methodprovider/MethodComposite.java
@@ -0,0 +1,181 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.navigator.device.ui.dialogs.resourceInvoker.methodprovider;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.log4j.Logger;
+import org.eclipse.sensinact.studio.model.manager.modelupdater.ModelEditor;
+import org.eclipse.sensinact.studio.model.resource.utils.ResourceDescriptor;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+
+import org.eclipse.sensinact.studio.resource.AccessMethod;
+import org.eclipse.sensinact.studio.resource.AccessMethodType;
+import org.eclipse.sensinact.studio.resource.Parameter;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class MethodComposite {
+
+ private static final Logger logger = Logger.getLogger(MethodComposite.class);
+
+ /**
+ * A composite to hold both type and signature labels and combo widgets.
+ */
+ private Composite methodComposite;
+
+ /**
+ * The label for the access method type
+ */
+ private Label typeLabel;
+
+ /**
+ * The combo widget for the access method type (SET, ACT, etc.)
+ */
+ private Combo typeCombo;
+
+ /**
+ * The label for the signatures of a particular access method
+ */
+ private Label signatureLabel;
+
+ /**
+ * The combo widget for the access method signature
+ */
+ private Combo signatureCombo;
+
+ private final ResourceDescriptor descriptor;
+
+ MethodComposite(Composite area, ResourceDescriptor descriptor) {
+
+ this.descriptor = descriptor;
+
+ methodComposite = new Composite(area, SWT.BORDER);
+ methodComposite.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false, 1, 1));
+ methodComposite.setLayout(new GridLayout(2, true));
+
+ typeLabel = new Label(methodComposite, SWT.NONE);
+ typeLabel.setText("Type:");
+
+ signatureLabel = new Label(methodComposite, SWT.NONE);
+ signatureLabel.setText("Signature:");
+ signatureLabel.setVisible(false);
+
+ typeCombo = new Combo(methodComposite, SWT.NONE | SWT.DROP_DOWN | SWT.READ_ONLY);
+
+ // populate type combo
+ ArrayList<String> items = new ArrayList<String>();
+ items.add("Choose type...");
+
+ try {
+ for (AccessMethod accessMethod : ModelEditor.getInstance().getAccessMethods(descriptor)) {
+ String type = accessMethod.getType().getLiteral();
+ if (!items.contains(type)) {
+ items.add(type);
+ }
+ }
+ } catch (InterruptedException e) {
+ logger.error("Error while getting access methods");
+ }
+
+ typeCombo.setItems(items.toArray(new String[]{}));
+ typeCombo.select(0);
+ typeCombo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
+ signatureCombo = new Combo(methodComposite, SWT.NONE | SWT.DROP_DOWN | SWT.READ_ONLY);
+ signatureCombo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
+ signatureCombo.setVisible(false);
+ }
+
+ void updateAccessMethods() throws InterruptedException {
+ String type = getSelectedAccessMethodType();
+
+ // if the user did not choose an access method
+ if (type == null) {
+ setVisibleSignature(false);
+ } else {
+ // Get all access methods for this type
+ List<AccessMethod> accessMethods = ModelEditor.getInstance().getAccessMethodsWithType(descriptor, AccessMethodType.get(type));
+
+ // Fill the signature combo
+ if (accessMethods.size() > 1) {
+ signatureCombo.clearSelection();
+ ArrayList<String> signatures = new ArrayList<String>();
+ signatures.add("Choose signature...");
+ for (AccessMethod accessMethod : accessMethods) {
+ String signature = "";
+ for (Parameter parameter : accessMethod.getParameter())
+ signature = signature.concat(parameter.getName() + " : " + parameter.getType() + ", ");
+ if (signature.endsWith(", "))
+ signature = signature.substring(0, signature.length()-2);
+ if (signature.equals(""))
+ signature = "<no parameter>";
+ signatures.add(signature);
+ }
+ signatureCombo.setItems(signatures.toArray(new String[]{}));
+ signatureCombo.select(0);
+
+ // Display signature combo and label
+ setVisibleSignature(true);
+ }
+
+ // If there is only one access method, create the parameterList
+ else {
+ setVisibleSignature(false);
+ }
+ }
+ }
+
+ String getSelectedAccessMethodType() {
+ int index = typeCombo.getSelectionIndex();
+ if (index == 0)
+ return null;
+ else
+ return typeCombo.getItem(index);
+ }
+
+ AccessMethod getSelectedAccessMethod() throws InterruptedException {
+ String type = getSelectedAccessMethodType();
+
+ if (type == null)
+ return null;
+
+ List<AccessMethod> accessMethods = ModelEditor.getInstance().getAccessMethodsWithType(descriptor, AccessMethodType.get(type));
+ if (accessMethods.size() > 1) {
+ int index = signatureCombo.getSelectionIndex();
+ if (index == 0 || index == -1)
+ return null;
+ return ModelEditor.getInstance().getAccessMethodsWithType(descriptor, AccessMethodType.get(type)).get(index-1);
+ } else {
+ return accessMethods.get(0);
+ }
+ }
+
+ void addTypeComboListener(SelectionListener listener) {
+ typeCombo.addSelectionListener(listener);
+ }
+
+ void addSignatureComboListener(SelectionListener listener) {
+ signatureCombo.addSelectionListener(listener);
+ }
+
+ private void setVisibleSignature(boolean isVisible) {
+ signatureCombo.setVisible(isVisible);
+ signatureLabel.setVisible(isVisible);
+ }
+}
diff --git a/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/ui/dialogs/resourceInvoker/methodprovider/MethodProvider.java b/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/ui/dialogs/resourceInvoker/methodprovider/MethodProvider.java
new file mode 100644
index 0000000..b385b23
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/ui/dialogs/resourceInvoker/methodprovider/MethodProvider.java
@@ -0,0 +1,50 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.navigator.device.ui.dialogs.resourceInvoker.methodprovider;
+
+import org.eclipse.sensinact.studio.model.resource.utils.ResourceDescriptor;
+import org.eclipse.sensinact.studio.navigator.device.ui.dialogs.resourceInvoker.ResourceInvokerDialog;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+
+import org.eclipse.sensinact.studio.resource.AccessMethod;
+
+/**
+ * @author Etienne Gandrille
+ */
+public abstract class MethodProvider {
+
+ protected ResourceInvokerDialog resourceInvokerDialog;
+
+ protected final ResourceDescriptor descriptor;
+
+ public MethodProvider(ResourceDescriptor descriptor) {
+ this.descriptor = descriptor;
+ }
+
+ protected void setDialogMessage(String message, int type) {
+ resourceInvokerDialog.setMessage(message, type);
+ }
+
+ public abstract Control createDialogArea(Composite parent);
+
+ public abstract String getAccessMethodType();
+
+ public abstract AccessMethod getAccessMethod();
+
+ protected void updateWidgets() {
+ resourceInvokerDialog.updateWidgets();
+ }
+
+ public void registerResourceInvokerDialog(ResourceInvokerDialog resourceInvokerDialog) {
+ this.resourceInvokerDialog = resourceInvokerDialog;
+ }
+}
diff --git a/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/ui/dialogs/resourceInvoker/parameterfield/BooleanField.java b/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/ui/dialogs/resourceInvoker/parameterfield/BooleanField.java
new file mode 100644
index 0000000..2d8b4d2
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/ui/dialogs/resourceInvoker/parameterfield/BooleanField.java
@@ -0,0 +1,58 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.navigator.device.ui.dialogs.resourceInvoker.parameterfield;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.FocusEvent;
+import org.eclipse.swt.events.FocusListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class BooleanField extends ParameterField {
+
+ protected BooleanField(Composite composite, String name, String type) {
+ super(composite, name, type, "false");
+ }
+
+ public static List<String> getAcceptedTypes() {
+ return Arrays.asList("boolean", "bool", "Boolean");
+ }
+
+ protected Control createWidget(Composite parameterListComposite, final String name) {
+
+ final Button control = new Button(parameterListComposite, SWT.CHECK);
+ control.setSelection(false);
+
+ control.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
+
+ control.addFocusListener(new FocusListener() {
+ @Override
+ public void focusLost(FocusEvent e) {
+ String value = Boolean.toString(control.getSelection());
+ setValue(value);
+ }
+
+ @Override
+ public void focusGained(FocusEvent e) {
+ }
+ });
+
+ return control;
+ }
+}
diff --git a/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/ui/dialogs/resourceInvoker/parameterfield/NumberField.java b/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/ui/dialogs/resourceInvoker/parameterfield/NumberField.java
new file mode 100644
index 0000000..da256e1
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/ui/dialogs/resourceInvoker/parameterfield/NumberField.java
@@ -0,0 +1,59 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.navigator.device.ui.dialogs.resourceInvoker.parameterfield;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.FocusEvent;
+import org.eclipse.swt.events.FocusListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Spinner;
+
+
+/**
+ * @author Etienne Gandrille
+ */
+public class NumberField extends ParameterField {
+
+ protected NumberField(Composite composite, String name, String type) {
+ super(composite, name, type, "0");
+ }
+
+ public static List<String> getAcceptedTypes() {
+ return Arrays.asList(Integer.class.getName(), "int", Double.class.getName());
+ }
+
+ protected Control createWidget(Composite parameterListComposite, final String name) {
+
+ final Spinner control = new Spinner(parameterListComposite, SWT.BORDER);
+
+ control.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
+ control.setMaximum(65000); // default is 100
+
+ control.addFocusListener(new FocusListener() {
+ @Override
+ public void focusLost(FocusEvent e) {
+ String value = Integer.toString(control.getSelection());
+ setValue(value);
+ }
+
+ @Override
+ public void focusGained(FocusEvent e) {
+ }
+ });
+
+ return control;
+ }
+}
diff --git a/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/ui/dialogs/resourceInvoker/parameterfield/ParameterField.java b/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/ui/dialogs/resourceInvoker/parameterfield/ParameterField.java
new file mode 100644
index 0000000..b06fa45
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/ui/dialogs/resourceInvoker/parameterfield/ParameterField.java
@@ -0,0 +1,81 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.navigator.device.ui.dialogs.resourceInvoker.parameterfield;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+
+/**
+ * @author Etienne Gandrille
+ */
+public abstract class ParameterField {
+
+ // graphic
+ private Label namelabel;
+ private Control widget;
+ private Label typeLabel;
+
+ // model
+ private String name;
+ private String value;
+
+ public static ParameterField create(Composite composite, String name, String type) {
+
+ if (NumberField.getAcceptedTypes().contains(type))
+ return new NumberField(composite, name, type);
+
+ if (TextField.getAcceptedTypes().contains(type))
+ return new TextField(composite, name, type);
+
+ if (BooleanField.getAcceptedTypes().contains(type))
+ return new BooleanField(composite, name, type);
+
+ throw new RuntimeException("No field available to display variable " + name + " of type " + type);
+ }
+
+ protected ParameterField(Composite composite, String name, String type, String defaultValue) {
+ this.namelabel = createNameLabel(composite, name);
+ this.widget = createWidget(composite, name);
+ this.typeLabel = createTypeLabel(composite, type);
+ this.name = name;
+ this.value = defaultValue;
+ }
+
+ private static Label createNameLabel(Composite composite, String name) {
+ Label label = new Label(composite, SWT.NONE);
+ label.setText(name + ":");
+ return label;
+ }
+
+ protected abstract Control createWidget(Composite parameterListComposite, final String name);
+
+ private static Label createTypeLabel(Composite parameterListComposite, String type) {
+ Label typeLabel = new Label(parameterListComposite, SWT.NONE);
+ typeLabel.setText(type);
+ typeLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
+ return typeLabel;
+ }
+
+ protected void setValue(String value) {
+ this.value = value;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public String getValue() {
+ return value;
+ }
+}
diff --git a/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/ui/dialogs/resourceInvoker/parameterfield/TextField.java b/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/ui/dialogs/resourceInvoker/parameterfield/TextField.java
new file mode 100644
index 0000000..db886f2
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.navigator.device/src/org/eclipse/sensinact/studio/navigator/device/ui/dialogs/resourceInvoker/parameterfield/TextField.java
@@ -0,0 +1,58 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.navigator.device.ui.dialogs.resourceInvoker.parameterfield;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.FocusEvent;
+import org.eclipse.swt.events.FocusListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Text;
+import org.json.JSONObject;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class TextField extends ParameterField {
+
+ protected TextField(Composite composite, String name, String type) {
+ super(composite, name, type, "");
+ }
+
+ public static List<String> getAcceptedTypes() {
+ return Arrays.asList("string", JSONObject.class.getName());
+ }
+
+ protected Control createWidget(Composite parameterListComposite, final String name) {
+
+ final Text control = new Text(parameterListComposite, SWT.BORDER);
+
+ control.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
+
+ control.addFocusListener(new FocusListener() {
+ @Override
+ public void focusLost(FocusEvent e) {
+ String value = control.getText();
+ setValue(value);
+ }
+
+ @Override
+ public void focusGained(FocusEvent e) {
+ }
+ });
+
+ return control;
+ }
+}
diff --git a/ui/org.eclipse.sensinact.studio.perspective/META-INF/MANIFEST.MF b/ui/org.eclipse.sensinact.studio.perspective/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..b96e509
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.perspective/META-INF/MANIFEST.MF
@@ -0,0 +1,15 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Sensinact Studio Main Perspective
+Bundle-SymbolicName: org.eclipse.sensinact.studio.perspective;singleton:=true
+Bundle-Version: 1.0.0.qualifier
+Bundle-Activator: org.eclipse.sensinact.studio.perspective.Activator
+Bundle-Vendor: CEA LETI
+Bundle-RequiredExecutionEnvironment: JavaSE-1.7
+Bundle-ActivationPolicy: lazy
+Export-Package: org.eclipse.sensinact.studio.perspective
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.sensinact.studio.view.outdoor,
+ org.eclipse.sensinact.studio.navigator.device,
+ org.eclipse.sensinact.studio.view.visualizer
+Import-Package: org.osgi.framework
diff --git a/ui/org.eclipse.sensinact.studio.perspective/about.html b/ui/org.eclipse.sensinact.studio.perspective/about.html
new file mode 100644
index 0000000..3b39f88
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.perspective/about.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"><head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 5, 2006</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+
+</body></html>
\ No newline at end of file
diff --git a/ui/org.eclipse.sensinact.studio.perspective/build.properties b/ui/org.eclipse.sensinact.studio.perspective/build.properties
new file mode 100644
index 0000000..1d5ab1a
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.perspective/build.properties
@@ -0,0 +1,19 @@
+#
+# Copyright (c) 2017 CEA.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+# CEA - initial API and implementation and/or initial documentation
+#
+
+source.. = src/
+bin.includes = plugin.xml,\
+ .,\
+ .project,\
+ .classpath,\
+ build.properties,\
+ META-INF/,\
+ .settings/
diff --git a/ui/org.eclipse.sensinact.studio.perspective/plugin.xml b/ui/org.eclipse.sensinact.studio.perspective/plugin.xml
new file mode 100644
index 0000000..ecd94f6
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.perspective/plugin.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Copyright (c) 2017 CEA.
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+
+ Contributors:
+ CEA - initial API and implementation and/or initial documentation
+
+-->
+<?eclipse version="3.4"?>
+<plugin>
+ <extension
+ point="org.eclipse.ui.perspectives">
+ <perspective
+ class="org.eclipse.sensinact.studio.perspective.PerspectiveFactory"
+ fixed="false"
+ id="org.eclipse.sensinact.studio.perspective.main"
+ name="Sensinact Studio">
+ <description>
+ This extension point contributes to add the Sensinact Studio perspective.
+ </description>
+ </perspective>
+ </extension>
+ <extension
+ point="org.eclipse.ui.views">
+ <category
+ id="org.eclipse.sensinact.studio.views.category"
+ name="Sensinact">
+ </category>
+ </extension>
+
+</plugin>
diff --git a/ui/org.eclipse.sensinact.studio.perspective/src/org/eclipse/sensinact/studio/perspective/Activator.java b/ui/org.eclipse.sensinact.studio.perspective/src/org/eclipse/sensinact/studio/perspective/Activator.java
new file mode 100644
index 0000000..108523b
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.perspective/src/org/eclipse/sensinact/studio/perspective/Activator.java
@@ -0,0 +1,43 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.perspective;
+
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+/**
+ * @author Nicolas Hili
+ */
+public class Activator implements BundleActivator {
+
+ private static BundleContext context;
+
+ static BundleContext getContext() {
+ return context;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
+ */
+ public void start(BundleContext bundleContext) throws Exception {
+ Activator.context = bundleContext;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
+ */
+ public void stop(BundleContext bundleContext) throws Exception {
+ Activator.context = null;
+ }
+
+}
diff --git a/ui/org.eclipse.sensinact.studio.perspective/src/org/eclipse/sensinact/studio/perspective/PerspectiveFactory.java b/ui/org.eclipse.sensinact.studio.perspective/src/org/eclipse/sensinact/studio/perspective/PerspectiveFactory.java
new file mode 100644
index 0000000..fbe9251
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.perspective/src/org/eclipse/sensinact/studio/perspective/PerspectiveFactory.java
@@ -0,0 +1,44 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.perspective;
+
+import org.eclipse.sensinact.studio.navigator.device.DeviceNavigatorView;
+import org.eclipse.sensinact.studio.view.outdoor.OutdoorDeploymentView;
+import org.eclipse.sensinact.studio.view.visualizer.VisualizerView;
+import org.eclipse.ui.IFolderLayout;
+import org.eclipse.ui.IPageLayout;
+import org.eclipse.ui.IPerspectiveFactory;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class PerspectiveFactory implements IPerspectiveFactory {
+
+ public final static String NAVIGATOR_FOLDER_ID = "org.eclipse.sensinact.studio.folderLayout.navigator";
+ public final static String VIZUALIZER_FOLDER_ID = "org.eclipse.sensinact.studio.folderLayout.visualizer";
+ public final static String DEPLOY_FOLDER_ID = "org.eclipse.sensinact.studio.folderLayout.deploymentView";
+ public final static String GATEWAY_FOLDER_ID = "org.eclipse.sensinact.studio.folderLayout.gateway";
+
+ @Override
+ public void createInitialLayout(IPageLayout layout) {
+ String editorArea = layout.getEditorArea();
+ IFolderLayout navigatorFolderLayout = layout.createFolder(NAVIGATOR_FOLDER_ID, IPageLayout.LEFT, 0.25f,editorArea);
+ IFolderLayout visualizerFolderLayout = layout.createFolder(VIZUALIZER_FOLDER_ID, IPageLayout.BOTTOM, 0.80f, NAVIGATOR_FOLDER_ID);
+ IFolderLayout deploymentViewFolderLayout = layout.createFolder(DEPLOY_FOLDER_ID, IPageLayout.TOP, 0.50f,editorArea);
+
+ navigatorFolderLayout.addView(DeviceNavigatorView.VIEW_ID);
+ navigatorFolderLayout.addView(IPageLayout.ID_PROJECT_EXPLORER);
+
+ visualizerFolderLayout.addView(VisualizerView.VIEW_ID);
+
+ deploymentViewFolderLayout.addView(OutdoorDeploymentView.VIEW_ID);
+ }
+}
diff --git a/ui/org.eclipse.sensinact.studio.ui.common/META-INF/MANIFEST.MF b/ui/org.eclipse.sensinact.studio.ui.common/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..dd85b29
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.ui.common/META-INF/MANIFEST.MF
@@ -0,0 +1,15 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Common
+Bundle-SymbolicName: org.eclipse.sensinact.studio.ui.common
+Bundle-Version: 1.0.0.qualifier
+Bundle-Activator: org.eclipse.sensinact.studio.ui.common.Activator
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime
+Bundle-RequiredExecutionEnvironment: JavaSE-1.7
+Bundle-ActivationPolicy: lazy
+Export-Package: org.eclipse.sensinact.studio.ui.common.dialog,
+ org.eclipse.sensinact.studio.ui.common.images,
+ org.eclipse.sensinact.studio.ui.common.notification,
+ org.eclipse.sensinact.studio.ui.common.widget,
+ org.eclipse.sensinact.studio.ui.common.widget.MultiColumnTableWidget
diff --git a/ui/org.eclipse.sensinact.studio.ui.common/about.html b/ui/org.eclipse.sensinact.studio.ui.common/about.html
new file mode 100644
index 0000000..3b39f88
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.ui.common/about.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"><head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 5, 2006</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+
+</body></html>
\ No newline at end of file
diff --git a/ui/org.eclipse.sensinact.studio.ui.common/build.properties b/ui/org.eclipse.sensinact.studio.ui.common/build.properties
new file mode 100644
index 0000000..7f09207
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.ui.common/build.properties
@@ -0,0 +1,17 @@
+#
+# Copyright (c) 2017 CEA.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+# CEA - initial API and implementation and/or initial documentation
+#
+
+source.. = src/,\
+ images/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ images/
diff --git a/ui/org.eclipse.sensinact.studio.ui.common/images/greenCheck-wikipedia.png b/ui/org.eclipse.sensinact.studio.ui.common/images/greenCheck-wikipedia.png
new file mode 100644
index 0000000..d6e292d
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.ui.common/images/greenCheck-wikipedia.png
Binary files differ
diff --git a/ui/org.eclipse.sensinact.studio.ui.common/images/icons/favicon.svg b/ui/org.eclipse.sensinact.studio.ui.common/images/icons/favicon.svg
new file mode 100644
index 0000000..1ec31a7
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.ui.common/images/icons/favicon.svg
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="69.492188"
+ height="69.489998"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.4 r9939"
+ sodipodi:docname="favicon.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1.4"
+ inkscape:cx="303.32414"
+ inkscape:cy="29.145288"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0"
+ inkscape:window-width="1680"
+ inkscape:window-height="984"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Calque 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-102.16797,-632.01)">
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+ x="100"
+ y="680.93359"
+ id="text2985"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan2987"
+ x="100"
+ y="680.93359"><tspan
+ style="fill:#1a9292;fill-opacity:1"
+ id="tspan3757">sN</tspan><tspan
+ style="fill:#fa6417;fill-opacity:1"
+ id="tspan3771">a</tspan></tspan></text>
+ </g>
+</svg>
diff --git a/ui/org.eclipse.sensinact.studio.ui.common/images/icons/icon128.png b/ui/org.eclipse.sensinact.studio.ui.common/images/icons/icon128.png
new file mode 100644
index 0000000..dbcf39e
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.ui.common/images/icons/icon128.png
Binary files differ
diff --git a/ui/org.eclipse.sensinact.studio.ui.common/images/icons/icon16.png b/ui/org.eclipse.sensinact.studio.ui.common/images/icons/icon16.png
new file mode 100644
index 0000000..6e77c8d
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.ui.common/images/icons/icon16.png
Binary files differ
diff --git a/ui/org.eclipse.sensinact.studio.ui.common/images/icons/icon256.png b/ui/org.eclipse.sensinact.studio.ui.common/images/icons/icon256.png
new file mode 100644
index 0000000..1f3ca42
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.ui.common/images/icons/icon256.png
Binary files differ
diff --git a/ui/org.eclipse.sensinact.studio.ui.common/images/icons/icon32.png b/ui/org.eclipse.sensinact.studio.ui.common/images/icons/icon32.png
new file mode 100644
index 0000000..d7e042f
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.ui.common/images/icons/icon32.png
Binary files differ
diff --git a/ui/org.eclipse.sensinact.studio.ui.common/images/icons/icon48.png b/ui/org.eclipse.sensinact.studio.ui.common/images/icons/icon48.png
new file mode 100644
index 0000000..5a5f200
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.ui.common/images/icons/icon48.png
Binary files differ
diff --git a/ui/org.eclipse.sensinact.studio.ui.common/images/icons/icon64.png b/ui/org.eclipse.sensinact.studio.ui.common/images/icons/icon64.png
new file mode 100644
index 0000000..ed48145
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.ui.common/images/icons/icon64.png
Binary files differ
diff --git a/ui/org.eclipse.sensinact.studio.ui.common/images/loader.gif b/ui/org.eclipse.sensinact.studio.ui.common/images/loader.gif
new file mode 100644
index 0000000..d0bce15
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.ui.common/images/loader.gif
Binary files differ
diff --git a/ui/org.eclipse.sensinact.studio.ui.common/images/lock.gif b/ui/org.eclipse.sensinact.studio.ui.common/images/lock.gif
new file mode 100644
index 0000000..dde3cbd
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.ui.common/images/lock.gif
Binary files differ
diff --git a/ui/org.eclipse.sensinact.studio.ui.common/images/splash.svg b/ui/org.eclipse.sensinact.studio.ui.common/images/splash.svg
new file mode 100644
index 0000000..69d8d4b
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.ui.common/images/splash.svg
@@ -0,0 +1,4467 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="452"
+ height="302"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.4 r9939"
+ sodipodi:docname="dessin.svg"
+ inkscape:export-filename="/home/nj246216/Bureau/dessin.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.68144379"
+ inkscape:cx="802.29166"
+ inkscape:cy="340.47974"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1680"
+ inkscape:window-height="974"
+ inkscape:window-x="0"
+ inkscape:window-y="24"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Calque 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-750.36218)">
+ <rect
+ style="opacity:0.82795697;fill:#ffffff;stroke:none"
+ id="rect3784"
+ width="491.60324"
+ height="344.85605"
+ x="-30.816919"
+ y="735.38812" />
+ <image
+ y="803.5899"
+ x="0.29843709"
+ id="image2992"
+ xlink:href="data:image/png;base64,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
+lk+M957lJ5zix93/HozosR34dyxPr1ixYsWKFStWrFjx/yn8/82cs2LFihUrVqxYsWLF3ydWeXrF
+ihUrVqxYsWLFiqfHKk+vWLFixYoVK1asWPH0WOXpFStWrFixYsWKFSueHqs8vWLFihUrVqxYsWLF
+02OVp1esWLFixYoVK1aseHqs8vSKFStWrFixYsWKFU+PVZ5esWLFihUrVqxYseLpscrTK1asWLFi
+xYoVK1Y8PVZ5esWKFStWrFixYsWKp8cqT69YsWLFihUrVqxY8fRY5ekVK1asWLFixYoVK54eqzy9
+YsWKFStWrFixYsXTY5WnV6xYsWLFihUrVqx4evArX/nKv+8+rFixYsWKFStWrFjxHyso6d93H1as
+WLFixYoVK1as+I8Va7zHihUrVqxYsWLFihVPj1WeXrFixYoVK1asWLHi6bHK0ytWrFixYsWKFStW
+PD1WeXrFihUrVqxYsWLFiqfHKk+vWLFixYoVK1asWPH0WOXpFStWrFixYsWKFSueHqs8vWLFihUr
+VqxYsWLF02OVp1esWLFixYoVK1aseHqs8vSKFStWrFixYsWKFU+PVZ5esWLFihUrVqxYseLpscrT
+K1asWLFixYoVK1Y8Pf5f4oNuhzMZVbgAAAAASUVORK5CYII=
+"
+ height="248.07431"
+ width="448.44968"
+ inkscape:export-filename="/home/nj246216/Bureau/image3015.bmp.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ style="opacity:0.82795697000000001;fill:#f2f2f2;stroke:none;stroke-width:0.73109131999999999"
+ id="rect2995"
+ width="455.18536"
+ height="305.5032"
+ x="-1.6019229"
+ y="749.92841"
+ inkscape:export-filename="/home/nj246216/Bureau/image3015.bmp.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <image
+ y="841.05444"
+ x="38.711227"
+ id="image3004"
+ xlink:href="data:image/png;base64,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 QyerZIMAAAAASUVORK5CYII= "
+ height="80"
+ width="390"
+ inkscape:export-filename="/home/nj246216/Bureau/image3015.bmp.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <image
+ y="994.05859"
+ x="38.729496"
+ id="image3015"
+ xlink:href="data:image/png;base64,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 "
+ height="44.580276"
+ width="54.811813"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ </g>
+</svg>
diff --git a/ui/org.eclipse.sensinact.studio.ui.common/src/org/eclipse/sensinact/studio/ui/common/Activator.java b/ui/org.eclipse.sensinact.studio.ui.common/src/org/eclipse/sensinact/studio/ui/common/Activator.java
new file mode 100644
index 0000000..13fb170
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.ui.common/src/org/eclipse/sensinact/studio/ui/common/Activator.java
@@ -0,0 +1,60 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.ui.common;
+
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class Activator extends AbstractUIPlugin {
+
+ // The plug-in ID
+ public static final String PLUGIN_ID = "org.eclipse.sensinact.studio.ui.common"; //$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)
+ */
+ 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)
+ */
+ 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;
+ }
+
+}
diff --git a/ui/org.eclipse.sensinact.studio.ui.common/src/org/eclipse/sensinact/studio/ui/common/color/Colors.java b/ui/org.eclipse.sensinact.studio.ui.common/src/org/eclipse/sensinact/studio/ui/common/color/Colors.java
new file mode 100644
index 0000000..6548e38
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.ui.common/src/org/eclipse/sensinact/studio/ui/common/color/Colors.java
@@ -0,0 +1,54 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.ui.common.color;
+
+import java.util.HashMap;
+
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class Colors {
+
+ private static Colors INSTANCE = null;
+ private HashMap<RGB, Color> cache = new HashMap<>();
+
+ public final Color RED;
+ public final Color GREEN;
+ public final Color BLUE;
+
+ private Colors() {
+ RED = getColor(255, 0, 0);
+ GREEN = getColor(0, 255, 0);
+ BLUE = getColor(0, 0, 255);
+ }
+
+ public static Colors getINSTANCE() {
+ if (INSTANCE == null)
+ INSTANCE = new Colors();
+ return INSTANCE;
+ }
+
+ public Color getColor(int r, int g, int b) {
+ return getColor(new RGB(r, g, b));
+ }
+
+ public Color getColor(RGB rgb) {
+ Color color = cache.get(rgb);
+ if (color == null) {
+ color = new Color(Display.getCurrent(), rgb.r, rgb.g, rgb.b);
+ cache.put(rgb, color);
+ }
+ return color;
+ }
+}
diff --git a/ui/org.eclipse.sensinact.studio.ui.common/src/org/eclipse/sensinact/studio/ui/common/color/RGB.java b/ui/org.eclipse.sensinact.studio.ui.common/src/org/eclipse/sensinact/studio/ui/common/color/RGB.java
new file mode 100644
index 0000000..5e5d6f6
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.ui.common/src/org/eclipse/sensinact/studio/ui/common/color/RGB.java
@@ -0,0 +1,63 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.ui.common.color;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class RGB {
+
+ public final int r;
+ public final int g;
+ public final int b;
+
+ public RGB(int r, int g, int b) {
+ if (r < 0 || r > 255)
+ throw new IllegalArgumentException("r should be between 1 and 255");
+ if (g < 0 || g > 255)
+ throw new IllegalArgumentException("g should be between 1 and 255");
+ if (b < 0 || b > 255)
+ throw new IllegalArgumentException("b should be between 1 and 255");
+ this.r = r;
+ this.g = g;
+ this.b = b;
+ }
+
+ @Override
+ public String toString() {
+ return r + "/" + g + "/" + b;
+ }
+
+ @Override
+ public int hashCode() {
+ return toString().hashCode();
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj == null)
+ return false;
+
+ if (obj == this)
+ return true;
+
+ if (obj instanceof RGB) {
+ RGB other = (RGB) obj;
+
+ if (this.r != other.r || this.g != other.g || this.b != other.b) {
+ return false;
+ }
+
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/ui/org.eclipse.sensinact.studio.ui.common/src/org/eclipse/sensinact/studio/ui/common/dialog/ShellUtil.java b/ui/org.eclipse.sensinact.studio.ui.common/src/org/eclipse/sensinact/studio/ui/common/dialog/ShellUtil.java
new file mode 100644
index 0000000..ddceaf2
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.ui.common/src/org/eclipse/sensinact/studio/ui/common/dialog/ShellUtil.java
@@ -0,0 +1,30 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.ui.common.dialog;
+
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class ShellUtil {
+
+ public static Shell getShell(Control control) {
+ while (control != null && !(control instanceof Shell))
+ control = control.getParent();
+
+ if (control == null)
+ return null;
+
+ return (Shell) control;
+ }
+}
diff --git a/ui/org.eclipse.sensinact.studio.ui.common/src/org/eclipse/sensinact/studio/ui/common/dialog/SimpleDialog.java b/ui/org.eclipse.sensinact.studio.ui.common/src/org/eclipse/sensinact/studio/ui/common/dialog/SimpleDialog.java
new file mode 100644
index 0000000..a79fede
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.ui.common/src/org/eclipse/sensinact/studio/ui/common/dialog/SimpleDialog.java
@@ -0,0 +1,50 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.ui.common.dialog;
+
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class SimpleDialog extends MessageDialog {
+
+ /**
+ * Create a message dialog. Note that the dialog will have no visual
+ * representation (no widgets) until it is told to open.
+ *
+ * @param parentShell
+ * the parent shell, or <code>null</code> to create a top-level shell
+ * @param dialogTitle
+ * the dialog title, or <code>null</code> if none
+ * @param dialogMessage
+ * the dialog message
+ * @param dialogImageType
+ * one of the following values:
+ * <ul>
+ * <li><code>MessageDialog.NONE</code> for a dialog with no
+ * image</li>
+ * <li><code>MessageDialog.ERROR</code> for a dialog with an
+ * error image</li>
+ * <li><code>MessageDialog.INFORMATION</code> for a dialog
+ * with an information image</li>
+ * <li><code>MessageDialog.QUESTION </code> for a dialog with a
+ * question image</li>
+ * <li><code>MessageDialog.WARNING</code> for a dialog with a
+ * warning image</li>
+ * </ul>
+ */
+ public SimpleDialog(Shell parentShell, String dialogTitle, String dialogMessage, int dialogImageType) {
+ super(parentShell, dialogTitle, null, dialogMessage, dialogImageType, new String[] { IDialogConstants.OK_LABEL, }, 0);
+ }
+}
diff --git a/ui/org.eclipse.sensinact.studio.ui.common/src/org/eclipse/sensinact/studio/ui/common/dialog/SnaHandler.java b/ui/org.eclipse.sensinact.studio.ui.common/src/org/eclipse/sensinact/studio/ui/common/dialog/SnaHandler.java
new file mode 100644
index 0000000..1306292
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.ui.common/src/org/eclipse/sensinact/studio/ui/common/dialog/SnaHandler.java
@@ -0,0 +1,43 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+
+package org.eclipse.sensinact.studio.ui.common.dialog;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.jface.viewers.DoubleClickEvent;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.handlers.HandlerUtil;
+
+/**
+ * @author Etienne Gandrille
+ */
+public abstract class SnaHandler extends AbstractHandler {
+
+ protected Shell getShell(ExecutionEvent event) {
+ return HandlerUtil.getActiveWorkbenchWindow(event).getShell();
+ }
+
+ protected Object getSelectedElement(ExecutionEvent event) {
+ ISelection selection = HandlerUtil.getCurrentSelection(event);
+ if (selection != null && selection instanceof IStructuredSelection) {
+ IStructuredSelection structuredSelection = (IStructuredSelection) selection;
+ return structuredSelection.getFirstElement();
+ }
+ return null;
+ }
+
+ public static Shell getShell(DoubleClickEvent event) {
+ return event.getViewer().getControl().getShell();
+ }
+}
diff --git a/ui/org.eclipse.sensinact.studio.ui.common/src/org/eclipse/sensinact/studio/ui/common/images/StudioImage.java b/ui/org.eclipse.sensinact.studio.ui.common/src/org/eclipse/sensinact/studio/ui/common/images/StudioImage.java
new file mode 100644
index 0000000..efb8e55
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.ui.common/src/org/eclipse/sensinact/studio/ui/common/images/StudioImage.java
@@ -0,0 +1,41 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.ui.common.images;
+
+import java.net.URL;
+
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.swt.graphics.Image;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.FrameworkUtil;
+
+/**
+ * @author Etienne Gandrille
+ */
+public enum StudioImage {
+
+ OK("images/greenCheck-wikipedia.png"), LOAD("images/loader.gif"), LOCK("images/lock.gif");
+
+ private final Image image;
+
+ private StudioImage(String path) {
+ Bundle bundle = FrameworkUtil.getBundle(this.getClass());
+ URL url = FileLocator.find(bundle, new Path(path), null);
+ ImageDescriptor imageDescriptor = ImageDescriptor.createFromURL(url);
+ image = imageDescriptor.createImage();
+ }
+
+ public Image getImage() {
+ return image;
+ }
+}
diff --git a/ui/org.eclipse.sensinact.studio.ui.common/src/org/eclipse/sensinact/studio/ui/common/notification/FontCache.java b/ui/org.eclipse.sensinact.studio.ui.common/src/org/eclipse/sensinact/studio/ui/common/notification/FontCache.java
new file mode 100644
index 0000000..400c999
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.ui.common/src/org/eclipse/sensinact/studio/ui/common/notification/FontCache.java
@@ -0,0 +1,192 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.ui.common.notification;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.FontData;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * Caching class for fonts. Also deals with re-creating fonts should they have been disposed when the
+ * caller asks for a font.
+ */
+public class FontCache {
+
+ private static List<OneFont> _existing = new ArrayList<OneFont>();
+
+ /**
+ * Disposes all fonts and clears out the cache. Never call this unless you are shutting down your
+ * code/client/etc.
+ */
+ public static void disposeAll() {
+ for (OneFont of : _existing) {
+ if (of.getFont() != null && !of.getFont().isDisposed()) {
+ of.getFont().dispose();
+ }
+ }
+
+ _existing.clear();
+ }
+
+ /**
+ * Gets a font from existing FontData
+ *
+ * @param fd FontData
+ * @return Font or null on error
+ */
+ public static Font getFont(FontData fd) {
+ try {
+ boolean disposed = false;
+ OneFont toRemove = null;
+ for (OneFont of : _existing) {
+ if (of.matches(fd)) {
+ if (of.getFont().isDisposed()) {
+ disposed = true;
+ toRemove = of;
+ break;
+ }
+
+ return of.getFont();
+ }
+ }
+ if (disposed) {
+ _existing.remove(toRemove);
+ }
+
+ OneFont of = new OneFont(fd);
+ _existing.add(of);
+ return of.getFont();
+ } catch (Exception err) {
+ err.printStackTrace();
+ }
+
+ return null;
+ }
+
+ public static int getCount() {
+ return _existing.size();
+ }
+
+ /**
+ * Gets a font from an existing fonts data.
+ *
+ * @param font Font
+ * @return Font or null on error
+ */
+ public static Font getFont(Font font) {
+ try {
+ if (font == null || font.isDisposed()) return null;
+
+ FontData fd = font.getFontData()[0];
+ return getFont(fd);
+
+ } catch (Exception err) {
+ err.printStackTrace();
+ }
+
+ return null;
+ }
+
+ /**
+ * Gets a font for a given font name and style.
+ *
+ * @param fontName Name of font
+ * @param height Height of font
+ * @param style Style of font
+ * @return Font or null on error
+ */
+ public static Font getFont(String fontName, int height, int style) {
+ try {
+ boolean disposed = false;
+ OneFont toRemove = null;
+ for (OneFont of : _existing) {
+ if (of.getName().equals(fontName) && of.getHeight() == height && of.getStyle() == style) {
+ if (of.getFont().isDisposed()) {
+ disposed = true;
+ toRemove = of;
+ break;
+ }
+ return of.getFont();
+ }
+ }
+ if (disposed) {
+ _existing.remove(toRemove);
+ }
+
+ OneFont of = new OneFont(fontName, height, style);
+ _existing.add(of);
+ return of.getFont();
+ }
+ catch (Exception err) {
+ err.printStackTrace();
+ }
+
+ return null;
+ }
+
+}
+
+class OneFont {
+
+ private String _name;
+ private int _height;
+ private int _style;
+ private Font _font;
+
+ public OneFont(String name, int height, int style) {
+ _name = name;
+ _height = height;
+ _style = style;
+ _font = new Font(Display.getDefault(), name, height, style);
+ }
+
+ public OneFont(FontData fd) {
+ _name = fd.getName();
+ _height = fd.getHeight();
+ _style = fd.getStyle();
+ _font = new Font(Display.getDefault(), fd);
+ }
+
+ public String getName() {
+ return _name;
+ }
+
+ public int getHeight() {
+ return _height;
+ }
+
+ public int getStyle() {
+ return _style;
+ }
+
+ public void setFont(Font font) {
+ _font = font;
+ }
+
+ public Font getFont() {
+ return _font;
+ }
+
+ public boolean matches(FontData fd) {
+ return (fd.getName().equals(_name) && fd.getHeight() == _height && fd.getStyle() == _style);
+ }
+
+ @Override
+ public String toString() {
+ return "Font: " + _name + " " + _height + " " + _style;
+ }
+
+
+
+}
diff --git a/ui/org.eclipse.sensinact.studio.ui.common/src/org/eclipse/sensinact/studio/ui/common/notification/NotifierDialog.java b/ui/org.eclipse.sensinact.studio.ui.common/src/org/eclipse/sensinact/studio/ui/common/notification/NotifierDialog.java
new file mode 100644
index 0000000..9573bd9
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.ui.common/src/org/eclipse/sensinact/studio/ui/common/notification/NotifierDialog.java
@@ -0,0 +1,294 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.ui.common.notification;
+
+// SEE http://hexapixel.com/2009/06/30/creating-a-notification-popup-widget
+
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.sensinact.studio.ui.common.color.Colors;
+import org.eclipse.sensinact.studio.ui.common.images.StudioImage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CLabel;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.FontData;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+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.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Shell;
+
+public class NotifierDialog {
+
+ // how long the the tray popup is displayed after fading in (in milliseconds)
+ private static final int DISPLAY_TIME = 4500;
+ // how long each tick is when fading in (in ms)
+ private static final int FADE_TIMER = 50;
+ // how long each tick is when fading out (in ms)
+ private static final int FADE_IN_STEP = 30;
+ // how many tick steps we use when fading out
+ private static final int FADE_OUT_STEP = 8;
+
+ // how high the alpha value is when we have finished fading in
+ private static final int FINAL_ALPHA = 225;
+
+ // title foreground color
+ private static Color _titleFgColor = Colors.getINSTANCE().getColor(40, 73, 97);
+ // text foreground color
+ private static Color _fgColor = _titleFgColor;
+
+ // shell gradient background color - top
+ private static Color _bgFgGradient = Colors.getINSTANCE().getColor(226, 239, 249);
+ // shell gradient background color - bottom
+ private static Color _bgBgGradient = Colors.getINSTANCE().getColor(177, 211, 243);
+ // shell border color
+ private static Color _borderColor = Colors.getINSTANCE().getColor(40, 73, 97);
+
+ // contains list of all active popup shells
+ private static List<Shell> _activeShells = new ArrayList<Shell>();
+
+ // image used when drawing
+ private static Image _oldImage;
+
+ private static Shell _shell;
+
+ /**
+ * Creates and shows a notification dialog with a specific title, message and a
+ *
+ * @param title
+ * @param message
+ * @param type
+ */
+ public static void notify(String title, String message) {
+ _shell = new Shell(Display.getDefault().getActiveShell(), SWT.NO_FOCUS | SWT.NO_TRIM);
+ _shell.setLayout(new FillLayout());
+ _shell.setForeground(_fgColor);
+ _shell.setBackgroundMode(SWT.INHERIT_DEFAULT);
+ _shell.addListener(SWT.Dispose, new Listener() {
+ @Override
+ public void handleEvent(Event event) {
+ _activeShells.remove(_shell);
+ }
+ });
+
+ final Composite inner = new Composite(_shell, SWT.NONE);
+
+ GridLayout gl = new GridLayout(2, false);
+ gl.marginLeft = 5;
+ gl.marginTop = 0;
+ gl.marginRight = 5;
+ gl.marginBottom = 5;
+
+ inner.setLayout(gl);
+ _shell.addListener(SWT.Resize, new Listener() {
+
+ @Override
+ public void handleEvent(Event e) {
+ try {
+ // get the size of the drawing area
+ Rectangle rect = _shell.getClientArea();
+ // create a new image with that size
+ Image newImage = new Image(Display.getDefault(), Math.max(1, rect.width), rect.height);
+ // create a GC object we can use to draw with
+ GC gc = new GC(newImage);
+
+ // fill background
+ gc.setForeground(_bgFgGradient);
+ gc.setBackground(_bgBgGradient);
+ gc.fillGradientRectangle(rect.x, rect.y, rect.width, rect.height, true);
+
+ // draw shell edge
+ gc.setLineWidth(2);
+ gc.setForeground(_borderColor);
+ gc.drawRectangle(rect.x + 1, rect.y + 1, rect.width - 2, rect.height - 2);
+ // remember to dipose the GC object!
+ gc.dispose();
+
+ // now set the background image on the shell
+ _shell.setBackgroundImage(newImage);
+
+ // remember/dispose old used iamge
+ if (_oldImage != null) {
+ _oldImage.dispose();
+ }
+ _oldImage = newImage;
+ } catch (Exception err) {
+ err.printStackTrace();
+ }
+ }
+ });
+
+ GC gc = new GC(_shell);
+
+ String lines[] = message.split("\n");
+ Point longest = null;
+ int typicalHeight = gc.stringExtent("X").y;
+
+ for (String line : lines) {
+ Point extent = gc.stringExtent(line);
+ if (longest == null) {
+ longest = extent;
+ continue;
+ }
+
+ if (extent.x > longest.x) {
+ longest = extent;
+ }
+ }
+ gc.dispose();
+
+ int minHeight = typicalHeight * lines.length;
+
+ CLabel imgLabel = new CLabel(inner, SWT.NONE);
+ imgLabel.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING | GridData.HORIZONTAL_ALIGN_BEGINNING));
+ imgLabel.setImage(StudioImage.OK.getImage()); // TODO customize here !!!
+
+ CLabel titleLabel = new CLabel(inner, SWT.NONE);
+ titleLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_CENTER));
+ titleLabel.setText(title);
+ titleLabel.setForeground(_titleFgColor);
+ Font f = titleLabel.getFont();
+ FontData fd = f.getFontData()[0];
+ fd.setStyle(SWT.BOLD);
+ fd.height = 11;
+ titleLabel.setFont(FontCache.getFont(fd));
+
+ Label text = new Label(inner, SWT.WRAP);
+ Font tf = text.getFont();
+ FontData tfd = tf.getFontData()[0];
+ tfd.setStyle(SWT.BOLD);
+ tfd.height = 8;
+ text.setFont(FontCache.getFont(tfd));
+ GridData gd = new GridData(GridData.FILL_BOTH);
+ gd.horizontalSpan = 2;
+ text.setLayoutData(gd);
+ text.setForeground(_fgColor);
+ text.setText(message);
+
+ minHeight = 100;
+
+ _shell.setSize(350, minHeight);
+
+ if (Display.getDefault().getActiveShell() == null || Display.getDefault().getActiveShell().getMonitor() == null) { return; }
+
+ Rectangle clientArea = Display.getDefault().getActiveShell().getMonitor().getClientArea();
+
+ int startX = clientArea.x + clientArea.width - 352;
+ int startY = clientArea.y + clientArea.height - 102;
+
+ // move other shells up
+ if (!_activeShells.isEmpty()) {
+ List<Shell> modifiable = new ArrayList<Shell>(_activeShells);
+ Collections.reverse(modifiable);
+ for (Shell shell : modifiable) {
+ Point curLoc = shell.getLocation();
+ shell.setLocation(curLoc.x, curLoc.y - 100);
+ if (curLoc.y - 100 < 0) {
+ _activeShells.remove(shell);
+ shell.dispose();
+ }
+ }
+ }
+
+ _shell.setLocation(startX, startY);
+ _shell.setAlpha(0);
+ _shell.setVisible(true);
+
+ _activeShells.add(_shell);
+
+ fadeIn(_shell);
+ }
+
+ private static void fadeIn(final Shell _shell) {
+ Runnable run = new Runnable() {
+
+ @Override
+ public void run() {
+ try {
+ if (_shell == null || _shell.isDisposed()) { return; }
+
+ int cur = _shell.getAlpha();
+ cur += FADE_IN_STEP;
+
+ if (cur > FINAL_ALPHA) {
+ _shell.setAlpha(FINAL_ALPHA);
+ startTimer(_shell);
+ return;
+ }
+
+ _shell.setAlpha(cur);
+ Display.getDefault().timerExec(FADE_TIMER, this);
+ } catch (Exception err) {
+ err.printStackTrace();
+ }
+ }
+
+ };
+ Display.getDefault().timerExec(FADE_TIMER, run);
+ }
+
+ private static void startTimer(final Shell _shell) {
+ Runnable run = new Runnable() {
+
+ @Override
+ public void run() {
+ try {
+ if (_shell == null || _shell.isDisposed()) { return; }
+
+ fadeOut(_shell);
+ } catch (Exception err) {
+ err.printStackTrace();
+ }
+ }
+
+ };
+ Display.getDefault().timerExec(DISPLAY_TIME, run);
+
+ }
+
+ private static void fadeOut(final Shell _shell) {
+ final Runnable run = new Runnable() {
+
+ @Override
+ public void run() {
+ try {
+ if (_shell == null || _shell.isDisposed()) { return; }
+
+ if (_oldImage != null) {
+ _oldImage.dispose();
+ }
+ _shell.dispose();
+ _activeShells.remove(_shell);
+ return;
+
+ } catch (Exception err) {
+ err.printStackTrace();
+ }
+ }
+
+ };
+ Display.getDefault().timerExec(FADE_TIMER, run);
+
+ }
+
+}
diff --git a/ui/org.eclipse.sensinact.studio.ui.common/src/org/eclipse/sensinact/studio/ui/common/widget/AbstractEditor.java b/ui/org.eclipse.sensinact.studio.ui.common/src/org/eclipse/sensinact/studio/ui/common/widget/AbstractEditor.java
new file mode 100644
index 0000000..5f6791f
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.ui.common/src/org/eclipse/sensinact/studio/ui/common/widget/AbstractEditor.java
@@ -0,0 +1,73 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.ui.common.widget;
+
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.jface.viewers.ViewerComparator;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * An editor is a dialog part. From SWT point of view, it's a composite composed
+ * of a few SWT widgets. Here is a base class for implementing editors, such as
+ * list editors and map editors.
+ *
+ * @author Etienne Gandrille
+ */
+public abstract class AbstractEditor {
+
+ /** The parent Shell */
+ protected Shell shell;
+
+ // labels
+ protected final String addLabel = "Add";
+ protected final String removeLabel = "Remove";
+
+ /** The JFace viewer */
+ protected StructuredViewer jFaceViewer;
+
+ /** The main composite for this widget. */
+ protected Composite widgetComposite;
+
+ public AbstractEditor(Composite parent) {
+ this.shell = parent.getShell();
+ }
+
+ /**
+ * Sets the comparator, for sorting values.
+ *
+ * @param comparator
+ * the new comparator
+ */
+ public void setComparator(ViewerComparator comparator) {
+ jFaceViewer.setComparator(comparator);
+ refresh();
+ }
+
+ /**
+ * Gets the default comparator.
+ *
+ * @return the default comparator
+ */
+ protected abstract ViewerComparator getDefaultComparator();
+
+ /**
+ * Sets the composite layout data.
+ */
+ public void setLayoutData(Object layoutData) {
+ widgetComposite.setLayoutData(layoutData);
+ }
+
+ /**
+ * Repaints the widget.
+ */
+ public abstract void refresh();
+}
diff --git a/ui/org.eclipse.sensinact.studio.ui.common/src/org/eclipse/sensinact/studio/ui/common/widget/ComboField.java b/ui/org.eclipse.sensinact.studio.ui.common/src/org/eclipse/sensinact/studio/ui/common/widget/ComboField.java
new file mode 100644
index 0000000..68fe0bc
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.ui.common/src/org/eclipse/sensinact/studio/ui/common/widget/ComboField.java
@@ -0,0 +1,72 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.ui.common.widget;
+
+import java.util.List;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class ComboField extends KeyValueField {
+
+ private final List<String> keyList;
+
+ public ComboField(List<String> keyList) {
+ this.keyList = keyList;
+ }
+
+ @Override
+ protected Control createControl(Composite parent) {
+ Combo combo = new Combo(parent, SWT.BORDER);
+ for (String key : keyList)
+ combo.add(key);
+
+ // combo.select(0); // less visual confusion is nothing is selected at
+
+ return combo;
+ }
+
+ @Override
+ public String getValue() {
+ Combo combo = (Combo) getControl();
+ return combo.getText();
+ }
+
+ @Override
+ public void setValue(String value) {
+ Combo combo = (Combo) getControl();
+ combo.select(getIndex(value));
+ }
+
+ @Override
+ public void resetValue() {
+ Combo combo = (Combo) getControl();
+ combo.select(0);
+ }
+
+ private int getIndex(String value) {
+ Combo combo = (Combo) getControl();
+ for (int i = 0; i < combo.getItemCount(); i++) {
+ String name = combo.getItem(i);
+ if (name.equals(value))
+ return i;
+ }
+
+ // not found. A general purpose implementation would return -1 or throw
+ // an exception
+ return 0;
+ }
+}
diff --git a/ui/org.eclipse.sensinact.studio.ui.common/src/org/eclipse/sensinact/studio/ui/common/widget/KeyValueEditor.java b/ui/org.eclipse.sensinact.studio.ui.common/src/org/eclipse/sensinact/studio/ui/common/widget/KeyValueEditor.java
new file mode 100644
index 0000000..fa65a76
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.ui.common/src/org/eclipse/sensinact/studio/ui/common/widget/KeyValueEditor.java
@@ -0,0 +1,340 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.ui.common.widget;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.jface.dialogs.IInputValidator;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.ColumnLabelProvider;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.TableViewerColumn;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerComparator;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ControlEvent;
+import org.eclipse.swt.events.ControlListener;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseListener;
+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.Shell;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+
+/**
+ * Base class for implementing key value editors.
+ *
+ * @author Etienne Gandrille
+ */
+public class KeyValueEditor extends AbstractEditor {
+
+ private final Map<String, String> model;
+
+ // header widgets
+ private final KeyValueField keyField;
+ private final KeyValueField valueField;
+
+ // validators
+ private IInputValidator keyValidator = null;
+ private IInputValidator valueValidator = null;
+
+ // table labels
+ private final String keyLabel;
+ private final String valueLabel;
+
+ private final ResizeListener resizeListener;
+
+ public KeyValueEditor(Composite parent, Map<String, String> input, String keyLabel, String valueLabel, KeyValueField keyField, KeyValueField valueField) {
+ super(parent);
+
+ this.model = input;
+ this.keyLabel = keyLabel;
+ this.valueLabel = valueLabel;
+ this.keyField = keyField;
+ this.valueField = valueField;
+
+
+ // Composite
+ widgetComposite = new Composite(parent, SWT.NONE);
+ widgetComposite.setLayout(new GridLayout(3, false));
+
+ // fields
+ keyField.setParent(widgetComposite);
+ keyField.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+ valueField.setParent(widgetComposite);
+ valueField.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+
+ // Add Button
+ final Button btnAdd = new Button(widgetComposite, SWT.NONE);
+ btnAdd.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
+ btnAdd.setText(addLabel);
+
+ // JFace Table Viewer
+ jFaceViewer = new TableViewer(widgetComposite, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
+ jFaceViewer.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1));
+ final TableViewerColumn col1 = createTableViewerColumn(jFaceViewer, 0, keyLabel);
+ final TableViewerColumn col2 = createTableViewerColumn(jFaceViewer, 1, valueLabel);
+ jFaceViewer.setContentProvider(new TableContentProvider());
+ jFaceViewer.setInput(input);
+ jFaceViewer.setComparator(getDefaultComparator());
+
+ // SWT Table widget configuration
+ Table swtTable = ((TableViewer) jFaceViewer).getTable();
+ swtTable.setHeaderVisible(true);
+ swtTable.setLinesVisible(true);
+
+ // Remove Button
+ final Button btnRemove = new Button(widgetComposite, SWT.NONE);
+ btnRemove.setText(removeLabel);
+ btnRemove.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, false, false));
+
+ // Listeners
+ btnAdd.addMouseListener(new AddButtonListener(jFaceViewer));
+ resizeListener = new ResizeListener(col1, col2, jFaceViewer);
+ widgetComposite.addControlListener(resizeListener);
+ jFaceViewer.addSelectionChangedListener(new SelectTableListener());
+ btnRemove.addMouseListener(new RemoveButtonListener(parent.getShell(), jFaceViewer));
+ }
+
+ public Map<String, String> getModel() {
+ return model;
+ }
+
+ public void setKeyValidator(IInputValidator keyValidator) {
+ this.keyValidator = keyValidator;
+ }
+
+ public void setValueValidator(IInputValidator valueValidator) {
+ this.valueValidator = valueValidator;
+ }
+
+ private static class TableContentProvider implements IStructuredContentProvider {
+
+ @Override
+ public Object[] getElements(Object inputElement) {
+
+ @SuppressWarnings("unchecked")
+ Map<String, String> items = (Map<String, String>) inputElement;
+
+ List<String[]> retval = new ArrayList<String[]>();
+
+ for (String key : items.keySet()) {
+ String value = items.get(key);
+ String[] keyValue = new String[2];
+ keyValue[0] = key;
+ keyValue[1] = value;
+ retval.add(keyValue);
+ }
+
+ return retval.toArray();
+ }
+
+ @Override
+ public void dispose() {
+ // do nothing
+ }
+
+ @Override
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ // do nothing
+ }
+ }
+
+ private static TableViewerColumn createTableViewerColumn(StructuredViewer viewer, final int index, String title) {
+ final TableViewerColumn viewerColumn = new TableViewerColumn(((TableViewer) viewer), SWT.NONE);
+ final TableColumn column = viewerColumn.getColumn();
+ column.setText(title);
+ column.setResizable(false);
+ column.setMoveable(false);
+ column.setAlignment(SWT.CENTER);
+
+ viewerColumn.setLabelProvider(new ColumnLabelProvider() {
+ @Override
+ public String getText(Object element) {
+ String[] keyValue = (String[]) element;
+ return keyValue[index];
+ }
+ });
+
+ return viewerColumn;
+ }
+
+ private class AddButtonListener implements MouseListener {
+
+ /** The table. */
+ private StructuredViewer table;
+
+ public AddButtonListener(StructuredViewer table) {
+ this.table = table;
+ }
+
+ @Override
+ public void mouseDoubleClick(MouseEvent e) {
+ // do nothing
+ }
+
+ @Override
+ public void mouseDown(MouseEvent e) {
+ // do nothing
+ }
+
+ @Override
+ public void mouseUp(MouseEvent e) {
+ String str1 = keyField.getValue().trim();
+ String str2 = valueField.getValue().trim();
+
+ if (keyValidator != null) {
+ String msg = keyValidator.isValid(str1);
+ if (msg != null) {
+ String title = "Invalid \"" + keyLabel + "\" value";
+ MessageDialog.openError(shell, title, msg);
+ keyField.setFocus();
+ return;
+ }
+ }
+
+ if (valueValidator != null) {
+ String msg = valueValidator.isValid(str2);
+ if (msg != null) {
+ String title = "Invalid \"" + valueLabel + "\" value";
+ MessageDialog.openError(shell, title, msg);
+ valueField.setFocus();
+ return;
+ }
+ }
+
+ model.remove(str1);
+ model.put(str1, str2);
+ table.refresh();
+
+ keyField.resetValue();
+ valueField.resetValue();
+ keyField.setFocus();
+ }
+ }
+
+ /**
+ * Resize the table column as soon as a composite is resized.
+ *
+ * @see ResizeEvent
+ */
+ private class ResizeListener implements ControlListener {
+
+ final TableViewerColumn col1;
+ final TableViewerColumn col2;
+ final StructuredViewer table;
+
+ public ResizeListener(TableViewerColumn col1, TableViewerColumn col2, StructuredViewer table) {
+ this.col1 = col1;
+ this.col2 = col2;
+ this.table = table;
+ }
+
+ @Override
+ public void controlResized(ControlEvent e) {
+ Control control = table.getControl();
+ int width = control.getBounds().width / 2 - 2;
+ col1.getColumn().setWidth(width);
+ col2.getColumn().setWidth(width);
+ table.refresh();
+ table.getControl().redraw();
+ }
+
+ @Override
+ public void controlMoved(ControlEvent e) {
+ // do nothing
+ }
+ }
+
+ /**
+ * Listener called when an element is selected in the table.
+ *
+ * @see SelectTableEvent
+ */
+ public class SelectTableListener implements ISelectionChangedListener {
+
+ public SelectTableListener() {
+ }
+
+ @Override
+ public void selectionChanged(SelectionChangedEvent event) {
+ StructuredSelection sel = (StructuredSelection) jFaceViewer.getSelection();
+ String[] line = (String[]) sel.getFirstElement();
+
+ if (line != null) {
+ String key = line[0];
+ String value = line[1];
+
+ keyField.setValue(key);
+ valueField.setValue(value);
+ }
+ }
+ }
+
+ private class RemoveButtonListener implements MouseListener {
+
+ private Shell shell;
+ private StructuredViewer table;
+
+ public RemoveButtonListener(Shell shell, StructuredViewer table) {
+ this.shell = shell;
+ this.table = table;
+ }
+
+ @Override
+ public void mouseDoubleClick(MouseEvent e) {
+ }
+
+ @Override
+ public void mouseDown(MouseEvent e) {
+ }
+
+ @Override
+ public void mouseUp(MouseEvent e) {
+ StructuredSelection sel = (StructuredSelection) table.getSelection();
+ String[] line = (String[]) sel.getFirstElement();
+
+ if (line == null) {
+ MessageDialog.openError(shell, "Error", "Please select an element first.");
+ } else {
+ model.remove(line[0]);
+ table.refresh();
+ }
+ }
+ }
+
+ public void refresh() {
+ resizeListener.controlResized(null);
+ }
+
+ @Override
+ protected ViewerComparator getDefaultComparator() {
+ return new ViewerComparator() {
+ @Override
+ public int compare(Viewer viewer, Object e1, Object e2) {
+ String str1 = ((String[]) e1)[0];
+ String str2 = ((String[]) e2)[0];
+ return (str1.toUpperCase()).compareTo(str2.toUpperCase());
+ }
+ };
+ }
+}
diff --git a/ui/org.eclipse.sensinact.studio.ui.common/src/org/eclipse/sensinact/studio/ui/common/widget/KeyValueField.java b/ui/org.eclipse.sensinact.studio.ui.common/src/org/eclipse/sensinact/studio/ui/common/widget/KeyValueField.java
new file mode 100644
index 0000000..83b97d5
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.ui.common/src/org/eclipse/sensinact/studio/ui/common/widget/KeyValueField.java
@@ -0,0 +1,53 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.ui.common.widget;
+
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+
+/**
+ * @author Etienne Gandrille
+ */
+public abstract class KeyValueField {
+
+ Composite parent = null;
+ Control control = null;
+
+ public void setParent(Composite parent) {
+ this.parent = parent;
+ }
+
+ public Control getControl() {
+ if (control == null) {
+ if (parent == null)
+ throw new RuntimeException("parent should be set");
+ control = createControl(parent);
+ }
+ return control;
+ }
+
+ public void setLayoutData(Object layoutData) {
+ getControl().setLayoutData(layoutData);
+ }
+
+ public void setFocus() {
+ getControl().setFocus();
+ }
+
+ protected abstract Control createControl(Composite parent);
+
+ public abstract String getValue();
+
+ public abstract void setValue(String value);
+
+ public abstract void resetValue();
+}
+
diff --git a/ui/org.eclipse.sensinact.studio.ui.common/src/org/eclipse/sensinact/studio/ui/common/widget/KeyValueWidget.java b/ui/org.eclipse.sensinact.studio.ui.common/src/org/eclipse/sensinact/studio/ui/common/widget/KeyValueWidget.java
new file mode 100644
index 0000000..5d202e6
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.ui.common/src/org/eclipse/sensinact/studio/ui/common/widget/KeyValueWidget.java
@@ -0,0 +1,177 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.ui.common.widget;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.jface.viewers.ColumnLabelProvider;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.TableViewerColumn;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerComparator;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ControlEvent;
+import org.eclipse.swt.events.ControlListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class KeyValueWidget {
+
+ private ControlListener resizeListener;
+ private final Control control;
+
+ KeyValueWidget(Composite parent, Map<String, String> input, String keyLabel, String valueLabel) {
+ control = createComposite(parent, input, keyLabel, valueLabel);
+ }
+
+ public Control getControl() {
+ return control;
+ }
+
+ public void setLayoutData(Object layoutData) {
+ control.setLayoutData(layoutData);
+ }
+
+ private Control createComposite(Composite parent, Map<String, String> input, String keyLabel, String valueLabel) {
+
+ // JFace Table Viewer
+ StructuredViewer jFaceViewer = new TableViewer(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
+ jFaceViewer.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ final TableViewerColumn col1 = createTableViewerColumn(jFaceViewer, 0, keyLabel);
+ final TableViewerColumn col2 = createTableViewerColumn(jFaceViewer, 1, valueLabel);
+ jFaceViewer.setContentProvider(new TableContentProvider());
+ jFaceViewer.setInput(input);
+ jFaceViewer.setComparator(getDefaultComparator());
+
+ // SWT Table widget configuration
+ Table swtTable = ((TableViewer) jFaceViewer).getTable();
+ swtTable.setHeaderVisible(true);
+ swtTable.setLinesVisible(true);
+
+ // Listener
+ resizeListener = new ResizeListener(col1, col2, jFaceViewer);
+ jFaceViewer.getControl().addControlListener(resizeListener);
+
+ return jFaceViewer.getControl();
+ }
+
+ private static class TableContentProvider implements IStructuredContentProvider {
+
+ @Override
+ public Object[] getElements(Object inputElement) {
+
+ @SuppressWarnings("unchecked")
+ Map<String, String> items = (Map<String, String>) inputElement;
+
+ List<String[]> retval = new ArrayList<String[]>();
+
+ for (String key : items.keySet()) {
+ String value = items.get(key);
+ String[] keyValue = new String[2];
+ keyValue[0] = key;
+ keyValue[1] = value;
+ retval.add(keyValue);
+ }
+
+ return retval.toArray();
+ }
+
+ @Override
+ public void dispose() {
+ // do nothing
+ }
+
+ @Override
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ // do nothing
+ }
+ }
+
+ private static TableViewerColumn createTableViewerColumn(StructuredViewer viewer, final int index, String title) {
+ final TableViewerColumn viewerColumn = new TableViewerColumn(((TableViewer) viewer), SWT.NONE);
+ final TableColumn column = viewerColumn.getColumn();
+ column.setText(title);
+ column.setResizable(false);
+ column.setMoveable(false);
+ column.setAlignment(SWT.LEFT);
+
+ viewerColumn.setLabelProvider(new ColumnLabelProvider() {
+ private String getTextFromObject(Object element) {
+ String[] keyValue = (String[]) element;
+ return keyValue[index];
+ }
+
+ @Override
+ public String getText(Object element) {
+ return getTextFromObject(element);
+ }
+
+ @Override
+ public String getToolTipText(Object element) {
+ return getTextFromObject(element);
+ }
+ });
+
+ return viewerColumn;
+ }
+
+ /**
+ * Resize the table column as soon as a composite is resized.
+ *
+ * @see ResizeEvent
+ */
+ private static class ResizeListener implements ControlListener {
+
+ final TableViewerColumn col1;
+ final TableViewerColumn col2;
+ final StructuredViewer table;
+
+ public ResizeListener(TableViewerColumn col1, TableViewerColumn col2, StructuredViewer table) {
+ this.col1 = col1;
+ this.col2 = col2;
+ this.table = table;
+ }
+
+ @Override
+ public void controlResized(ControlEvent e) {
+ Control control = table.getControl();
+ int width = control.getBounds().width / 2 - 2;
+ col1.getColumn().setWidth(width);
+ col2.getColumn().setWidth(width);
+ }
+
+ @Override
+ public void controlMoved(ControlEvent e) {
+ // do nothing
+ }
+ }
+
+ private static ViewerComparator getDefaultComparator() {
+ return new ViewerComparator() {
+ @Override
+ public int compare(Viewer viewer, Object e1, Object e2) {
+ String str1 = ((String[]) e1)[0];
+ String str2 = ((String[]) e2)[0];
+ return (str1.toUpperCase()).compareTo(str2.toUpperCase());
+ }
+ };
+ }
+}
diff --git a/ui/org.eclipse.sensinact.studio.ui.common/src/org/eclipse/sensinact/studio/ui/common/widget/ListEditor.java b/ui/org.eclipse.sensinact.studio.ui.common/src/org/eclipse/sensinact/studio/ui/common/widget/ListEditor.java
new file mode 100644
index 0000000..37b4147
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.ui.common/src/org/eclipse/sensinact/studio/ui/common/widget/ListEditor.java
@@ -0,0 +1,196 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.ui.common.widget;
+
+import java.util.Comparator;
+import java.util.List;
+
+import org.eclipse.jface.dialogs.IInputValidator;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.ArrayContentProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.ListViewer;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.jface.viewers.ViewerComparator;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseListener;
+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.Shell;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * A simple list<String> editor, with an add an a remove button.
+ *
+ * @author Etienne Gandrille
+ */
+public class ListEditor extends AbstractEditor {
+
+ private List<String> model;
+
+ private Text text;
+
+ private IInputValidator validator = null;
+
+ /**
+ * Constructor.
+ *
+ * @param parent
+ * the parent composite.
+ * @param model
+ * the input, which can be an empty list, but mustn't be null.
+ */
+ public ListEditor(Composite parent, List<String> model) {
+ super(parent);
+
+ this.model = model;
+
+ // Composite
+ widgetComposite = new Composite(parent, SWT.NONE);
+ widgetComposite.setLayout(new GridLayout(2, false));
+
+ // Text
+ text = new Text(widgetComposite, SWT.BORDER);
+ text.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+
+ // Add Button
+ final Button btnAdd = new Button(widgetComposite, SWT.NONE);
+ btnAdd.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
+ btnAdd.setText(addLabel);
+
+ // JFace List Viewer
+ jFaceViewer = new ListViewer(widgetComposite, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
+ jFaceViewer.setContentProvider(new ArrayContentProvider());
+ jFaceViewer.setLabelProvider(new LabelProvider());
+ jFaceViewer.setInput(model);
+ jFaceViewer.setComparator(getDefaultComparator());
+ jFaceViewer.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+ // Remove Button
+ final Button btnRemove = new Button(widgetComposite, SWT.NONE);
+ btnRemove.setText(removeLabel);
+ btnRemove.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, false, false));
+
+ // Listeners
+ btnAdd.addMouseListener(new AddButtonListener(shell, text, jFaceViewer));
+ btnRemove.addMouseListener(new RemoveButtonListener(shell, jFaceViewer));
+ }
+
+ public void setValidator(IInputValidator validator) {
+ this.validator = validator;
+ }
+
+ private class AddButtonListener implements MouseListener {
+
+ private Text text;
+ private Shell shell;
+ private StructuredViewer list;
+
+ public AddButtonListener(Shell shell, Text text, StructuredViewer list) {
+ this.shell = shell;
+ this.text = text;
+ this.list = list;
+ }
+
+ @Override
+ public void mouseDoubleClick(MouseEvent e) {
+ }
+
+ @Override
+ public void mouseDown(MouseEvent e) {
+ }
+
+ @Override
+ public void mouseUp(MouseEvent e) {
+ String str = text.getText().trim();
+
+ if (str.isEmpty()) {
+ displayError("Can't add an empty string");
+ return;
+ }
+
+ if (model.contains(str)) {
+ displayError("\"" + str + "\"" + " is already in the list.");
+ return;
+ }
+
+ if (validator != null) {
+ String msg = validator.isValid(str);
+ if (msg != null) {
+ displayError(msg);
+ return;
+ }
+ }
+
+ model.add(str);
+ list.refresh();
+
+ text.setText("");
+ text.setFocus();
+ }
+
+ void displayError(String message) {
+ MessageDialog.openError(shell, "Error", message);
+ }
+ }
+
+ /**
+ * Listener called when clicking on the remove button.
+ */
+ private class RemoveButtonListener implements MouseListener {
+
+ private Shell shell;
+ private StructuredViewer list;
+
+ public RemoveButtonListener(Shell shell, StructuredViewer list) {
+ this.shell = shell;
+ this.list = list;
+ }
+
+ @Override
+ public void mouseDoubleClick(MouseEvent e) {
+ }
+
+ @Override
+ public void mouseDown(MouseEvent e) {
+ }
+
+ @Override
+ public void mouseUp(MouseEvent e) {
+ StructuredSelection sel = (StructuredSelection) list.getSelection();
+ String str = (String) sel.getFirstElement();
+
+ if (str == null)
+ MessageDialog.openError(shell, "Error", "Please select an element first.");
+ else
+ model.remove(str);
+ list.refresh();
+ }
+ }
+
+ @Override
+ public void refresh() {
+ }
+
+ @Override
+ protected ViewerComparator getDefaultComparator() {
+ return new ViewerComparator(new Comparator<String>() {
+ @Override
+ public int compare(String o1, String o2) {
+ return o1.toUpperCase().compareTo(o2.toUpperCase());
+ }
+ });
+ }
+}
diff --git a/ui/org.eclipse.sensinact.studio.ui.common/src/org/eclipse/sensinact/studio/ui/common/widget/MultiColumnTableWidget/DoubleClickListener.java b/ui/org.eclipse.sensinact.studio.ui.common/src/org/eclipse/sensinact/studio/ui/common/widget/MultiColumnTableWidget/DoubleClickListener.java
new file mode 100644
index 0000000..791cb49
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.ui.common/src/org/eclipse/sensinact/studio/ui/common/widget/MultiColumnTableWidget/DoubleClickListener.java
@@ -0,0 +1,18 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.ui.common.widget.MultiColumnTableWidget;
+
+/**
+ * @author Etienne Gandrille
+ */
+public interface DoubleClickListener {
+ void onDoubleClick(String[] line, int columnNb);
+}
diff --git a/ui/org.eclipse.sensinact.studio.ui.common/src/org/eclipse/sensinact/studio/ui/common/widget/MultiColumnTableWidget/MultiColumnsTableWidget.java b/ui/org.eclipse.sensinact.studio.ui.common/src/org/eclipse/sensinact/studio/ui/common/widget/MultiColumnTableWidget/MultiColumnsTableWidget.java
new file mode 100644
index 0000000..f2ee95f
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.ui.common/src/org/eclipse/sensinact/studio/ui/common/widget/MultiColumnTableWidget/MultiColumnsTableWidget.java
@@ -0,0 +1,195 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.ui.common.widget.MultiColumnTableWidget;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.viewers.ColumnLabelProvider;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.TableViewerColumn;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerComparator;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.PaintEvent;
+import org.eclipse.swt.events.PaintListener;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.widgets.TableItem;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class MultiColumnsTableWidget {
+
+ final TableViewer jFaceViewer;
+
+ public MultiColumnsTableWidget(Composite parent, Object layoutData, boolean headerVisible, boolean linesVisible, String[] headers, int[] colWeight,
+ String[][] model, ViewerComparator comparator, final DoubleClickListener listener) {
+
+ // default comparator
+ if (comparator == null)
+ comparator = ViewerComparatorFactory.getAlphanumericalComparator();
+
+ // JFace Table Viewer
+ jFaceViewer = new TableViewer(parent, SWT.V_SCROLL | SWT.BORDER);
+
+ jFaceViewer.getControl().setLayoutData(layoutData);
+ jFaceViewer.getControl().setSize(jFaceViewer.getControl().computeSize(600, 200, true));
+ List<TableViewerColumn> cols = new ArrayList<>();
+ for (int i = 0; i < headers.length; i++) {
+ cols.add(createTableViewerColumn(jFaceViewer, i, headers[i]));
+ }
+ jFaceViewer.setContentProvider(new TableContentProvider());
+ jFaceViewer.setInput(model);
+ jFaceViewer.setComparator(comparator);
+
+ // Double click on Table cell
+ if (listener != null) {
+ jFaceViewer.getTable().addListener(SWT.MouseDoubleClick, new Listener() {
+ @Override
+ public void handleEvent(Event event) {
+ Point clickPoint = new Point(event.x, event.y);
+ Table swtTable = jFaceViewer.getTable();
+
+ for (int lineNb = swtTable.getTopIndex(); lineNb < swtTable.getItemCount(); lineNb++) {
+ final TableItem curLine = swtTable.getItem(lineNb);
+ for (int columnNb = 0; columnNb < swtTable.getColumnCount(); columnNb++) {
+ Rectangle cellArea = curLine.getBounds(columnNb);
+ if (cellArea.contains(clickPoint)) {
+ String[] element = (String[]) jFaceViewer.getElementAt(lineNb);
+ listener.onDoubleClick(element, columnNb);
+ }
+ }
+ }
+ }
+ });
+ }
+
+ // SWT Table widget configuration
+ Table swtTable = jFaceViewer.getTable();
+ swtTable.setHeaderVisible(headerVisible);
+ swtTable.setLinesVisible(linesVisible);
+
+ // resize listener
+ ResizeOnPaintListener resizeListener = new ResizeOnPaintListener(cols, colWeight, jFaceViewer);
+ parent.addPaintListener(resizeListener);
+ }
+
+ public Control getControl(){
+ return jFaceViewer.getControl();
+ }
+
+ public String[][] getModel() {
+ return (String[][]) jFaceViewer.getInput();
+ }
+
+ public void setModel(String[][] model) {
+ jFaceViewer.setInput(model);
+ }
+
+ public String[] getSelectedElement() {
+ TableItem[] sel = jFaceViewer.getTable().getSelection();
+ if (sel.length != 0) {
+ return (String[]) sel[0].getData();
+ }
+ return null;
+ }
+
+ public Object getLayoutData() {
+ return jFaceViewer.getTable().getLayoutData();
+ }
+
+ public void setFocus() {
+ jFaceViewer.getTable().setFocus();
+ }
+
+ private static TableViewerColumn createTableViewerColumn(TableViewer viewer, final int index, String title) {
+ final TableViewerColumn viewerColumn = new TableViewerColumn(viewer, SWT.NONE);
+ final TableColumn column = viewerColumn.getColumn();
+ column.setWidth(200);
+ column.setText(title);
+ column.setResizable(false);
+ column.setMoveable(false);
+ column.setAlignment(SWT.CENTER);
+ viewerColumn.setLabelProvider(new ColumnLabelProvider() {
+ @Override
+ public String getText(Object element) {
+ String[] keyValue = (String[]) element;
+ return keyValue[index];
+ }
+ });
+ return viewerColumn;
+ }
+
+ private static class TableContentProvider implements IStructuredContentProvider {
+ @Override
+ public Object[] getElements(Object inputElement) {
+ if (inputElement == null)
+ return new String[0][0];
+ else
+ return (String[][]) inputElement;
+ }
+
+ @Override
+ public void dispose() {
+ // do nothing
+ }
+
+ @Override
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ // do nothing
+ }
+ }
+
+ private class ResizeOnPaintListener implements PaintListener {
+ final List<TableViewerColumn> cols;
+ final int[] colWeight;
+ final int sumWeight;
+ final StructuredViewer table;
+
+ public ResizeOnPaintListener(List<TableViewerColumn> cols, int[] colWeight, StructuredViewer table) {
+ this.cols = cols;
+ this.colWeight = colWeight;
+ this.sumWeight = computeSumWeight(colWeight);
+ this.table = table;
+ }
+
+ private int computeSumWeight(int[] colWeight2) {
+ int sum = 0;
+ for (int cur : colWeight2)
+ sum += cur;
+ return sum;
+ }
+
+ @Override
+ public void paintControl(PaintEvent e) {
+ Control control = table.getControl();
+ int availableWidth = control.getBounds().width - 2;
+ BigDecimal pointValue = new BigDecimal(availableWidth).divide(new BigDecimal(sumWeight), BigDecimal.ROUND_DOWN);
+ for (int i = 0; i < cols.size(); i++) {
+ BigDecimal curWidth = pointValue.multiply(new BigDecimal(colWeight[i]));
+ cols.get(i).getColumn().setWidth(curWidth.intValue() - 1);
+ }
+ table.refresh();
+ table.getControl().redraw();
+ }
+ }
+}
diff --git a/ui/org.eclipse.sensinact.studio.ui.common/src/org/eclipse/sensinact/studio/ui/common/widget/MultiColumnTableWidget/ViewerComparatorFactory.java b/ui/org.eclipse.sensinact.studio.ui.common/src/org/eclipse/sensinact/studio/ui/common/widget/MultiColumnTableWidget/ViewerComparatorFactory.java
new file mode 100644
index 0000000..d2afe97
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.ui.common/src/org/eclipse/sensinact/studio/ui/common/widget/MultiColumnTableWidget/ViewerComparatorFactory.java
@@ -0,0 +1,50 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.ui.common.widget.MultiColumnTableWidget;
+
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerComparator;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class ViewerComparatorFactory {
+
+ public static ViewerComparator getAlphanumericalComparator() {
+ return new ViewerComparator() {
+ @Override
+ public int compare(Viewer viewer, Object e1, Object e2) {
+ String key1 = ((String[]) e1)[0];
+ String key2 = ((String[]) e2)[0];
+ return key1.compareTo(key2);
+ }
+ };
+ }
+
+ public static ViewerComparator getFullOrderComparator(final String[] keyList) {
+ return new ViewerComparator() {
+
+ @Override
+ public int compare(Viewer viewer, Object e1, Object e2) {
+ String key1 = ((String[]) e1)[0];
+ String key2 = ((String[]) e2)[0];
+ return getIndex(key1) - getIndex(key2);
+ }
+
+ int getIndex(String key) {
+ for (int i=0; i<keyList.length; i++)
+ if (keyList[i].equals(key))
+ return i;
+ return -1;
+ }
+ };
+ }
+}
diff --git a/ui/org.eclipse.sensinact.studio.ui.common/src/org/eclipse/sensinact/studio/ui/common/widget/TextField.java b/ui/org.eclipse.sensinact.studio.ui.common/src/org/eclipse/sensinact/studio/ui/common/widget/TextField.java
new file mode 100644
index 0000000..ca2b6cf
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.ui.common/src/org/eclipse/sensinact/studio/ui/common/widget/TextField.java
@@ -0,0 +1,44 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.ui.common.widget;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class TextField extends KeyValueField {
+
+ @Override
+ protected Control createControl(Composite parent) {
+ return new Text(parent, SWT.BORDER);
+ }
+
+ @Override
+ public String getValue() {
+ Text text = (Text) getControl();
+ return text.getText();
+ }
+
+ @Override
+ public void setValue(String value) {
+ Text text = (Text) getControl();
+ text.setText(value);
+ }
+
+ @Override
+ public void resetValue() {
+ setValue("");
+ }
+}
diff --git a/ui/org.eclipse.sensinact.studio.view.outdoor/META-INF/MANIFEST.MF b/ui/org.eclipse.sensinact.studio.view.outdoor/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..2a68bd2
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.view.outdoor/META-INF/MANIFEST.MF
@@ -0,0 +1,19 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Sensinact Studio Outdoor View
+Bundle-SymbolicName: org.eclipse.sensinact.studio.view.outdoor;singleton:=true
+Bundle-Version: 1.0.0.qualifier
+Bundle-Activator: org.eclipse.sensinact.studio.view.outdoor.Activator
+Bundle-Vendor: CEA LETI
+Bundle-RequiredExecutionEnvironment: JavaSE-1.7
+Bundle-ActivationPolicy: lazy
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.sensinact.studio.model.resource,
+ org.eclipse.sensinact.studio.webapp.outdoor,
+ org.eclipse.sensinact.studio.http,
+ org.eclipse.sensinact.studio.model.manager,
+ org.apache.log4j,
+ org.eclipse.sensinact.studio.preferences
+Export-Package: org.eclipse.sensinact.studio.view.outdoor
+Import-Package: org.apache.log4j
diff --git a/ui/org.eclipse.sensinact.studio.view.outdoor/about.html b/ui/org.eclipse.sensinact.studio.view.outdoor/about.html
new file mode 100644
index 0000000..3b39f88
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.view.outdoor/about.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"><head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 5, 2006</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+
+</body></html>
\ No newline at end of file
diff --git a/ui/org.eclipse.sensinact.studio.view.outdoor/build.properties b/ui/org.eclipse.sensinact.studio.view.outdoor/build.properties
new file mode 100644
index 0000000..1d5ab1a
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.view.outdoor/build.properties
@@ -0,0 +1,19 @@
+#
+# Copyright (c) 2017 CEA.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+# CEA - initial API and implementation and/or initial documentation
+#
+
+source.. = src/
+bin.includes = plugin.xml,\
+ .,\
+ .project,\
+ .classpath,\
+ build.properties,\
+ META-INF/,\
+ .settings/
diff --git a/ui/org.eclipse.sensinact.studio.view.outdoor/plugin.xml b/ui/org.eclipse.sensinact.studio.view.outdoor/plugin.xml
new file mode 100644
index 0000000..3b06b28
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.view.outdoor/plugin.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Copyright (c) 2017 CEA.
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+
+ Contributors:
+ CEA - initial API and implementation and/or initial documentation
+
+-->
+<?eclipse version="3.4"?>
+<plugin>
+ <extension
+ point="org.eclipse.ui.views">
+ <e4view
+ category="org.eclipse.sensinact.studio.views.category"
+ class="org.eclipse.sensinact.studio.view.outdoor.OutdoorDeploymentView"
+ id="org.eclipse.sensinact.studio.view.outdoor.view"
+ name="Deployment"
+ restorable="true">
+ </e4view>
+ </extension>
+</plugin>
diff --git a/ui/org.eclipse.sensinact.studio.view.outdoor/src/org/eclipse/sensinact/studio/view/outdoor/Activator.java b/ui/org.eclipse.sensinact.studio.view.outdoor/src/org/eclipse/sensinact/studio/view/outdoor/Activator.java
new file mode 100644
index 0000000..85203b1
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.view.outdoor/src/org/eclipse/sensinact/studio/view/outdoor/Activator.java
@@ -0,0 +1,40 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.view.outdoor;
+
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+public class Activator implements BundleActivator {
+
+ private static BundleContext context;
+
+ static BundleContext getContext() {
+ return context;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
+ */
+ public void start(BundleContext bundleContext) throws Exception {
+ Activator.context = bundleContext;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
+ */
+ public void stop(BundleContext bundleContext) throws Exception {
+ Activator.context = null;
+ }
+
+}
diff --git a/ui/org.eclipse.sensinact.studio.view.outdoor/src/org/eclipse/sensinact/studio/view/outdoor/OutdoorDeploymentView.java b/ui/org.eclipse.sensinact.studio.view.outdoor/src/org/eclipse/sensinact/studio/view/outdoor/OutdoorDeploymentView.java
new file mode 100644
index 0000000..8d1ddc3
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.view.outdoor/src/org/eclipse/sensinact/studio/view/outdoor/OutdoorDeploymentView.java
@@ -0,0 +1,301 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.view.outdoor;
+
+import java.util.Arrays;
+import java.util.List;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
+
+import org.apache.log4j.Logger;
+import org.eclipse.sensinact.studio.http.server.GatewayHttpServer;
+import org.eclipse.sensinact.studio.http.server.serverstarted.PortUpdate;
+import org.eclipse.sensinact.studio.http.server.serverstarted.ResourceAddedUpdate;
+import org.eclipse.sensinact.studio.http.server.serverstarted.ServerUpdatedListener;
+import org.eclipse.sensinact.studio.http.server.serverstarted.ServerUpdatedManager;
+import org.eclipse.sensinact.studio.http.server.serverstarted.UpdateDescriptor;
+import org.eclipse.sensinact.studio.model.manager.listener.devicelocation.DeviceLocationListener;
+import org.eclipse.sensinact.studio.model.manager.listener.devicelocation.DeviceLocationManager;
+import org.eclipse.sensinact.studio.model.resource.utils.DeviceDescriptor;
+import org.eclipse.sensinact.studio.model.resource.utils.GPScoordinates;
+import org.eclipse.sensinact.studio.preferences.ConfigurationManager;
+import org.eclipse.sensinact.studio.webapp.outdoor.Startup;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.browser.Browser;
+import org.eclipse.swt.browser.ProgressEvent;
+import org.eclipse.swt.browser.ProgressListener;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.DropTarget;
+import org.eclipse.swt.dnd.DropTargetEvent;
+import org.eclipse.swt.dnd.DropTargetListener;
+import org.eclipse.swt.dnd.TextTransfer;
+import org.eclipse.swt.dnd.Transfer;
+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.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * @author Nicolas Hili, Etienne Gandrille
+ */
+public class OutdoorDeploymentView implements ServerUpdatedListener, DeviceLocationListener {
+
+ private static final Logger logger = Logger.getLogger(OutdoorDeploymentView.class);
+
+ public static final String VIEW_ID = "org.eclipse.sensinact.studio.view.outdoor.view";
+
+ private static Browser browser;
+ private int studioPort = 0;
+ private static Composite dndComposite;
+ private static Shell dndShell;
+
+ private static boolean browserStarted = false;
+
+ public OutdoorDeploymentView() {
+ // stats server
+ GatewayHttpServer.getInstance();
+ }
+
+ @PostConstruct
+ public void createControls(final Composite parent) {
+
+ parent.setLayout(null);
+ parent.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, true, true, 1, 1));
+ browser = new Browser(parent, SWT.NONE);
+
+ // Invisible shell and composite for Drag'n Drop feature
+ dndShell = new Shell(Display.getCurrent(), SWT.ON_TOP);
+ dndShell.open();
+ dndShell.setAlpha(125);
+ dndShell.setVisible(false);
+ dndComposite = new Composite(dndShell, SWT.NO_BACKGROUND);
+ dndComposite.setVisible(false);
+
+ // updates device position on the map
+ DeviceLocationManager.getInstance().addDeviceLocationListener(this);
+
+ // swap browserStarted flag to true when browser is ready
+ browser.addProgressListener(new BrowserProgressListener());
+
+ // updates dnd elements when browser (more precisely, parent) geometry
+ // changes
+ parent.addControlListener(new ControlSizePositionListener(parent));
+
+ // drop target configuration
+ int operations = DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_DEFAULT;
+ Transfer[] transferTypes = new Transfer[] { TextTransfer.getInstance() };
+ DropTarget target = new DropTarget(dndComposite, operations);
+ target.setTransfer(transferTypes);
+
+ // when a device is dropped, updates its location
+ target.addDropListener(new DropListenerForDevices());
+
+ // when the server parameters are updated, the browser URL also
+ ServerUpdatedManager.getInstance().addServerUpdatedListener(this);
+ serverUpdated(null);
+ }
+
+ @PreDestroy
+ public void dispose() {
+ ServerUpdatedManager.getInstance().removeServerUpdatedListener(this);
+ }
+
+ public static void beginDrag() {
+ if (browserStarted) {
+ dndShell.setVisible(true);
+ dndComposite.setVisible(true);
+ updateDndInvisibleElementsGeometry();
+ }
+ }
+
+ public static void endDrag() {
+ dndShell.setVisible(false);
+ dndComposite.setVisible(false);
+ }
+
+ private static void updateDndInvisibleElementsGeometry() {
+ Point absolutePos = browser.toDisplay(0, 0);
+ dndShell.setBounds(absolutePos.x, absolutePos.y, browser.getBounds().width, browser.getBounds().height);
+ dndComposite.setBounds(0, 0, browser.getBounds().width, browser.getBounds().height);
+ }
+
+ /* ============== */
+ /* DeviceLocation */
+ /* ============== */
+
+ @Override
+ public void deviceLocationUpdated(final GPScoordinates coordinate, final DeviceDescriptor descriptor) {
+ Display.getDefault().asyncExec(new Runnable() {
+
+ @Override
+ public void run() {
+ String dev = "'" + descriptor.toString() + "'";
+ browser.execute("updateDeviceLocation(" + coordinate.getLat() + "," + coordinate.getLng() + "," + dev + ");");
+ }
+ });
+ }
+
+ @Override
+ public void deviceRemoved(final DeviceDescriptor descriptor) {
+ Display.getDefault().asyncExec(new Runnable() {
+ @Override
+ public void run() {
+ String dev = "'" + descriptor.toString() + "'";
+ browser.execute("deleteMarker(" + dev + ");");
+ }
+ });
+ }
+
+ /* =========================== */
+ /* Gateway HTTP ServerListener */
+ /* =========================== */
+
+ @Override
+ public void serverUpdated(UpdateDescriptor descriptor) {
+ if (isUpdateNeeded(descriptor)) {
+ studioPort = ConfigurationManager.getStudioPort();
+ if (studioPort != 0) {
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ logger.debug("refresh browser");
+ browser.setUrl("http://localhost:" + studioPort + "/webapp/outdoor/static/outdoor.html");
+ }
+ });
+ }
+ }
+ }
+
+ private boolean isUpdateNeeded(UpdateDescriptor descriptor) {
+
+ if (descriptor == null) {
+ // server just started
+ return true;
+ } else {
+ switch (descriptor.getType()) {
+ case PORT_UPDATE:
+ PortUpdate pu = (PortUpdate) descriptor;
+ if (pu.getPort() != 0)
+ return true;
+ else
+ return false;
+ case RESOURCE_ADDED:
+ ResourceAddedUpdate ra = (ResourceAddedUpdate) descriptor;
+ List<String> paths = ra.getRegisteredPath();
+
+ if (! Arrays.asList(Startup.BUNDLE_PATHS).contains(ra.getCurPath()))
+ return false;
+
+ for (String bundlePath : Startup.BUNDLE_PATHS) {
+ if (!paths.contains(bundlePath))
+ return false;
+ }
+ return true;
+ default:
+ throw new RuntimeException("Should never happend (" + descriptor.getType() + ")");
+ }
+ }
+ }
+
+ /* ================= */
+ /* Control listeners */
+ /* ================= */
+
+ private final class BrowserProgressListener implements ProgressListener {
+ public void changed(ProgressEvent event) {
+ }
+
+ public void completed(ProgressEvent event) {
+ browserStarted = true;
+ }
+ }
+
+ private final class ControlSizePositionListener implements ControlListener {
+ private final Composite parent;
+
+ private ControlSizePositionListener(Composite parent) {
+ this.parent = parent;
+ }
+
+ private void update(ControlEvent e) {
+ browser.setBounds(0, 0, parent.getBounds().width, parent.getBounds().height);
+ if (e.widget instanceof Control) {
+ updateDndInvisibleElementsGeometry();
+ }
+ }
+
+ @Override
+ public void controlResized(ControlEvent e) {
+ update(e);
+ }
+
+ @Override
+ public void controlMoved(ControlEvent e) {
+ update(e);
+ }
+ }
+
+ private final class DropListenerForDevices implements DropTargetListener {
+ @Override
+ public void dragEnter(DropTargetEvent event) {
+ }
+
+ @Override
+ public void dragLeave(DropTargetEvent event) {
+ }
+
+ @Override
+ public void dragOperationChanged(DropTargetEvent event) {
+ }
+
+ @Override
+ public void dragOver(DropTargetEvent event) {
+ }
+
+ @Override
+ public void drop(DropTargetEvent event) {
+
+ endDrag();
+
+ if (TextTransfer.getInstance().isSupportedType(event.currentDataType)) {
+ String dropText = (String) event.data;
+
+ if (event.widget instanceof DropTarget) {
+ Point relativePos = ((DropTarget) event.widget).getControl().toControl(event.x, event.y);
+ String cmd1 = "return computeCoordinates(" + relativePos.x + "," + relativePos.y + ");";
+ Object[] coordinates = (Object[]) browser.evaluate(cmd1);
+ Double lat = (Double) coordinates[0];
+ Double lng = (Double) coordinates[1];
+
+ String[] tab = dropText.split("/");
+ String gateway = tab[0];
+ if (gateway.startsWith("["))
+ gateway = gateway.substring(1);
+ String device = tab[1];
+
+ String dev = "'" + gateway + "/" + device + "'";
+ String cmd2 = "return updateDeviceLocation(" + lat + "," + lng + "," + dev + ");";
+ System.out.println(cmd2);
+ browser.evaluate(cmd2);
+ DeviceLocationManager.getInstance().updateLocationInServer(new DeviceDescriptor(gateway, device), new GPScoordinates(lat, lng));
+ }
+ }
+ }
+
+ @Override
+ public void dropAccept(DropTargetEvent event) {
+ }
+ }
+}
diff --git a/ui/org.eclipse.sensinact.studio.view.piax/META-INF/MANIFEST.MF b/ui/org.eclipse.sensinact.studio.view.piax/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..7a8b4ff
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.view.piax/META-INF/MANIFEST.MF
@@ -0,0 +1,17 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Piax
+Bundle-SymbolicName: org.eclipse.sensinact.studio.view.piax;singleton:=true
+Bundle-Version: 1.0.0.qualifier
+Bundle-Activator: org.eclipse.sensinact.studio.view.piax.Activator
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.apache.log4j,
+ org.eclipse.sensinact.studio.model.resource,
+ org.json,
+ org.eclipse.sensinact.studio.model.manager,
+ org.eclipse.sensinact.studio.http,
+ org.eclipse.sensinact.studio.ui.common,
+ org.eclipse.sensinact.studio.preferences
+Bundle-RequiredExecutionEnvironment: JavaSE-1.7
+Bundle-ActivationPolicy: lazy
diff --git a/ui/org.eclipse.sensinact.studio.view.piax/about.html b/ui/org.eclipse.sensinact.studio.view.piax/about.html
new file mode 100644
index 0000000..3b39f88
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.view.piax/about.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"><head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 5, 2006</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+
+</body></html>
\ No newline at end of file
diff --git a/ui/org.eclipse.sensinact.studio.view.piax/build.properties b/ui/org.eclipse.sensinact.studio.view.piax/build.properties
new file mode 100644
index 0000000..9fffc12
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.view.piax/build.properties
@@ -0,0 +1,16 @@
+#
+# Copyright (c) 2017 CEA.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+# CEA - initial API and implementation and/or initial documentation
+#
+
+source.. = src/
+output.. = bin/
+bin.includes = plugin.xml,\
+ META-INF/,\
+ .
diff --git a/ui/org.eclipse.sensinact.studio.view.piax/plugin.xml b/ui/org.eclipse.sensinact.studio.view.piax/plugin.xml
new file mode 100644
index 0000000..adcc6ab
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.view.piax/plugin.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Copyright (c) 2017 CEA.
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+
+ Contributors:
+ CEA - initial API and implementation and/or initial documentation
+
+-->
+<?eclipse version="3.4"?>
+<plugin>
+ <extension
+ point="org.eclipse.ui.views">
+ <e4view
+ category="org.eclipse.sensinact.studio.views.category"
+ class="org.eclipse.sensinact.studio.view.piax.PiaxView"
+ id="org.eclipse.sensinact.studio.view.piax.view"
+ name="Piax configuration"
+ restorable="true">
+ </e4view>
+ </extension>
+
+</plugin>
diff --git a/ui/org.eclipse.sensinact.studio.view.piax/src/org/eclipse/sensinact/studio/view/piax/Activator.java b/ui/org.eclipse.sensinact.studio.view.piax/src/org/eclipse/sensinact/studio/view/piax/Activator.java
new file mode 100644
index 0000000..70d9a80
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.view.piax/src/org/eclipse/sensinact/studio/view/piax/Activator.java
@@ -0,0 +1,71 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.view.piax;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class Activator extends AbstractUIPlugin {
+
+ // The plug-in ID
+ public static final String PLUGIN_ID = "org.eclipse.sensinact.studio.view.piax"; //$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)
+ */
+ 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)
+ */
+ 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);
+ }
+}
diff --git a/ui/org.eclipse.sensinact.studio.view.piax/src/org/eclipse/sensinact/studio/view/piax/PiaxButtonListener.java b/ui/org.eclipse.sensinact.studio.view.piax/src/org/eclipse/sensinact/studio/view/piax/PiaxButtonListener.java
new file mode 100644
index 0000000..ae502d0
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.view.piax/src/org/eclipse/sensinact/studio/view/piax/PiaxButtonListener.java
@@ -0,0 +1,188 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+
+package org.eclipse.sensinact.studio.view.piax;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.log4j.Logger;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.sensinact.studio.model.manager.listener.devicelocation.DeviceLocationManager;
+import org.eclipse.sensinact.studio.model.manager.modelupdater.ModelEditor;
+import org.eclipse.sensinact.studio.model.resource.utils.DeviceDescriptor;
+import org.eclipse.sensinact.studio.model.resource.utils.GPScoordinates;
+import org.eclipse.sensinact.studio.model.resource.utils.ResourceDescriptor;
+import org.eclipse.sensinact.studio.preferences.ConfigurationManager;
+import org.eclipse.sensinact.studio.preferences.GatewayHttpConfig;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseListener;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+/**
+ * @author Etienne Gandrille
+ */
+class PiaxButtonListener implements MouseListener {
+
+ private static final Logger logger = Logger.getLogger(PiaxButtonListener.class);
+ private final PiaxView view;
+
+ public PiaxButtonListener(PiaxView view) {
+ this.view = view;
+ }
+
+ @Override
+ public void mouseDoubleClick(MouseEvent e) {
+ }
+
+ @Override
+ public void mouseDown(MouseEvent e) {
+ }
+
+ @Override
+ public void mouseUp(MouseEvent e) {
+ final Shell shell = Display.getDefault().getActiveShell();
+
+ // TODO Attention: seule la première gateway est prise en compte !!!
+ GatewayHttpConfig[] gateways = ConfigurationManager.getGateways();
+ String gatewayID = gateways[0].getName();
+
+ String deviceID = "piax";
+ String serviceID = "discoveries";
+ String resourceID = "sensor";
+
+ ResourceDescriptor desc = new ResourceDescriptor(gatewayID, deviceID, serviceID, resourceID);
+
+ try {
+ if (!ModelEditor.getInstance().existsResource(desc)) {
+ MessageDialog.openError(shell, "Unknown Piax", "Unavailable resource\n" + desc);
+ return;
+ }
+ } catch (InterruptedException e1) {
+ logger.error("", e1);
+ return;
+ }
+
+ // Model Values
+ String modelType = view.getModelType();
+ Map<String, String> modelMatch = view.getModelMatch();
+ Map<String, String> modelTerm = view.getModelTerm();
+ List<RangeObject> modelRange = view.getModelRange();
+ Map<String, String> modelOrderBy = view.getOrderBy();
+ int modelSize = view.getSize();
+ int modelFrom = view.getFrom();
+ String expr = "";
+
+ try {
+ expr = buildJson(modelType, modelMatch, modelTerm, modelRange, modelOrderBy, modelSize, modelFrom);
+ }catch (Exception e1){
+ e1.printStackTrace();
+ }
+
+ Map<String, String> map = new HashMap<String, String>();
+ map.put("params", expr);
+
+ /* UPDATE THIS !
+ try {
+ Segments segments = new Segments.Builder().gateway(gatewayID).device(deviceID).service(serviceID).resource(resourceID).method(AccessMethodType.GET).build();
+
+
+ ObjectMessage result = (ObjectMessage) GatewayHttpClient.sendGetRequest(segments, map);
+ JSONArray array = result.getObject().getJSONArray("result");
+ for (int i = 0; i < array.length(); i++)
+ processPiaxObject(array.getJSONObject(i));
+
+ } catch (IOException e1) {
+ MessageDialog.openError(shell, "Piax connection", "Error while getting PIAX info");
+ logger.error("Error while getting PIAX info", e1);
+ } catch (JSONException e1) {
+ e1.printStackTrace();
+ }
+ */
+ }
+
+ private static String buildJson(String modelType, Map<String, String> modelMatch, Map<String, String> modelTerm, List<RangeObject> modelRange, Map<String, String> modelOrderBy, int modelSize, int modelFrom) throws Exception {
+ // TODO by Ken :-)
+ JSONObject j = new JSONObject();
+ if (modelMatch != null){
+ JSONObject matchj = new JSONObject();
+ for(Map.Entry<String, String> match: modelMatch.entrySet()){
+ matchj.put(match.getKey(), match.getValue());
+ }
+ j.put("match", matchj);
+ }
+
+ if (modelTerm != null){
+ JSONObject termj = new JSONObject();
+ for(Map.Entry<String, String> term: modelMatch.entrySet()){
+ termj.put(term.getKey(), term.getValue());
+ }
+ j.put("term", termj);
+ }
+
+ if (modelRange != null){
+ JSONObject rangej = new JSONObject();
+ for(RangeObject ro: modelRange){
+ JSONObject rangeChild = new JSONObject();
+ if (ro.getOperator().equals("<")){
+ rangeChild.put("lt", ro.getValue());
+ }else if(ro.getOperator().equals(">")){
+ rangeChild.put("gt", ro.getValue());
+ }
+
+ rangej.put(ro.getKey(), rangeChild);
+ }
+ j.put("range", rangej);
+ }
+
+ j.put("size", modelSize);
+ j.put("from", modelFrom);
+
+ return j.toString();
+ }
+
+ // {"timestamp":1.448531707634E12,"name":"position","resource":"position","longitude":35.86612225587049,"numericValue":371,"latitude":50.868860935141626,"uri":"/slider/cursor/position/value","serviceProvider":"slider","snaId":"sna1","serviceName":"cursor"}
+ private void processPiaxObject(JSONObject piaxMsg) throws JSONException {
+
+ String gatewayID = piaxMsg.getString("snaId");
+ String deviceID = piaxMsg.getString("serviceProvider");
+ String serviceID = piaxMsg.getString("serviceName");
+ String resourceID = piaxMsg.getString("resource");
+ ResourceDescriptor desc = new ResourceDescriptor(gatewayID, deviceID, serviceID, resourceID);
+
+ double lat = Double.parseDouble(piaxMsg.getString("latitude"));
+ double lng = Double.parseDouble(piaxMsg.getString("longitude"));
+ GPScoordinates gps = new GPScoordinates(lat, lng);
+
+ String value = null;
+ if (piaxMsg.has("numericValue")) {
+ value = piaxMsg.getString("numericValue");
+ } else if (piaxMsg.has("stringValue")) {
+ value = piaxMsg.getString("stringValue");
+ } else
+ throw new IllegalArgumentException("Can't find value in PIAX object");
+
+ createPiaxObjectsInModel(desc, gps, value);
+ }
+
+ private void createPiaxObjectsInModel(ResourceDescriptor desc, GPScoordinates gps, String value) {
+ // basic PIAX
+ ModelEditor.getInstance().addDeviceIfNotExist(desc.getGateway(), desc.getDevice());
+ ModelEditor.getInstance().addServiceIfNotExist(desc.getGateway(), desc.getDevice(), desc.getService());
+ //ModelEditor.getInstance().addResourceIfNotExist(desc, ResourcePackage.Literals.PROPERTY);
+
+ DeviceLocationManager.getInstance().updateLocationInStudio(new DeviceDescriptor(desc.getGateway(), desc.getDevice()), gps);
+ }
+}
\ No newline at end of file
diff --git a/ui/org.eclipse.sensinact.studio.view.piax/src/org/eclipse/sensinact/studio/view/piax/PiaxView.java b/ui/org.eclipse.sensinact.studio.view.piax/src/org/eclipse/sensinact/studio/view/piax/PiaxView.java
new file mode 100644
index 0000000..c7fd1d2
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.view.piax/src/org/eclipse/sensinact/studio/view/piax/PiaxView.java
@@ -0,0 +1,229 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.view.piax;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.annotation.PostConstruct;
+
+import org.eclipse.jface.dialogs.IInputValidator;
+import org.eclipse.sensinact.studio.ui.common.widget.ComboField;
+import org.eclipse.sensinact.studio.ui.common.widget.KeyValueEditor;
+import org.eclipse.sensinact.studio.ui.common.widget.ListEditor;
+import org.eclipse.sensinact.studio.ui.common.widget.TextField;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CTabFolder;
+import org.eclipse.swt.custom.CTabItem;
+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.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Spinner;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class PiaxView {
+
+ public static final String VIEW_ID = "org.eclipse.sensinact.studio.view.piax.view";
+
+ /* Widgets and model */
+ private Combo typeCombo;
+ private String[] typeValues = {"sensor", "gateway"};
+ private Map<String, String> match = new HashMap<>();
+ private Map<String, String> term = new HashMap<>();
+ private List<String> range = new ArrayList<>();
+ private Map<String, String> orderBy = new HashMap<>();
+ private Spinner sizeEditor;
+ private Spinner fromEditor;
+ private Button piaxButton;
+
+
+ public PiaxView() {
+ }
+
+ @PostConstruct
+ public void createControls(final Composite parent) {
+ parent.setLayout(new GridLayout(1, false));
+
+ // Tab folder
+ CTabFolder folder = new CTabFolder(parent, SWT.BORDER);
+ folder.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+ // General Tab
+ final CTabItem generalTab = new CTabItem(folder, SWT.NONE);
+ generalTab.setText("General");
+ generalTab.setControl(getGeneralComposite(folder));
+
+ // Pagination tab
+ final CTabItem paginationTab = new CTabItem(folder, SWT.NONE);
+ paginationTab.setText("Pagination");
+ paginationTab.setControl(getPaginationComposite(folder));
+
+ folder.setSelection(0);
+
+ // Connect
+ piaxButton = new Button(parent, SWT.NONE);
+ piaxButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
+ piaxButton.setText("Import from PIAX");
+ piaxButton.addMouseListener(new PiaxButtonListener(this));
+ }
+
+ private Control getGeneralComposite(Composite parent) {
+ Composite composite = new Composite(parent, SWT.NONE);
+
+ composite.setLayout(new GridLayout(2, false));
+
+ // type
+ createLabel(composite, "Type", true, false);
+ typeCombo = new Combo (composite, SWT.READ_ONLY);
+ typeCombo.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false, 1, 1));
+ typeCombo.setItems(typeValues);
+ typeCombo.select(0);
+
+ // match
+ createLabel(composite, "Match");
+ KeyValueEditor matchEditor = new KeyValueEditor(composite, match, "key", "value", new TextField(), new TextField());
+ matchEditor.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
+ matchEditor.setKeyValidator(getNotEmptyValidator());
+ matchEditor.setValueValidator(getNotEmptyValidator());
+
+ // term
+ createLabel(composite, "Term");
+ KeyValueEditor termEditor = new KeyValueEditor(composite, term, "key", "value", new TextField(), new TextField());
+ termEditor.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
+ termEditor.setKeyValidator(getNotEmptyValidator());
+ termEditor.setValueValidator(getNotEmptyValidator());
+
+ // range
+ createLabel(composite, "Range");
+ ListEditor rangeEditor = new ListEditor(composite, range);
+ rangeEditor.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
+ rangeEditor.setValidator(new IInputValidator() {
+ @Override
+ public String isValid(String newText) {
+ try {
+ RangeObject.build(newText);
+ return null;
+ } catch (Exception e) {
+ return e.getMessage();
+ }
+ }
+ });
+
+ return composite;
+ }
+
+ private Control getPaginationComposite(Composite parent) {
+ Composite composite = new Composite(parent, SWT.NONE);
+
+ composite.setLayout(new GridLayout(2, false));
+
+ // order By
+ createLabel(composite, "OrderBy");
+
+ KeyValueEditor orderByEditor = new KeyValueEditor(composite, orderBy, "key", "value", new TextField(), new ComboField(Arrays.asList("asc","desc")));
+ orderByEditor.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
+ orderByEditor.setKeyValidator(getNotEmptyValidator());
+ orderByEditor.setValueValidator(getNotEmptyValidator());
+
+ // size
+ createLabel(composite, "Size", true, false);
+ sizeEditor = createSpinner(composite, 0, 1000, 10, 1, 100);
+
+ // from
+ createLabel(composite, "From", true, false);
+ fromEditor = createSpinner(composite, 0, 10000, 10, 1, 100);
+
+ return composite;
+ }
+
+ private IInputValidator getNotEmptyValidator() {
+ return new IInputValidator() {
+ @Override
+ public String isValid(String text) {
+ if (text == null || text.isEmpty())
+ return "Empty value is not allowed";
+ else
+ return null;
+ }
+ };
+ }
+
+ private static void createLabel(Composite parent, String text) {
+ createLabel(parent, text, true, true);
+ }
+
+ private static void createLabel(Composite parent, String text, boolean grabExcessHorizontalSpace, boolean grabExcessVerticalSpace) {
+ Label label = new Label(parent, SWT.LEFT);
+ label.setLayoutData(new GridData(SWT.FILL, SWT.FILL, grabExcessHorizontalSpace, grabExcessVerticalSpace, 1, 1));
+ label.setText(text);
+ }
+
+ private static Spinner createSpinner(Composite parent, int min, int max, int sel, int inc, int page) {
+ Spinner spinner = new Spinner (parent, SWT.BORDER);
+ spinner.setMinimum(min);
+ spinner.setMaximum(max);
+ spinner.setSelection(sel);
+ spinner.setIncrement(inc);
+ spinner.setPageIncrement(page);
+ spinner.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1));
+
+ return spinner;
+ }
+
+
+ /* ============= */
+ /* MODEL GETTERS */
+ /* ============= */
+
+ String getModelType() {
+ int index = typeCombo.getSelectionIndex();
+ if (index == -1)
+ return null;
+ else
+ return typeValues[index];
+ }
+
+ Map<String, String> getModelMatch() {
+ return match;
+ }
+
+ Map<String, String> getModelTerm() {
+ return term;
+ }
+
+ List<RangeObject> getModelRange() {
+ List<RangeObject> retval = new ArrayList<>();
+ for (String str : range)
+ retval.add(RangeObject.build(str));
+ return retval;
+ }
+
+ Map<String, String> getOrderBy() {
+ return orderBy;
+ }
+
+ int getSize() {
+ return sizeEditor.getSelection();
+ }
+
+ int getFrom() {
+ return fromEditor.getSelection();
+ }
+}
diff --git a/ui/org.eclipse.sensinact.studio.view.piax/src/org/eclipse/sensinact/studio/view/piax/RangeObject.java b/ui/org.eclipse.sensinact.studio.view.piax/src/org/eclipse/sensinact/studio/view/piax/RangeObject.java
new file mode 100644
index 0000000..22b8a45
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.view.piax/src/org/eclipse/sensinact/studio/view/piax/RangeObject.java
@@ -0,0 +1,61 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.view.piax;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class RangeObject {
+
+ private static final String allowedOperators[] = { "<", ">" };
+
+ private final String key;
+ private final String operator;
+ private final long value;
+
+ public static RangeObject build(String text) {
+
+ for (String op : allowedOperators) {
+ int idx = text.indexOf(op);
+
+ if (idx != -1) {
+ String tmpKey = text.substring(0, idx).trim();
+ String tmpValue = text.substring(idx + op.length()).trim();
+ if (!tmpKey.isEmpty() && !tmpValue.isEmpty()) {
+ try {
+ return new RangeObject(tmpKey, op, Long.parseLong(tmpValue));
+ } catch (NumberFormatException e) {
+ // do nothing... just iterate...
+ }
+ }
+ }
+ }
+ throw new IllegalArgumentException(text + " is not a valid range");
+ }
+
+ private RangeObject(String key, String operator, long value) {
+ this.key = key;
+ this.operator = operator;
+ this.value = value;
+ }
+
+ public String getKey() {
+ return key;
+ }
+
+ public String getOperator() {
+ return operator;
+ }
+
+ public long getValue() {
+ return value;
+ }
+}
diff --git a/ui/org.eclipse.sensinact.studio.view.projectexplorer/META-INF/MANIFEST.MF b/ui/org.eclipse.sensinact.studio.view.projectexplorer/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..9ab89cf
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.view.projectexplorer/META-INF/MANIFEST.MF
@@ -0,0 +1,19 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Projectexplorer
+Bundle-SymbolicName: org.eclipse.sensinact.studio.view.projectexplorer;singleton:=true
+Bundle-Version: 1.0.0.qualifier
+Bundle-Activator: org.eclipse.sensinact.studio.view.projectexplorer.Activator
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.sensinact.studio.model.resource,
+ org.json,
+ org.eclipse.core.resources,
+ org.eclipse.sensinact.studio.language.sensinact,
+ org.eclipse.sensinact.studio.model.manager,
+ org.eclipse.sensinact.studio.http,
+ org.apache.log4j,
+ org.eclipse.sensinact.studio.ui.common
+Bundle-RequiredExecutionEnvironment: JavaSE-1.7
+Bundle-ActivationPolicy: lazy
+Import-Package: org.apache.log4j
diff --git a/ui/org.eclipse.sensinact.studio.view.projectexplorer/about.html b/ui/org.eclipse.sensinact.studio.view.projectexplorer/about.html
new file mode 100644
index 0000000..3b39f88
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.view.projectexplorer/about.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"><head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 5, 2006</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+
+</body></html>
\ No newline at end of file
diff --git a/ui/org.eclipse.sensinact.studio.view.projectexplorer/build.properties b/ui/org.eclipse.sensinact.studio.view.projectexplorer/build.properties
new file mode 100644
index 0000000..9fffc12
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.view.projectexplorer/build.properties
@@ -0,0 +1,16 @@
+#
+# Copyright (c) 2017 CEA.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+# CEA - initial API and implementation and/or initial documentation
+#
+
+source.. = src/
+output.. = bin/
+bin.includes = plugin.xml,\
+ META-INF/,\
+ .
diff --git a/ui/org.eclipse.sensinact.studio.view.projectexplorer/plugin.xml b/ui/org.eclipse.sensinact.studio.view.projectexplorer/plugin.xml
new file mode 100644
index 0000000..7a9160f
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.view.projectexplorer/plugin.xml
@@ -0,0 +1,112 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Copyright (c) 2017 CEA.
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+
+ Contributors:
+ CEA - initial API and implementation and/or initial documentation
+
+-->
+<?eclipse version="3.0"?>
+
+<plugin>
+ <extension
+ point="org.eclipse.ui.handlers">
+ <handler
+ class="org.eclipse.sensinact.studio.view.projectexplorer.handler.SnaDeployHandler"
+ commandId="org.eclipse.sensinact.studio.language.sensinact.ui.handler.GenerationCommand">
+ </handler>
+ </extension>
+
+ <extension
+ point="org.eclipse.ui.handlers">
+ <handler
+ class="org.eclipse.sensinact.studio.view.projectexplorer.handler.SnaRemoveHandler"
+ commandId="org.eclipse.sensinact.studio.language.sensinact.ui.handler.StopCommand">
+ </handler>
+ </extension>
+
+ <extension
+ point="org.eclipse.ui.commands">
+ <command
+ id="org.eclipse.sensinact.studio.language.sensinact.ui.handler.GenerationCommand"
+ name="Deploy IoT application">
+ </command>
+ </extension>
+
+ <extension
+ point="org.eclipse.ui.commands">
+ <command
+ id="org.eclipse.sensinact.studio.language.sensinact.ui.handler.StopCommand"
+ name="Remove IoT application">
+ </command>
+ </extension>
+
+ <extension point="org.eclipse.ui.menus">
+ <menuContribution locationURI="popup:org.eclipse.ui.navigator.ProjectExplorer#PopupMenu">
+ <command
+ commandId="org.eclipse.sensinact.studio.language.sensinact.ui.handler.GenerationCommand">
+ <visibleWhen>
+ <with variable="activeMenuSelection">
+ <iterate
+ ifEmpty="false">
+ <adapt type="org.eclipse.core.resources.IResource">
+ <test property="org.eclipse.core.resources.name" value="*.sna" />
+ </adapt>
+ </iterate>
+ </with>
+ </visibleWhen>
+ </command>
+ </menuContribution>
+ </extension>
+
+ <extension point="org.eclipse.ui.menus">
+ <menuContribution locationURI="popup:org.eclipse.ui.navigator.ProjectExplorer#PopupMenu">
+ <command
+ commandId="org.eclipse.sensinact.studio.language.sensinact.ui.handler.StopCommand">
+ <visibleWhen>
+ <with variable="activeMenuSelection">
+ <iterate
+ ifEmpty="false">
+ <adapt type="org.eclipse.core.resources.IResource">
+ <test property="org.eclipse.core.resources.name" value="*.sna" />
+ </adapt>
+ </iterate>
+ </with>
+ </visibleWhen>
+ </command>
+ </menuContribution>
+ </extension>
+
+ <extension point="org.eclipse.ui.menus">
+ <menuContribution locationURI="popup:#TextEditorContext?after=group.edit">
+ <command
+ commandId="org.eclipse.sensinact.studio.language.sensinact.ui.handler.GenerationCommand"
+ style="push">
+ <visibleWhen checkEnabled="false">
+ <reference
+ definitionId="org.eclipse.sensinact.studio.language.Sensinact.Editor.opened">
+ </reference>
+ </visibleWhen>
+ </command>
+ </menuContribution>
+ </extension>
+
+ <extension point="org.eclipse.ui.menus">
+ <menuContribution locationURI="popup:#TextEditorContext?after=group.edit">
+ <command
+ commandId="org.eclipse.sensinact.studio.language.sensinact.ui.handler.StopCommand"
+ style="push">
+ <visibleWhen checkEnabled="false">
+ <reference
+ definitionId="org.eclipse.sensinact.studio.language.Sensinact.Editor.opened">
+ </reference>
+ </visibleWhen>
+ </command>
+ </menuContribution>
+ </extension>
+</plugin>
diff --git a/ui/org.eclipse.sensinact.studio.view.projectexplorer/src/org/eclipse/sensinact/studio/view/projectexplorer/Activator.java b/ui/org.eclipse.sensinact.studio.view.projectexplorer/src/org/eclipse/sensinact/studio/view/projectexplorer/Activator.java
new file mode 100644
index 0000000..2888662
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.view.projectexplorer/src/org/eclipse/sensinact/studio/view/projectexplorer/Activator.java
@@ -0,0 +1,59 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.view.projectexplorer;
+
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class Activator extends AbstractUIPlugin {
+
+ // The plug-in ID
+ public static final String PLUGIN_ID = "org.eclipse.sensinact.studio.view.projectexplorer"; //$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)
+ */
+ 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)
+ */
+ 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;
+ }
+}
diff --git a/ui/org.eclipse.sensinact.studio.view.projectexplorer/src/org/eclipse/sensinact/studio/view/projectexplorer/handler/SnaAppHandler.java b/ui/org.eclipse.sensinact.studio.view.projectexplorer/src/org/eclipse/sensinact/studio/view/projectexplorer/handler/SnaAppHandler.java
new file mode 100644
index 0000000..d6ec2f2
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.view.projectexplorer/src/org/eclipse/sensinact/studio/view/projectexplorer/handler/SnaAppHandler.java
@@ -0,0 +1,82 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.view.projectexplorer.handler;
+
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.sensinact.studio.http.client.snamessage.SnaMessage;
+import org.eclipse.sensinact.studio.ui.common.dialog.SnaHandler;
+import org.eclipse.swt.widgets.Shell;
+
+import org.eclipse.sensinact.studio.language.sensinact.DSL_SENSINACT;
+import org.eclipse.sensinact.studio.language.sensinact.Sensinact;
+
+/**
+ * @author Etienne Gandrille
+ */
+public abstract class SnaAppHandler extends SnaHandler {
+
+ protected DSL_SENSINACT fileURI2eca(URI uri) {
+ ResourceSet rs = new ResourceSetImpl();
+ org.eclipse.emf.ecore.resource.Resource r = rs.getResource(uri, true);
+ Sensinact sens = (Sensinact) r.getContents().get(0);
+ return sens.getEca();
+ }
+
+ protected URI selection2fileURI(ExecutionEvent event) {
+ Object firstElement = getSelectedElement(event);
+ if (firstElement != null && firstElement instanceof IFile) {
+ IFile file = (IFile) firstElement;
+ // IProject project = file.getProject();
+ // createFolder(project);
+ return URI.createPlatformResourceURI(file.getFullPath().toString(), true);
+ }
+
+ return null;
+ }
+
+ protected void createFolder(IProject project) throws CoreException {
+ IFolder srcGenFolder = project.getFolder("src-gen");
+ if (!srcGenFolder.exists()) {
+ srcGenFolder.create(true, true, new NullProgressMonitor());
+ }
+ }
+
+ protected String computeRuleName(URI snaFileURI) {
+ String fileName = snaFileURI.segment(snaFileURI.segmentCount()-1);
+
+ // removes extension at the end of the filename
+ if (fileName.lastIndexOf(".") != -1)
+ fileName = fileName.substring(0, fileName.lastIndexOf("."));
+ return fileName;
+ }
+
+ protected void displayResult(Shell shell, String title, String fileName, SnaMessage response) {
+ String description = response.getFullDescription() + "\n" + "filename: " + fileName;
+ if (response.isValid())
+ MessageDialog.openInformation(shell, title, description);
+ else
+ MessageDialog.openError(shell, title, description);
+ }
+
+ protected void displayResult(Shell shell, String title, String fileName, Exception e) {
+ String description = e.getMessage() + "\n" + "filename: " + fileName;
+ MessageDialog.openError(shell, title, description);
+ }
+}
diff --git a/ui/org.eclipse.sensinact.studio.view.projectexplorer/src/org/eclipse/sensinact/studio/view/projectexplorer/handler/SnaDeployHandler.java b/ui/org.eclipse.sensinact.studio.view.projectexplorer/src/org/eclipse/sensinact/studio/view/projectexplorer/handler/SnaDeployHandler.java
new file mode 100644
index 0000000..8047827
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.view.projectexplorer/src/org/eclipse/sensinact/studio/view/projectexplorer/handler/SnaDeployHandler.java
@@ -0,0 +1,98 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+
+package org.eclipse.sensinact.studio.view.projectexplorer.handler;
+
+import java.io.IOException;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.apache.log4j.Logger;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.sensinact.studio.http.client.GatewayHttpClient;
+import org.eclipse.sensinact.studio.http.client.snamessage.SnaMessage;
+import org.eclipse.sensinact.studio.model.resource.utils.Constants;
+import org.eclipse.sensinact.studio.model.resource.utils.ResourceDescriptor;
+import org.eclipse.sensinact.studio.model.resource.utils.Segments;
+import org.eclipse.sensinact.studio.view.projectexplorer.handler.sna2json.SnaToJsonUtil;
+import org.eclipse.swt.widgets.Shell;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Resource;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_SENSINACT;
+import org.eclipse.sensinact.studio.resource.AccessMethodType;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class SnaDeployHandler extends SnaAppHandler {
+
+ private static final Logger logger = Logger.getLogger(SnaDeployHandler.class);
+
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+
+ Shell shell = getShell(event);
+ URI snaFileURI = selection2fileURI(event);
+ String fileName = computeRuleName(snaFileURI);
+
+ try {
+ DSL_SENSINACT sna = fileURI2eca(snaFileURI);
+ JSONObject app = generateJsonApplication(sna, fileName);
+ String gatewayID = getGatewayID(sna);
+
+ SnaMessage response = install(Constants.createInstallAppRD(gatewayID), app);
+ String title = response.isValid() ? "Application deployed" : "Application deploy failed";
+ displayResult(shell, title, fileName, response);
+ } catch (Exception e) {
+ displayResult(shell, "Application deploy failed", fileName, e);
+ logger.error("Application deploy failed", e);
+ return null;
+ }
+
+ return null;
+ }
+
+ private SnaMessage install(ResourceDescriptor resource, JSONObject json) throws IOException {
+ Segments path = new Segments.Builder().resource(resource).method(AccessMethodType.ACT).build();
+ return GatewayHttpClient.sendPostRequest(path, json);
+ }
+
+ private JSONObject generateJsonApplication(DSL_SENSINACT sna, String fileName) throws JSONException {
+ SnaParsingResult parsingResult = SnaToJsonUtil.parseSnaFile(sna, fileName);
+ JSONObject app = parsingResult.getApplication();
+ logger.debug("json sent");
+ logger.debug(app);
+ return app;
+ }
+
+ private String getGatewayID(DSL_SENSINACT sna) {
+ Set<String> gateways = new HashSet<>();
+
+ if (sna == null)
+ throw new IllegalArgumentException("");
+
+ for (DSL_Resource resource : sna.getResources()) {
+ gateways.add(resource.getGatewayID());
+ }
+
+ if (gateways.size() == 0) {
+ throw new IllegalArgumentException("No gateway referenced in the sna file");
+ }
+ if (gateways.size() == 1) {
+ return gateways.iterator().next();
+ }
+ throw new IllegalArgumentException(gateways.size() + " gateways are referenced in the sna file. Only one is allowed.");
+ }
+}
diff --git a/ui/org.eclipse.sensinact.studio.view.projectexplorer/src/org/eclipse/sensinact/studio/view/projectexplorer/handler/SnaParsingResult.java b/ui/org.eclipse.sensinact.studio.view.projectexplorer/src/org/eclipse/sensinact/studio/view/projectexplorer/handler/SnaParsingResult.java
new file mode 100644
index 0000000..76985d2
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.view.projectexplorer/src/org/eclipse/sensinact/studio/view/projectexplorer/handler/SnaParsingResult.java
@@ -0,0 +1,29 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.view.projectexplorer.handler;
+
+import org.json.JSONObject;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class SnaParsingResult {
+
+ private final JSONObject jsonApplication;
+
+ public SnaParsingResult(JSONObject jsonApplication) {
+ this.jsonApplication = jsonApplication;
+ }
+
+ public JSONObject getApplication() {
+ return jsonApplication;
+ }
+}
diff --git a/ui/org.eclipse.sensinact.studio.view.projectexplorer/src/org/eclipse/sensinact/studio/view/projectexplorer/handler/SnaRemoveHandler.java b/ui/org.eclipse.sensinact.studio.view.projectexplorer/src/org/eclipse/sensinact/studio/view/projectexplorer/handler/SnaRemoveHandler.java
new file mode 100644
index 0000000..0a92a13
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.view.projectexplorer/src/org/eclipse/sensinact/studio/view/projectexplorer/handler/SnaRemoveHandler.java
@@ -0,0 +1,69 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+
+package org.eclipse.sensinact.studio.view.projectexplorer.handler;
+
+import java.io.IOException;
+
+import org.apache.log4j.Logger;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.sensinact.studio.http.client.GatewayHttpClient;
+import org.eclipse.sensinact.studio.http.client.snamessage.SnaMessage;
+import org.eclipse.sensinact.studio.model.resource.utils.Constants;
+import org.eclipse.sensinact.studio.model.resource.utils.JsonUtil;
+import org.eclipse.sensinact.studio.model.resource.utils.ResourceDescriptor;
+import org.eclipse.sensinact.studio.model.resource.utils.Segments;
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import org.eclipse.sensinact.studio.resource.AccessMethodType;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class SnaRemoveHandler extends SnaAppHandler {
+
+ private static final Logger logger = Logger.getLogger(SnaRemoveHandler.class);
+
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+
+ URI snaFileURI = selection2fileURI(event);
+ String fileName = computeRuleName(snaFileURI);
+
+ try {
+ // TODO remove this when gateway management will be implemented
+ String gatewayID = null;
+
+ SnaMessage response = uninstall(Constants.createUninstallAppRD(gatewayID), fileName);
+ displayResult(getShell(event), "Application removed", fileName, response);
+ } catch (Exception e) {
+ displayResult(getShell(event), "Application removed", fileName, e);
+ logger.error("Application removal failed", e);
+ return null;
+ }
+
+ return null;
+ }
+
+ private SnaMessage uninstall(ResourceDescriptor resource, String name) throws JSONException, IOException {
+ JSONArray jsonParameters = new JSONArray();
+ JSONObject info = JsonUtil.createNameTypeValue("name", String.class.getName(), name);
+ jsonParameters.put(info);
+ JSONObject params = new JSONObject();
+ params.put("parameters", jsonParameters);
+ Segments path = new Segments.Builder().resource(resource).method(AccessMethodType.ACT).build();
+ return GatewayHttpClient.sendPostRequest(path, jsonParameters);
+ }
+}
diff --git a/ui/org.eclipse.sensinact.studio.view.projectexplorer/src/org/eclipse/sensinact/studio/view/projectexplorer/handler/sna2json/BooleanVariableEventManager.java b/ui/org.eclipse.sensinact.studio.view.projectexplorer/src/org/eclipse/sensinact/studio/view/projectexplorer/handler/sna2json/BooleanVariableEventManager.java
new file mode 100644
index 0000000..3ebe01c
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.view.projectexplorer/src/org/eclipse/sensinact/studio/view/projectexplorer/handler/sna2json/BooleanVariableEventManager.java
@@ -0,0 +1,52 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.view.projectexplorer.handler.sna2json;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class BooleanVariableEventManager implements EventManager {
+
+ private final boolean trueFalse;
+ private final String variable;
+
+ public BooleanVariableEventManager(String variable, boolean trueFalse) {
+ this.trueFalse = trueFalse;
+ this.variable = variable;
+ }
+
+ @Override
+ public List<JSONObject> getDefaultEvents() throws JSONException {
+ List<JSONObject> list = new ArrayList<>();
+
+ JSONObject vt = ComponentBuilder.valueType(variable, "variable");
+ JSONObject cond = new JSONObject();
+ cond.put("operator", "=");
+ cond.put("value", trueFalse);
+ cond.put("type", "boolean");
+ cond.put("complement", false);
+
+ JSONArray array = new JSONArray();
+ array.put(cond);
+
+ vt.put("conditions", array);
+ list.add(vt);
+
+ return list;
+ }
+}
\ No newline at end of file
diff --git a/ui/org.eclipse.sensinact.studio.view.projectexplorer/src/org/eclipse/sensinact/studio/view/projectexplorer/handler/sna2json/ComponentBuilder.java b/ui/org.eclipse.sensinact.studio.view.projectexplorer/src/org/eclipse/sensinact/studio/view/projectexplorer/handler/sna2json/ComponentBuilder.java
new file mode 100644
index 0000000..93f5e1b
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.view.projectexplorer/src/org/eclipse/sensinact/studio/view/projectexplorer/handler/sna2json/ComponentBuilder.java
@@ -0,0 +1,199 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.view.projectexplorer.handler.sna2json;
+
+import java.util.UUID;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import org.eclipse.sensinact.studio.language.sensinact.DSL_REF;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Resource;
+
+/**
+ * Helper class to build components which are JSON objects.
+ * @author Etienne Gandrille
+ */
+class ComponentBuilder {
+
+ private final String functionName;
+ private final String identifier;
+ private final boolean register;
+
+ private final JSONArray events = new JSONArray();
+ private final JSONArray runparameters = new JSONArray();
+
+ private final EventManager eventManager;
+ private final ResourcesDeclarationManager resMgr;
+
+ // To prevent the object from being built twice
+ private boolean isBuilt = false;
+
+ public ComponentBuilder(String functionName, String identifier, boolean register, EventManager eventManager, ResourcesDeclarationManager resMgr) {
+ this.functionName = functionName;
+ if (identifier == null || identifier.isEmpty())
+ this.identifier = UUID.randomUUID().toString();
+ else
+ this.identifier = identifier;
+ this.register = register;
+ this.eventManager = eventManager;
+ this.resMgr = resMgr;
+ }
+
+ public JSONObject build() throws JSONException {
+
+ if (isBuilt)
+ throw new RuntimeException("Object has already been built");
+ isBuilt = true;
+
+ JSONObject component = new JSONObject();
+ component.put("events", events);
+ component.put("function", buildFunction(functionName, runparameters));
+ component.put("identifier", identifier);
+
+ // register
+ JSONObject reg = new JSONObject();
+ reg.put("register", register);
+ component.put("properties", reg);
+
+ // default events
+ if (events.length() == 0) {
+ for (JSONObject object : eventManager.getDefaultEvents())
+ events.put(object);
+ }
+
+ return component;
+ }
+
+ private JSONObject buildFunction(String name, JSONArray runparameters) throws JSONException {
+ JSONObject function = new JSONObject();
+ function.put("name", name);
+ function.put("runparameters", runparameters);
+ return function;
+ }
+
+ public ComponentBuilder parameter(String value) throws JSONException {
+ runparameters.put(valueType(value, "string"));
+ return this;
+ }
+
+ public ComponentBuilder parameter(long value) throws JSONException {
+ runparameters.put(valueType(value));
+ return this;
+ }
+
+ public ComponentBuilder parameter(double value) throws JSONException {
+ runparameters.put(valueType(value));
+ return this;
+ }
+
+ public ComponentBuilder parameter(boolean value) throws JSONException {
+ runparameters.put(valueType(value));
+ return this;
+ }
+
+ public ComponentBuilder parameter(DSL_REF value) throws JSONException {
+ return resourceVariable(value, runparameters);
+ }
+
+ public ComponentBuilder parameterEvents(DSL_REF[] values) throws JSONException {
+ runparameters.put(valueType(values));
+ return this;
+ }
+
+ public ComponentBuilder parameterEvent(DSL_REF value) throws JSONException {
+ runparameters.put(valueType(value));
+ return this;
+ }
+
+ public ComponentBuilder parameterEvent(String name) throws JSONException {
+ runparameters.put(valueType(name, "event"));
+ return this;
+ }
+
+ public ComponentBuilder event(DSL_REF value) throws JSONException {
+ return resourceVariable(value, events);
+ }
+
+ public ComponentBuilder eventVariable(String value) throws JSONException {
+ events.put(valueType(value, "variable"));
+ return this;
+ }
+
+ private ComponentBuilder resourceVariable(DSL_REF value, JSONArray array) throws JSONException {
+ array.put(resourceVariableInternal(resMgr, value));
+ return this;
+ }
+
+ static JSONObject resourceVariableInternal(ResourcesDeclarationManager resMgr, DSL_REF value) throws JSONException {
+ String v = resMgr.getPathFromName(value.getName());
+ String t = getTypeName(value);
+ return valueType(v, t);
+ }
+
+ private JSONObject valueType(double value) throws JSONException {
+ JSONObject vt = new JSONObject();
+ vt.put("value", value);
+ vt.put("type", "double");
+ return vt;
+ }
+
+ private JSONObject valueType(long value) throws JSONException {
+ JSONObject vt = new JSONObject();
+ vt.put("value", value);
+ vt.put("type", "long");
+ return vt;
+ }
+
+ private JSONObject valueType(Boolean value) throws JSONException {
+ JSONObject vt = new JSONObject();
+ vt.put("value", value);
+ vt.put("type", "boolean");
+ return vt;
+ }
+
+
+ private JSONObject valueType(DSL_REF value) throws JSONException {
+ String v = resMgr.getPathFromName(value.getName());
+ String t = getTypeName(value);
+ return valueType(v, t);
+ }
+
+ private static String getTypeName(DSL_REF value) {
+ if (value instanceof DSL_Resource)
+ return"resource";
+ else
+ return "variable";
+ }
+
+ static JSONObject valueType(String value, String type) throws JSONException {
+ JSONObject vt = new JSONObject();
+ vt.put("value", value);
+ vt.put("type", type);
+ return vt;
+ }
+
+ private JSONObject valueType(DSL_REF[] values) throws JSONException {
+ JSONObject vt = new JSONObject();
+ JSONArray val = new JSONArray();
+ for (DSL_REF v : values)
+ val.put(resMgr.getPathFromName(v.getName()));
+ vt.put("value", val);
+ vt.put("type", "todo"); // syntax error : we can't assume all values have the same type
+ return vt;
+ }
+
+ public ComponentBuilder parameterVariable(String name) throws JSONException {
+ runparameters.put(valueType(name, "variable"));
+ return this;
+ }
+}
diff --git a/ui/org.eclipse.sensinact.studio.view.projectexplorer/src/org/eclipse/sensinact/studio/view/projectexplorer/handler/sna2json/EventManager.java b/ui/org.eclipse.sensinact.studio.view.projectexplorer/src/org/eclipse/sensinact/studio/view/projectexplorer/handler/sna2json/EventManager.java
new file mode 100644
index 0000000..1b284b9
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.view.projectexplorer/src/org/eclipse/sensinact/studio/view/projectexplorer/handler/sna2json/EventManager.java
@@ -0,0 +1,26 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.view.projectexplorer.handler.sna2json;
+
+import java.util.List;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+/**
+ * The goal of an event manager is to provide the default events which should trigger a component if the component doesn't have any events.
+ * The EventManager is designed to be used by a component builder, just before a component is built.
+ * @author Etienne Gandrille
+ */
+public interface EventManager {
+
+ public abstract List<JSONObject> getDefaultEvents() throws JSONException;
+}
\ No newline at end of file
diff --git a/ui/org.eclipse.sensinact.studio.view.projectexplorer/src/org/eclipse/sensinact/studio/view/projectexplorer/handler/sna2json/IfEventManager.java b/ui/org.eclipse.sensinact.studio.view.projectexplorer/src/org/eclipse/sensinact/studio/view/projectexplorer/handler/sna2json/IfEventManager.java
new file mode 100644
index 0000000..8f649c7
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.view.projectexplorer/src/org/eclipse/sensinact/studio/view/projectexplorer/handler/sna2json/IfEventManager.java
@@ -0,0 +1,45 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.view.projectexplorer.handler.sna2json;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import org.eclipse.sensinact.studio.language.sensinact.DSL_REF;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class IfEventManager implements EventManager {
+
+ private final List<DSL_REF> triggers;
+ private final ResourcesDeclarationManager resMgr;
+
+ public IfEventManager(ResourcesDeclarationManager resMgr, List<DSL_REF> triggers) {
+ this.triggers = triggers;
+ this.resMgr = resMgr;
+ }
+
+ @Override
+ public List<JSONObject> getDefaultEvents() throws JSONException {
+ List<JSONObject> list = new ArrayList<>();
+
+ for (DSL_REF ref : triggers) {
+ list.add(ComponentBuilder.resourceVariableInternal(resMgr, ref));
+ }
+
+ return list;
+ }
+
+}
\ No newline at end of file
diff --git a/ui/org.eclipse.sensinact.studio.view.projectexplorer/src/org/eclipse/sensinact/studio/view/projectexplorer/handler/sna2json/ResourcesDeclarationManager.java b/ui/org.eclipse.sensinact.studio.view.projectexplorer/src/org/eclipse/sensinact/studio/view/projectexplorer/handler/sna2json/ResourcesDeclarationManager.java
new file mode 100644
index 0000000..1b9887f
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.view.projectexplorer/src/org/eclipse/sensinact/studio/view/projectexplorer/handler/sna2json/ResourcesDeclarationManager.java
@@ -0,0 +1,44 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.view.projectexplorer.handler.sna2json;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Resource;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class ResourcesDeclarationManager {
+
+ private final Map<String, DSL_Resource> name2fullPath = new HashMap<>();
+
+ public ResourcesDeclarationManager(EList<DSL_Resource> resources) {
+ for (DSL_Resource resource : resources) {
+ name2fullPath.put(resource.getName(), resource);
+ }
+ }
+
+ public DSL_Resource getResourceFromName(String name) {
+ DSL_Resource resource = name2fullPath.get(name);
+ if (resource == null)
+ throw new IllegalArgumentException(name);
+ return resource;
+ }
+
+ public String getPathFromName(String name) {
+ DSL_Resource resource = getResourceFromName(name);
+ return "/" + resource.getDeviceID() + "/" + resource.getServiceID() + "/" + resource.getResourceID();
+ }
+}
diff --git a/ui/org.eclipse.sensinact.studio.view.projectexplorer/src/org/eclipse/sensinact/studio/view/projectexplorer/handler/sna2json/SnaToJsonUtil.java b/ui/org.eclipse.sensinact.studio.view.projectexplorer/src/org/eclipse/sensinact/studio/view/projectexplorer/handler/sna2json/SnaToJsonUtil.java
new file mode 100644
index 0000000..7dfc737
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.view.projectexplorer/src/org/eclipse/sensinact/studio/view/projectexplorer/handler/sna2json/SnaToJsonUtil.java
@@ -0,0 +1,780 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+
+package org.eclipse.sensinact.studio.view.projectexplorer.handler.sna2json;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.log4j.Logger;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.sensinact.studio.model.resource.utils.JsonUtil;
+import org.eclipse.sensinact.studio.view.projectexplorer.handler.SnaParsingResult;
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_AFTER;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_AVG;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_BEFORE;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_COINCIDE;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_COUNT;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_DURATION;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_DURATION_MIN;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_DURATION_SEC;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_MAX;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_MIN;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_STATEMENT;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_SUM;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_ECA_STATEMENT;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_ElseDo;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_ElseIfDo;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Expression;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_And;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Diff;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Division;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Equal;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Larger;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Larger_Equal;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Minus;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Modulo;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Multiplication;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Negate;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Or;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Plus;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Smaller;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Smaller_Equal;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_IfDo;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Object_Boolean;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Object_Number;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Object_Ref;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Object_String;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_REF;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_REF_CONDITION;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_ResourceAction;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_SENSINACT;
+
+/**
+ * Converts a SNA file into a JSON one packed into a SnaParsingResult object.
+ *
+ * This class offers a single entry point : the static public method
+ * parseSnaFile.
+ * @author Etienne Gandrille
+ */
+public abstract class SnaToJsonUtil {
+
+ /** The logger */
+ private static final Logger logger = Logger.getLogger(SnaToJsonUtil.class);
+
+ /**
+ * Converts a SNA file into a JSON one packed into a SnaParsingResult
+ * object.
+ *
+ * @param fileModel
+ * the file model
+ * @param fileName
+ * the file name
+ * @return A JSON packed into a SnaParsingResult object
+ * @throws JSONException
+ */
+ public static SnaParsingResult parseSnaFile(DSL_SENSINACT fileModel, String fileName) throws JSONException {
+
+ JSONArray components = new JSONArray();
+ JSONObject finalize = new JSONObject();
+ ResourcesDeclarationManager resMgr = new ResourcesDeclarationManager(fileModel.getResources());
+
+ // set up file structure
+ JSONObject root = initFileStructure(fileName, components, finalize);
+
+ // CEP
+ for (DSL_CEP_STATEMENT cep : fileModel.getCep()) {
+ components.put(parseCepStatement(resMgr, cep));
+ }
+
+ // On
+ List<DSL_REF> triggers = new ArrayList<>();
+ for (DSL_REF_CONDITION triger : fileModel.getOn().getTriggers()) {
+ triggers.add(triger.getRef());
+ }
+
+ // If ... do ... else if ... do ... else do ... endif
+ DSL_ECA_STATEMENT eca = fileModel.getEca();
+ parseEcaStatement(resMgr, eca, components, triggers);
+
+ return new SnaParsingResult(root);
+ }
+
+ /**
+ * Parse an ECA statement and updates the JSON component array.
+ *
+ * @param eca
+ * @param components
+ * @param triggers
+ * @throws JSONException
+ */
+ private static void parseEcaStatement(ResourcesDeclarationManager resMgr, DSL_ECA_STATEMENT eca, JSONArray components, List<DSL_REF> triggers) throws JSONException {
+
+ VariableGenerator var = VariableGenerator.get("condition");
+
+ // if ...
+ try {
+ DSL_Expression expre = eca.getIfdo().getCondition();
+ EventManager eventManager = new IfEventManager(resMgr, triggers);
+ parseExpression(components, expre, triggers, eventManager, resMgr, var.newVariable());
+ } catch (JSONException e) {
+ logger.error("condition parsing error", e);
+ }
+
+ // do ...
+ DSL_IfDo ifDo = eca.getIfdo();
+ if (ifDo != null && ifDo.getActions() != null && ifDo.getActions().getActionList() != null) {
+ EList<DSL_ResourceAction> actionsTrue = ifDo.getActions().getActionList();
+ parseConditionalActions(resMgr, components, var.curVariable(), true, actionsTrue);
+ }
+
+ // else if ... do ...
+ EList<DSL_ElseIfDo> elseIfDoList = eca.getElseIfdo();
+ if (elseIfDoList != null) {
+
+ for (DSL_ElseIfDo elseIfDo : elseIfDoList) {
+
+ // else if ...
+ try {
+ DSL_Expression expre = elseIfDo.getCondition();
+ EventManager eventManager = new BooleanVariableEventManager(var.curVariable(), false);
+ parseExpression(components, expre, null, eventManager, resMgr, var.newVariable());
+ } catch (JSONException e) {
+ logger.error("condition parsing error", e);
+ }
+
+ // do ...
+ if (elseIfDo.getActions() != null && elseIfDo.getActions().getActionList() != null) {
+ EList<DSL_ResourceAction> actionsTrue = elseIfDo.getActions().getActionList();
+ parseConditionalActions(resMgr, components, var.curVariable(), true, actionsTrue);
+ }
+ }
+ }
+
+ // else do ...
+ DSL_ElseDo elseDo = eca.getElsedo();
+ if (elseDo != null && elseDo.getActions() != null && elseDo.getActions().getActionList() != null) {
+ EList<DSL_ResourceAction> actionsFalse = elseDo.getActions().getActionList();
+ parseConditionalActions(resMgr, components, var.curVariable(), false, actionsFalse);
+ }
+ }
+
+ /**
+ * Creates a JSON skeleton.
+ *
+ * @param fileName
+ * the file name
+ * @param components
+ * a components array
+ * @param finalize
+ * a finalize statement array
+ * @return the JSON skeleton
+ */
+ private static JSONObject initFileStructure(String fileName, JSONArray components, JSONObject finalize) {
+ try {
+ JSONObject root = new JSONObject();
+
+ JSONArray parameters = new JSONArray();
+ root.put("parameters", parameters);
+
+ JSONObject info = JsonUtil.createNameTypeValue("name", String.class.getName(), fileName);
+ parameters.put(info);
+
+ JSONObject contentValue = new JSONObject();
+ JSONObject content = JsonUtil.createNameTypeValue("content", JSONObject.class.getName(), contentValue);
+ parameters.put(content);
+
+ // initialize
+ JSONObject initializeResources = new JSONObject();
+ contentValue.put("initialize", initializeResources);
+
+ // application
+ contentValue.put("application", components);
+
+ // finalize
+ contentValue.put("finalize", finalize);
+
+ return root;
+ } catch (JSONException e) {
+ logger.error("JSON init failed", e);
+ throw new RuntimeException("JSON init failed", e);
+ }
+ }
+
+ /**
+ * Creates a JSON component representing a CEP statement. This component is
+ * triggered by the function parameters and the output is the variable name.
+ *
+ * @param statement
+ * a cep statement
+ * @return a JSON component
+ */
+ private static JSONObject parseCepStatement(ResourcesDeclarationManager resMgr, DSL_CEP_STATEMENT statement) {
+ try {
+ String variableName = statement.getName();
+ EObject operation = statement.getOperation();
+
+ if (operation instanceof DSL_CEP_AFTER) {
+ DSL_CEP_AFTER after = (DSL_CEP_AFTER) operation;
+
+ DSL_REF ref1 = after.getRef1().getRef();
+ DSL_REF ref2 = after.getRef2().getRef();
+ String start = buildDurationString(after.getStart());
+ String end = buildDurationString(after.getEnd());
+
+ ComponentBuilder cb = new ComponentBuilder("after", variableName, true, null, resMgr);
+ cb.event(ref1).event(ref2);
+ DSL_REF[] events = { ref1, ref2 };
+ cb.parameterEvents(events).parameter(start).parameter(end);
+
+ return cb.build();
+
+ } else if (operation instanceof DSL_CEP_BEFORE) {
+ DSL_CEP_BEFORE before = (DSL_CEP_BEFORE) operation;
+
+ DSL_REF ref1 = before.getRef1().getRef();
+ DSL_REF ref2 = before.getRef2().getRef();
+ String start = buildDurationString(before.getStart());
+ String end = buildDurationString(before.getEnd());
+
+ ComponentBuilder cb = new ComponentBuilder("before", variableName, true, null, resMgr);
+ cb.event(ref1).event(ref2);
+ DSL_REF[] events = { ref1, ref2 };
+ cb.parameterEvents(events).parameter(start).parameter(end);
+
+ return cb.build();
+
+ } else if (operation instanceof DSL_CEP_COINCIDE) {
+ DSL_CEP_COINCIDE coincide = (DSL_CEP_COINCIDE) operation;
+
+ DSL_REF ref1 = coincide.getRef1().getRef();
+ DSL_REF ref2 = coincide.getRef2().getRef();
+ String window = buildDurationString(coincide.getWindow());
+
+ ComponentBuilder cb = new ComponentBuilder("coincides", variableName, true, null, resMgr);
+ cb.event(ref1).event(ref2);
+ DSL_REF[] events = { ref1, ref2 };
+ cb.parameterEvents(events).parameter(window);
+
+ return cb.build();
+
+ } else if (operation instanceof DSL_CEP_MIN) {
+ DSL_CEP_MIN min = (DSL_CEP_MIN) operation;
+
+ DSL_REF ref = min.getRef().getRef();
+ String window = buildDurationString(min.getWindow());
+
+ ComponentBuilder cb = new ComponentBuilder("min", variableName, true, null, resMgr);
+ cb.event(ref);
+ cb.parameterEvent(ref).parameter(window);
+
+ return cb.build();
+
+ } else if (operation instanceof DSL_CEP_MAX) {
+ DSL_CEP_MAX max = (DSL_CEP_MAX) operation;
+
+ DSL_REF ref = max.getRef().getRef();
+ String window = buildDurationString(max.getWindow());
+
+ ComponentBuilder cb = new ComponentBuilder("max", variableName, true, null, resMgr);
+ cb.event(ref);
+ cb.parameterEvent(ref).parameter(window);
+
+ return cb.build();
+
+ } else if (operation instanceof DSL_CEP_AVG) {
+ DSL_CEP_AVG avg = (DSL_CEP_AVG) operation;
+
+ DSL_REF ref = avg.getRef().getRef();
+ String window = buildDurationString(avg.getWindow());
+
+ ComponentBuilder cb = new ComponentBuilder("avg", variableName, true, null, resMgr);
+ cb.event(ref);
+ cb.parameterEvent(ref).parameter(window);
+
+ return cb.build();
+
+ } else if (operation instanceof DSL_CEP_SUM) {
+ DSL_CEP_SUM sum = (DSL_CEP_SUM) operation;
+
+ DSL_REF ref = sum.getRef().getRef();
+ String window = buildDurationString(sum.getWindow());
+
+ ComponentBuilder cb = new ComponentBuilder("sum", variableName, true, null, resMgr);
+ cb.event(ref);
+ cb.parameterEvent(ref).parameter(window);
+
+ return cb.build();
+
+ } else if (operation instanceof DSL_CEP_COUNT) {
+ DSL_CEP_COUNT count = (DSL_CEP_COUNT) operation;
+
+ DSL_REF ref = count.getRef().getRef();
+ String window = buildDurationString(count.getWindow());
+
+ ComponentBuilder cb = new ComponentBuilder("count", variableName, true, null, resMgr);
+ cb.event(ref);
+ cb.parameterEvent(ref).parameter(window);
+
+ return cb.build();
+
+ } else {
+ throw new RuntimeException("Unknown statement operation : should never happen");
+ }
+ } catch (JSONException e) {
+ logger.error("DSL_CEP_STATEMENT parsing error", e);
+ throw new RuntimeException("DSL_CEP_STATEMENT parsing error", e);
+ }
+ }
+
+ /**
+ * Parse actions which are embedded into a conditional statement. Creates
+ * components accordingly.
+ *
+ * @param actions
+ * an action list
+ * @param components
+ * the components array, to be populated
+ * @param triggerTrueFalse
+ * the conditional statement part
+ * @throws JSONException
+ */
+ private static void parseConditionalActions(ResourcesDeclarationManager resMgr, JSONArray components, String triggerVariable, boolean triggerTrueFalse, EList<DSL_ResourceAction> actions) throws JSONException {
+ for (DSL_ResourceAction action : actions) {
+ parseConditionalAction(resMgr, components, triggerVariable, triggerTrueFalse, action);
+ }
+ }
+
+ /**
+ * Parse an action which is embedded into a conditional statement. Creates
+ * components accordingly.
+ *
+ * @param actions
+ * an action
+ * @param components
+ * the components array, to be populated
+ * @param triggerTrueFalse
+ * the conditional statement part
+ * @throws JSONException
+ */
+ private static void parseConditionalAction(ResourcesDeclarationManager resMgr, JSONArray components, String triggerVariable, boolean triggerTrueFalse, DSL_ResourceAction action) throws JSONException {
+
+ BooleanVariableEventManager eventManager = new BooleanVariableEventManager(triggerVariable, triggerTrueFalse);
+ String identifier = action.getVariable();
+ boolean register = identifier != null;
+ ComponentBuilder cb = new ComponentBuilder(action.getActiontype(), identifier, register, eventManager, resMgr);
+
+ // First parameter is the resource name on which the act is applied
+ cb.parameter(action.getRef());
+ if (action.getListParam() != null && action.getListParam().getParam() != null)
+ {
+ for (DSL_Expression param : action.getListParam().getParam()) {
+ addParameter(param, cb, components, null, eventManager, resMgr);
+ }
+ }
+ components.put(cb.build());
+ }
+
+ /**
+ * Add component to handle an expression.
+ *
+ * @param expr
+ * The expression to be translated into components
+ * @param output
+ * The expression output variable name
+ * @param components
+ * The list of components, updated during the process
+ * @param triggers
+ * @param eventManager
+ * @throws JSONException
+ */
+ private static void parseExpression(JSONArray components, DSL_Expression expr, List<DSL_REF> triggers, EventManager eventManager, ResourcesDeclarationManager resMgr, String output)
+ throws JSONException {
+
+ // Or: left associative, priority 1
+ if (expr instanceof DSL_Expression_Or) {
+ DSL_Expression_Or or = (DSL_Expression_Or) expr;
+ DSL_Expression left = or.getLeft();
+ DSL_Expression right = or.getRight();
+ parseExpressionInternal(resMgr, components, "or", triggers, eventManager, output, left, right);
+ }
+
+ // And: left associative, priority 2
+ else if (expr instanceof DSL_Expression_And) {
+ DSL_Expression_And and = (DSL_Expression_And) expr;
+ DSL_Expression left = and.getLeft();
+ DSL_Expression right = and.getRight();
+ parseExpressionInternal(resMgr, components, "and", triggers, eventManager, output, left, right);
+ }
+
+ // different/equal: left associative, priority 3
+ else if (expr instanceof DSL_Expression_Diff) {
+ DSL_Expression_Diff diff = (DSL_Expression_Diff) expr;
+ DSL_Expression left = diff.getLeft();
+ DSL_Expression right = diff.getRight();
+ parseExpressionInternal(resMgr, components, "diff", triggers, eventManager, output, left, right);
+
+ } else if (expr instanceof DSL_Expression_Equal) {
+ DSL_Expression_Equal equal = (DSL_Expression_Equal) expr;
+ DSL_Expression left = equal.getLeft();
+ DSL_Expression right = equal.getRight();
+ parseExpressionInternal(resMgr, components, "equal", triggers, eventManager, output, left, right);
+ }
+
+ // Comparisons: left associative, priority 4
+ else if (expr instanceof DSL_Expression_Larger) {
+ DSL_Expression_Larger largerThan = (DSL_Expression_Larger) expr;
+ DSL_Expression left = largerThan.getLeft();
+ DSL_Expression right = largerThan.getRight();
+ parseExpressionInternal(resMgr, components, "greaterThan", triggers, eventManager, output, left, right);
+
+ } else if (expr instanceof DSL_Expression_Larger_Equal) {
+ DSL_Expression_Larger_Equal largerEqual = (DSL_Expression_Larger_Equal) expr;
+ DSL_Expression left = largerEqual.getLeft();
+ DSL_Expression right = largerEqual.getRight();
+ parseExpressionInternal(resMgr, components, "greaterEqual", triggers, eventManager, output, left, right);
+
+ } else if (expr instanceof DSL_Expression_Smaller) {
+ DSL_Expression_Smaller smallerThan = (DSL_Expression_Smaller) expr;
+ DSL_Expression left = smallerThan.getLeft();
+ DSL_Expression right = smallerThan.getRight();
+ parseExpressionInternal(resMgr, components, "lesserThan", triggers, eventManager, output, left, right);
+
+ } else if (expr instanceof DSL_Expression_Smaller_Equal) {
+ DSL_Expression_Smaller_Equal smallerEqual = (DSL_Expression_Smaller_Equal) expr;
+ DSL_Expression left = smallerEqual.getLeft();
+ DSL_Expression right = smallerEqual.getRight();
+ parseExpressionInternal(resMgr, components, "lesserEqual", triggers, eventManager, output, left, right);
+ }
+
+ // addition/subtraction: left associative, priority 5
+ else if (expr instanceof DSL_Expression_Plus) {
+ DSL_Expression_Plus plus = (DSL_Expression_Plus) expr;
+ DSL_Expression left = plus.getLeft();
+ DSL_Expression right = plus.getRight();
+ parseExpressionInternal(resMgr, components, "add", triggers, eventManager, output, left, right);
+
+ } else if (expr instanceof DSL_Expression_Minus) {
+ DSL_Expression_Minus minus = (DSL_Expression_Minus) expr;
+ DSL_Expression left = minus.getLeft();
+ DSL_Expression right = minus.getRight();
+ parseExpressionInternal(resMgr, components, "sub", triggers, eventManager, output, left, right);
+ }
+
+ // multiplication/division/modulo, left associative, priority 6
+ else if (expr instanceof DSL_Expression_Multiplication) {
+ DSL_Expression_Multiplication multiply = (DSL_Expression_Multiplication) expr;
+ DSL_Expression left = multiply.getLeft();
+ DSL_Expression right = multiply.getRight();
+ parseExpressionInternal(resMgr, components, "times", triggers, eventManager, output, left, right);
+
+ } else if (expr instanceof DSL_Expression_Division) {
+ DSL_Expression_Division divide = (DSL_Expression_Division) expr;
+ DSL_Expression left = divide.getLeft();
+ DSL_Expression right = divide.getRight();
+ parseExpressionInternal(resMgr, components, "div", triggers, eventManager, output, left, right);
+
+ } else if (expr instanceof DSL_Expression_Modulo) {
+ DSL_Expression_Modulo modulo = (DSL_Expression_Modulo) expr;
+ DSL_Expression left = modulo.getLeft();
+ DSL_Expression right = modulo.getRight();
+ parseExpressionInternal(resMgr, components, "mod", triggers, eventManager, output, left, right);
+ }
+
+ // Unary operators: right associative, priority 7
+ else if (expr instanceof DSL_Expression_Negate) {
+ DSL_Expression_Negate negate = (DSL_Expression_Negate) expr;
+ DSL_Expression exp = negate.getExp();
+ parseExpressionInternal(resMgr, components, "not", triggers, eventManager, output, exp);
+ }
+
+ else
+ throw new RuntimeException("Should never happend");
+ }
+
+ private static void parseExpressionInternal(ResourcesDeclarationManager resMgr, JSONArray components, String function, List<DSL_REF> triggers, EventManager eventManager,
+ String identifier, DSL_Expression... params) throws JSONException {
+ ComponentBuilder cb = new ComponentBuilder(function, identifier, false, eventManager, resMgr);
+ for (DSL_Expression param : params)
+ addParameter(param, cb, components, triggers, eventManager, resMgr);
+
+ components.put(cb.build());
+ }
+
+ private static void addParameter(DSL_Expression expr, ComponentBuilder cb, JSONArray components, List<DSL_REF> triggers, EventManager eventManager, ResourcesDeclarationManager resMgr)
+ throws JSONException {
+
+ if (expr instanceof DSL_Object_Number) {
+ DSL_Object_Number number = (DSL_Object_Number) expr;
+
+ try {
+ long value = number.getValue().longValueExact();
+ cb.parameter(value);
+ } catch (ArithmeticException e) {
+ double value = number.getValue().doubleValue();
+ cb.parameter(value);
+ }
+
+ } else if (expr instanceof DSL_Object_String) {
+ DSL_Object_String str = (DSL_Object_String) expr;
+ cb.parameter(str.getValue());
+
+ } else if (expr instanceof DSL_Object_Boolean) {
+ DSL_Object_Boolean bool = (DSL_Object_Boolean) expr;
+ cb.parameter(bool.isValue());
+
+ } else if (expr instanceof DSL_Object_Ref) {
+ DSL_Object_Ref objRef = (DSL_Object_Ref) expr;
+ DSL_REF ref = objRef.getValue();
+
+ if (triggers != null && refInList(ref, triggers)) {
+ cb.parameterEvent(ref);
+ cb.event(ref);
+ } else {
+ cb.parameter(ref);
+ }
+ } else {
+ String outputName = VariableGenerator.get("var").newVariable();
+ cb.parameterEvent(outputName);
+ cb.eventVariable(outputName);
+ parseExpression(components, expr, triggers, eventManager, resMgr, outputName);
+ }
+ }
+
+ /**
+ * Checks if a reference is inside a list.
+ *
+ * @param ref
+ * a reference
+ * @param a
+ * list of references
+ * @return true if the reference is inside the list, false otherwise.
+ */
+ private static boolean refInList(DSL_REF ref, List<DSL_REF> list) {
+ for (DSL_REF trigger : list)
+ if (trigger.getName().equals(ref.getName()))
+ return true;
+ return false;
+ }
+
+ /**
+ * Converts a cep duration into a string.
+ *
+ * @param duration
+ * @return a string
+ */
+ private static String buildDurationString(DSL_CEP_DURATION duration) {
+ StringBuilder sb = new StringBuilder();
+
+ if (duration != null && duration.getUnits() != null) {
+ for (EObject unit : duration.getUnits()) {
+ if (unit instanceof DSL_CEP_DURATION_MIN) {
+ DSL_CEP_DURATION_MIN min = (DSL_CEP_DURATION_MIN) unit;
+ sb.append(min.getMin());
+ sb.append(" min ");
+ } else if (unit instanceof DSL_CEP_DURATION_SEC) {
+ DSL_CEP_DURATION_SEC sec = (DSL_CEP_DURATION_SEC) unit;
+ sb.append(sec.getSec());
+ sb.append(" sec ");
+ } else {
+ throw new RuntimeException("Should never happen");
+ }
+ }
+ } else {
+ sb.append("0 sec");
+ }
+
+ return sb.toString().trim();
+ }
+
+ /* ============================================= */
+ /* Deprecated functions used by previous version */
+ /* Kept for a future refactoring */
+ /* ============================================= */
+ //
+ // private static JSONArray parseIfBlock(DSL_ECA_STATEMENT cond, String
+ // scriptName) {
+ //
+ // List<JSONObject> condList = new ArrayList<>();
+ // List<JSONObject> condListInv = new ArrayList<>();
+ // List<JSONArray> actionList = new ArrayList<>();
+ //
+ // // if ... do ... else if ... do ...
+ // for (EObject ifStatement : cond.getIfdo()) {
+ // try {
+ // DSL_ExpressionalStatement element = (DSL_ExpressionalStatement)
+ // ifStatement;
+ // JSONObject jsonConditions =
+ // buildLogicalExpression(element.getConditions().eContents().get(0),
+ // scriptName);
+ // JSONObject jsonConditionsInv = invertCondition(jsonConditions);
+ // JSONArray jsonActions = buildActions(element.getActions(), scriptName);
+ //
+ // condList.add(jsonConditions);
+ // condListInv.add(jsonConditionsInv);
+ // actionList.add(jsonActions);
+ // } catch (JSONException e) {
+ // logger.error("json parsing failed", e);
+ // }
+ // }
+ //
+ // // else
+ // JSONArray elseActions = null;
+ // DSL_ElseDo elseStatement = cond.getElsedo();
+ // if (elseStatement != null && elseStatement.getActions() != null) {
+ // try {
+ // elseActions = buildActions(elseStatement.getActions(), scriptName);
+ // } catch (JSONException e) {
+ // logger.error("json parsing failed", e);
+ // }
+ // }
+ //
+ // // BuildJson
+ // // =========
+ //
+ // JSONArray ifdoList = new JSONArray();
+ //
+ // // if ... do... else if ... do ....
+ // for (int i = 0; i < condList.size(); i++) {
+ // try {
+ // JSONObject curCondition = null;
+ // for (int j = 0; j <= i; j++) {
+ // JSONObject cur = (i == j) ? condList.get(j) : condListInv.get(j);
+ // if (curCondition == null)
+ // curCondition = cur;
+ // else
+ // curCondition = buildCondition(curCondition, "and", cur);
+ // }
+ //
+ // JSONObject newIfDo = new JSONObject();
+ // newIfDo.put("condition", curCondition);
+ // newIfDo.put("actions", actionList.get(i));
+ // ifdoList.put(newIfDo);
+ // } catch (JSONException e) {
+ // logger.error("json parsing failed", e);
+ // }
+ // }
+ //
+ // // else
+ // if (elseActions != null) {
+ // try {
+ // JSONObject condition = null;
+ // for (int i = 0; i < condList.size(); i++) {
+ // if (condition == null)
+ // condition = condListInv.get(i);
+ // else
+ // condition = buildCondition(condition, "and", condListInv.get(i));
+ // }
+ //
+ // JSONObject newIfDo = new JSONObject();
+ // newIfDo.put("condition", condition);
+ // newIfDo.put("actions", elseActions);
+ // ifdoList.put(newIfDo);
+ // } catch (JSONException e) {
+ // logger.error("json parsing failed", e);
+ // }
+ // }
+ //
+ // return ifdoList;
+ // }
+ //
+ // private static JSONArray buildParams(DSL_Resource ref, DSL_ListParam
+ // params, String actionType) throws JSONException {
+ // JSONArray jsonParameters = new JSONArray();
+ // int nbParams = (params == null || params.getParam() == null) ? 0 :
+ // params.getParam().size();
+ // ResourceDescriptor rDescriptor = new
+ // ResourceDescriptor(ref.getDeviceID(), ref.getServiceID(),
+ // ref.getResourceID());
+ //
+ // // access method
+ // AccessMethod modelAccessMethod = getAccessMethod(rDescriptor,
+ // AccessMethodType.getByName(actionType), nbParams);
+ // if (modelAccessMethod == null) {
+ // throw new RuntimeException("Can't find access method " + rDescriptor +
+ // "(" + actionType + ")" + " with " + nbParams + " parameters.");
+ // }
+ //
+ // // parameters...
+ // for (int paramNumber = 0; paramNumber < params.getParam().size();
+ // paramNumber++) {
+ // try {
+ // Parameter accessMethodParameter =
+ // modelAccessMethod.getParameter().get(paramNumber);
+ // String paramName = accessMethodParameter.getName();
+ // String paramType = accessMethodParameter.getType();
+ // DSL_Expression curParam = params.getParam().get(paramNumber);
+ // jsonParameters.put(createParameter(paramName, paramType, curParam));
+ // } catch (NullPointerException e) {
+ // logger.error("json parsing failed", e);
+ // }
+ // }
+ //
+ // return jsonParameters;
+ // }
+ //
+ // private static JSONObject createParameter(String paramName, String
+ // paramType, DSL_Expression paramValue) throws JSONException {
+ // if (paramValue instanceof DSL_Object_Number) {
+ // return JsonUtil.createNameTypeValue(paramName, paramType,
+ // ((DSL_Object_Number) paramValue).getValue());
+ // } else if (paramValue instanceof DSL_Object_String) {
+ // return JsonUtil.createNameTypeValue(paramName, paramType,
+ // ((DSL_Object_String) paramValue).getValue());
+ // } else if (paramValue instanceof DSL_Object_Boolean) {
+ // return JsonUtil.createNameTypeValue(paramName, paramType,
+ // ((DSL_Object_Boolean) paramValue).isValue());
+ // } else if (paramValue instanceof DSL_Object_Ref) {
+ // JSONObject retval = new JSONObject();
+ // retval.put("name", paramName);
+ // retval.put("variable", ((DSL_Object_Ref)
+ // paramValue).getValue().getName());
+ // return retval;
+ // }
+ // throw new IllegalArgumentException("Unknown class: " +
+ // paramValue.getClass());
+ // }
+ //
+ // private static AccessMethod getAccessMethod(ResourceDescriptor
+ // rDescriptor, AccessMethodType actionType, int nbOfParams) {
+ // // to be sure root has been initialized...
+ // ModelEditor.getRoot();
+ //
+ // Device device = ModelEditor.getDevice(rDescriptor.getDevice());
+ // if (device == null)
+ // return null;
+ // Service service = ModelEditor.getService(device,
+ // rDescriptor.getService());
+ // if (service == null)
+ // return null;
+ // Resource resource = ModelEditor.getResource(service,
+ // rDescriptor.getResource());
+ // if (resource == null)
+ // return null;
+ //
+ // if (resource.getAccessMethod().isEmpty()) {
+ // try {
+ // ModelUpdater.getInstance().updateResourceInformation(resource);
+ // } catch (IOException e) {
+ // logger.error("Update resource info failed", e);
+ // return null;
+ // }
+ // }
+ //
+ // return ModelEditor.getAccessMethodWithTypeNbParams(resource, actionType,
+ // nbOfParams);
+ // }
+}
diff --git a/ui/org.eclipse.sensinact.studio.view.projectexplorer/src/org/eclipse/sensinact/studio/view/projectexplorer/handler/sna2json/VariableGenerator.java b/ui/org.eclipse.sensinact.studio.view.projectexplorer/src/org/eclipse/sensinact/studio/view/projectexplorer/handler/sna2json/VariableGenerator.java
new file mode 100644
index 0000000..5d1458a
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.view.projectexplorer/src/org/eclipse/sensinact/studio/view/projectexplorer/handler/sna2json/VariableGenerator.java
@@ -0,0 +1,56 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+
+package org.eclipse.sensinact.studio.view.projectexplorer.handler.sna2json;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class VariableGenerator {
+
+ private final static List<VariableGenerator> variables = new ArrayList<>();
+
+ private final String prefix;
+ private int cpt = 0;
+
+ private VariableGenerator(String prefix) {
+ this.prefix = prefix;
+ }
+
+ public static VariableGenerator get(String prefix) {
+ if (prefix == null || prefix.isEmpty())
+ throw new IllegalArgumentException("Prefix should not be null or empty");
+
+ for (VariableGenerator variable : variables)
+ if (variable.getPrefix().equals(prefix))
+ return variable;
+ VariableGenerator var = new VariableGenerator(prefix);
+ variables.add(var);
+ return var;
+ }
+
+ public String getPrefix() {
+ return prefix;
+ }
+
+ public String newVariable() {
+ cpt++;
+ return curVariable();
+ }
+
+ public String curVariable() {
+ return prefix + cpt;
+ }
+
+}
diff --git a/ui/org.eclipse.sensinact.studio.view.visualizer/META-INF/MANIFEST.MF b/ui/org.eclipse.sensinact.studio.view.visualizer/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..14fe8eb
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.view.visualizer/META-INF/MANIFEST.MF
@@ -0,0 +1,20 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Visualizer View
+Bundle-SymbolicName: org.eclipse.sensinact.studio.view.visualizer;singleton:=true
+Bundle-Version: 1.0.0.qualifier
+Bundle-Activator: org.eclipse.sensinact.studio.view.visualizer.Activator
+Bundle-Vendor: CEA-LETI
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.nebula.visualization.xygraph,
+ org.eclipse.draw2d,
+ org.eclipse.sensinact.studio.model.resource,
+ org.json,
+ org.eclipse.sensinact.studio.model.manager,
+ org.eclipse.sensinact.studio.http,
+ org.apache.log4j
+Bundle-RequiredExecutionEnvironment: JavaSE-1.7
+Bundle-ActivationPolicy: lazy
+Export-Package: org.eclipse.sensinact.studio.view.visualizer
+Import-Package: org.apache.log4j
diff --git a/ui/org.eclipse.sensinact.studio.view.visualizer/about.html b/ui/org.eclipse.sensinact.studio.view.visualizer/about.html
new file mode 100644
index 0000000..3b39f88
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.view.visualizer/about.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"><head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 5, 2006</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+
+</body></html>
\ No newline at end of file
diff --git a/ui/org.eclipse.sensinact.studio.view.visualizer/build.properties b/ui/org.eclipse.sensinact.studio.view.visualizer/build.properties
new file mode 100644
index 0000000..1d5ab1a
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.view.visualizer/build.properties
@@ -0,0 +1,19 @@
+#
+# Copyright (c) 2017 CEA.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+# CEA - initial API and implementation and/or initial documentation
+#
+
+source.. = src/
+bin.includes = plugin.xml,\
+ .,\
+ .project,\
+ .classpath,\
+ build.properties,\
+ META-INF/,\
+ .settings/
diff --git a/ui/org.eclipse.sensinact.studio.view.visualizer/plugin.xml b/ui/org.eclipse.sensinact.studio.view.visualizer/plugin.xml
new file mode 100644
index 0000000..c2eb615
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.view.visualizer/plugin.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Copyright (c) 2017 CEA.
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+
+ Contributors:
+ CEA - initial API and implementation and/or initial documentation
+
+-->
+<?eclipse version="3.4"?>
+<plugin>
+ <extension
+ point="org.eclipse.ui.views">
+ <e4view
+ category="org.eclipse.sensinact.studio.views.category"
+ class="org.eclipse.sensinact.studio.view.visualizer.VisualizerView"
+ id="org.eclipse.sensinact.studio.view.visualizer.view"
+ name="Visualizer"
+ restorable="true">
+ </e4view>
+ </extension>
+
+</plugin>
diff --git a/ui/org.eclipse.sensinact.studio.view.visualizer/src/org/eclipse/sensinact/studio/view/visualizer/Activator.java b/ui/org.eclipse.sensinact.studio.view.visualizer/src/org/eclipse/sensinact/studio/view/visualizer/Activator.java
new file mode 100644
index 0000000..33a68a9
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.view.visualizer/src/org/eclipse/sensinact/studio/view/visualizer/Activator.java
@@ -0,0 +1,60 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.view.visualizer;
+
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class Activator extends AbstractUIPlugin {
+
+ // The plug-in ID
+ public static final String PLUGIN_ID = "org.eclipse.sensinact.studio.view.visualizer"; //$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)
+ */
+ 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)
+ */
+ 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;
+ }
+
+}
diff --git a/ui/org.eclipse.sensinact.studio.view.visualizer/src/org/eclipse/sensinact/studio/view/visualizer/VisualizerDropListener.java b/ui/org.eclipse.sensinact.studio.view.visualizer/src/org/eclipse/sensinact/studio/view/visualizer/VisualizerDropListener.java
new file mode 100644
index 0000000..4f8c40b
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.view.visualizer/src/org/eclipse/sensinact/studio/view/visualizer/VisualizerDropListener.java
@@ -0,0 +1,83 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.view.visualizer;
+
+import org.apache.log4j.Logger;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.sensinact.studio.model.manager.modelupdater.ModelEditor;
+import org.eclipse.sensinact.studio.model.resource.utils.ResourceDescriptor;
+import org.eclipse.swt.dnd.DropTarget;
+import org.eclipse.swt.dnd.DropTargetEvent;
+import org.eclipse.swt.dnd.DropTargetListener;
+import org.eclipse.swt.dnd.TextTransfer;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class VisualizerDropListener implements DropTargetListener {
+
+ private final VisualizerView visualizerView;
+
+ private static final Logger logger = Logger.getLogger(VisualizerDropListener.class);
+
+ public VisualizerDropListener(VisualizerView visualizerView) {
+ this.visualizerView = visualizerView;
+ }
+
+ @Override
+ public void dragEnter(DropTargetEvent event) {
+ }
+
+ @Override
+ public void dragLeave(DropTargetEvent event) {
+ }
+
+ @Override
+ public void dragOperationChanged(DropTargetEvent event) {
+ }
+
+ @Override
+ public void dragOver(DropTargetEvent event) {
+ }
+
+ @Override
+ public void drop(DropTargetEvent event) {
+ try {
+ if (TextTransfer.getInstance().isSupportedType(event.currentDataType)) {
+ if (event.widget instanceof DropTarget) {
+
+ ResourceDescriptor rDescriptor = null;
+ try {
+ rDescriptor = new ResourceDescriptor((String) event.data);
+ } catch (Exception e) {
+ throw new Exception("Only resources can be displayed in the visualizer");
+ }
+
+ String typeName = ModelEditor.getInstance().getResourceClass(rDescriptor).getName();
+
+ VisualizerSettings visuSettings = new VisualizerSettings(rDescriptor, typeName);
+ visualizerView.dropValidated(visuSettings);
+ }
+ }
+ } catch (Exception e) {
+ Shell shell = Display.getCurrent().getActiveShell();
+ String msg = e.getMessage();
+ logger.error("Drop error: " + msg);
+ MessageDialog.openError(shell, "Error", msg);
+ }
+ }
+
+ @Override
+ public void dropAccept(DropTargetEvent event) {
+ }
+}
diff --git a/ui/org.eclipse.sensinact.studio.view.visualizer/src/org/eclipse/sensinact/studio/view/visualizer/VisualizerSettings.java b/ui/org.eclipse.sensinact.studio.view.visualizer/src/org/eclipse/sensinact/studio/view/visualizer/VisualizerSettings.java
new file mode 100644
index 0000000..6e0268c
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.view.visualizer/src/org/eclipse/sensinact/studio/view/visualizer/VisualizerSettings.java
@@ -0,0 +1,35 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.view.visualizer;
+
+import org.eclipse.sensinact.studio.model.resource.utils.ResourceDescriptor;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class VisualizerSettings {
+
+ private final ResourceDescriptor rDescriptor;
+ private final String typeName;
+
+ public VisualizerSettings(ResourceDescriptor rDescriptor, String typeName) {
+ this.rDescriptor = rDescriptor;
+ this.typeName = typeName;
+ }
+
+ public ResourceDescriptor getDescriptor() {
+ return rDescriptor;
+ }
+
+ public String getTypeName() {
+ return typeName;
+ }
+}
diff --git a/ui/org.eclipse.sensinact.studio.view.visualizer/src/org/eclipse/sensinact/studio/view/visualizer/VisualizerView.java b/ui/org.eclipse.sensinact.studio.view.visualizer/src/org/eclipse/sensinact/studio/view/visualizer/VisualizerView.java
new file mode 100644
index 0000000..d1daf2c
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.view.visualizer/src/org/eclipse/sensinact/studio/view/visualizer/VisualizerView.java
@@ -0,0 +1,225 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.view.visualizer;
+
+import java.io.IOException;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
+
+import org.apache.log4j.Logger;
+import org.eclipse.draw2d.LightweightSystem;
+import org.eclipse.nebula.visualization.xygraph.figures.XYGraph;
+import org.eclipse.sensinact.studio.http.client.snamessage.SnaMessage;
+import org.eclipse.sensinact.studio.http.client.snamessage.UpdateAttribute;
+import org.eclipse.sensinact.studio.model.manager.listener.subscription.SubscriptionListener;
+import org.eclipse.sensinact.studio.model.manager.listener.subscription.SubscriptionManager;
+import org.eclipse.sensinact.studio.model.resource.utils.ResourceDescriptor;
+import org.eclipse.sensinact.studio.view.visualizer.graphmanager.GraphManager;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.DropTarget;
+import org.eclipse.swt.dnd.TextTransfer;
+import org.eclipse.swt.dnd.Transfer;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Canvas;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class VisualizerView implements SubscriptionListener {
+
+ private static final Logger logger = Logger.getLogger(VisualizerView.class);
+
+ public static final String VIEW_ID = "org.eclipse.sensinact.studio.view.visualizer.view";
+
+ private Label titleLabel = null;
+ private Composite contentComposite = null;
+ private Button btn = null;
+ private Label msgLabel = null;
+ private XYGraph xyGraph = null;
+ private GraphManager graphUpdater = null;
+
+ private VisualizerSettings visuSettings = null;
+
+ private final String DEFAULT_TITLE = "";
+ private final String DEFAULT_MESSAGE = "Drag and drop a resource here !";
+ private final String DEFAULT_BTN_TEXT = "Listener not activated";
+
+ @PostConstruct
+ public void createControls(Composite parent) {
+ parent.setLayout(new GridLayout(1, true));
+
+ // Label
+ GridData labelGridData = new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1);
+ titleLabel = new Label(parent, SWT.CENTER);
+ titleLabel.setLayoutData(labelGridData);
+
+ // Composite : place holder for visualizer
+ GridData comositeGridData = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1);
+ contentComposite = new Composite(parent, SWT.NONE);
+ contentComposite.setLayoutData(comositeGridData);
+ contentComposite.setLayout(new GridLayout(1, true));
+
+ // Message Label = to be updated -->
+ GridData msgGridData = new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1);
+ msgLabel = new Label(contentComposite, SWT.WRAP);
+ msgLabel.setLayoutData(msgGridData);
+
+ // LightweightSystem creates the bridge between SWT and draw2D
+ GridData canevasData = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1);
+ Canvas canvas = new Canvas(contentComposite, SWT.NONE);
+ canvas.setLayoutData(canevasData);
+ final LightweightSystem lws = new LightweightSystem(canvas);
+
+ // create a new XY Graph.
+ xyGraph = new XYGraph();
+ lws.setContents(xyGraph);
+ graphUpdater = new GraphManager(xyGraph);
+
+ // Button
+ GridData btnGridData = new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1);
+ btn = new Button(parent, SWT.CENTER);
+ btn.setLayoutData(btnGridData);
+ btn.addMouseListener(new BtnListener());
+
+ // DND
+ int operations = DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_DEFAULT;
+ Transfer[] transferTypes = new Transfer[] { TextTransfer.getInstance() };
+ DropTarget target = new DropTarget(parent, operations);
+ target.setTransfer(transferTypes);
+ target.addDropListener(new VisualizerDropListener(this));
+
+ // set labels
+ resetUI();
+ }
+
+ @PreDestroy
+ public void dispose() {
+ }
+
+ void dropValidated(VisualizerSettings newSettings) throws IOException {
+
+ // unsubscribe
+ try {
+ if (visuSettings != null) {
+ unsubscribe(false);
+ }
+ } catch (IOException e) {
+ logger.error("unsubscribe failed", e);
+ }
+
+ // subscribe
+ subscribe(newSettings, true);
+ }
+
+ private void subscribe(VisualizerSettings newSettings, boolean updateUI) throws IOException {
+ ResourceDescriptor resource = newSettings.getDescriptor();
+
+ //Tries to subscribe via call back, if does not work does not matter, the websocket should take place.
+ try {
+ SubscriptionManager.getInstance().subscribeResource(resource, this);
+ }catch(IOException e){
+ logger.error("Callback subscription failed", e);
+ }
+ this.visuSettings = newSettings;
+
+ if (updateUI) {
+ graphUpdater.stop();
+ titleLabel.setText(resource.toString());
+ msgLabel.setText("Waiting for notification...");
+ btn.setText("Stop listener");
+ btn.setEnabled(true);
+ }
+ }
+
+ private void unsubscribe(boolean updateUI) throws IOException {
+ SubscriptionManager.getInstance().unsubscribeResource(visuSettings.getDescriptor(), this);
+ visuSettings = null;
+
+ if (updateUI) {
+ graphUpdater.stop();
+ resetUI();
+ }
+ }
+
+ @Override
+ public void onEvent(final SnaMessage response, final ResourceDescriptor resource)
+ {
+ final String msg = response.getFullDescription();
+ logger.debug("VisualizerView::resourceUpdated" + msg);
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run()
+ {
+ msgLabel.setText(response.getFullDescription());
+
+ if (response instanceof UpdateAttribute) {
+ UpdateAttribute update = (UpdateAttribute) response;
+ String type = update.getType();
+
+ if (type.equals("int")) {
+ int value = Integer.parseInt(update.getValue());
+ updateGraph(resource, value);
+ } else if (type.equals("float")) {
+ float value = Float.parseFloat(update.getValue());
+ updateGraph(resource, value);
+ } else if (type.equals("double")) {
+ double value = Double.parseDouble(update.getValue());
+ updateGraph(resource, value);
+ }else {
+ System.out.println(this.getClass().getCanonicalName()+": Type "+type+" cannot produce chart");
+ }
+ }
+ }
+ });
+ }
+
+ private void updateGraph(ResourceDescriptor resource, double value) {
+ graphUpdater.start(resource);
+ graphUpdater.setValue(value);
+ }
+
+ private void resetUI() {
+ titleLabel.setText(DEFAULT_TITLE);
+ msgLabel.setText(DEFAULT_MESSAGE);
+ btn.setText(DEFAULT_BTN_TEXT);
+ btn.setEnabled(false);
+ }
+
+ private class BtnListener implements MouseListener {
+
+ private final Logger logger = Logger.getLogger(BtnListener.class);
+
+ @Override
+ public void mouseDoubleClick(MouseEvent e) {
+ }
+
+ @Override
+ public void mouseDown(MouseEvent e) {
+ }
+
+ @Override
+ public void mouseUp(MouseEvent e) {
+ try {
+ unsubscribe(true);
+ } catch (IOException e1) {
+ logger.error("Unsubscribe failed", e1);
+ }
+ }
+ }
+}
diff --git a/ui/org.eclipse.sensinact.studio.view.visualizer/src/org/eclipse/sensinact/studio/view/visualizer/graphmanager/GraphManager.java b/ui/org.eclipse.sensinact.studio.view.visualizer/src/org/eclipse/sensinact/studio/view/visualizer/graphmanager/GraphManager.java
new file mode 100644
index 0000000..940d23a
--- /dev/null
+++ b/ui/org.eclipse.sensinact.studio.view.visualizer/src/org/eclipse/sensinact/studio/view/visualizer/graphmanager/GraphManager.java
@@ -0,0 +1,107 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.view.visualizer.graphmanager;
+
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import org.eclipse.nebula.visualization.xygraph.dataprovider.CircularBufferDataProvider;
+import org.eclipse.nebula.visualization.xygraph.figures.Trace;
+import org.eclipse.nebula.visualization.xygraph.figures.Trace.PointStyle;
+import org.eclipse.sensinact.studio.model.resource.utils.ResourceDescriptor;
+import org.eclipse.nebula.visualization.xygraph.figures.XYGraph;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class GraphManager {
+
+ private final XYGraph graph;
+ private final AtomicBoolean isRuning;
+ private double value;
+ private final CircularBufferDataProvider traceDataProvider;
+ private final Trace trace;
+
+ private final double Y_MIN_INIT = 0;
+ private final double Y_MAX_INIT = 1;
+ private double yMin = Y_MIN_INIT;
+ private double yMax = Y_MAX_INIT;
+
+ private final int TIMER_PERIOD_MS = 250;
+ private final int NUMBER_OF_VALUES = 100;
+
+ public GraphManager(XYGraph graph) {
+ this.graph = graph;
+ this.isRuning = new AtomicBoolean(false);
+
+ graph.setTitle("");
+ graph.primaryXAxis.setTitle("Time");
+ graph.primaryXAxis.setDateEnabled(true);
+ graph.primaryXAxis.setFormatPattern("HH:mm:ss");
+
+
+ graph.primaryYAxis.setTitle("value");
+ graph.primaryYAxis.setAutoScale(false);
+ graph.primaryXAxis.setAutoScale(true);
+
+ traceDataProvider = new CircularBufferDataProvider(true);
+ traceDataProvider.setBufferSize(NUMBER_OF_VALUES);
+
+ trace = new Trace("values", graph.primaryXAxis, graph.primaryYAxis, traceDataProvider);
+ trace.setPointStyle(PointStyle.POINT);
+ graph.addTrace(trace);
+ graph.setShowLegend(false);
+ }
+
+ public void start(ResourceDescriptor rDescriptor) {
+ if (!isRuning.getAndSet(true)) {
+ traceDataProvider.clearTrace();
+
+ graph.setTitle(rDescriptor.getDevice() + "/" + rDescriptor.getService() + "/" + rDescriptor.getResource());
+ yMin = Y_MIN_INIT;
+ yMax = Y_MAX_INIT;
+ trace.getYAxis().setRange(Y_MIN_INIT,Y_MAX_INIT);
+
+ Runnable updater = new Runnable() {
+ public void run() {
+ double curVal = value; // local copy
+ traceDataProvider.setCurrentYData(curVal, System.currentTimeMillis());
+
+ if (yMin > curVal) {
+ yMin = curVal;
+ trace.getYAxis().setRange(yMin, yMax);
+ } else if (yMax < curVal) {
+ yMax = curVal;
+ trace.getYAxis().setRange(yMin, yMax);
+ }
+
+ if (isRuning.get()) {
+ Display.getDefault().timerExec(TIMER_PERIOD_MS, this);
+ }
+ }
+ };
+
+ Display.getDefault().timerExec(0, updater);
+ }
+ }
+
+ public void stop() {
+ isRuning.set(false);
+ }
+
+ public void setValue(double newValue) {
+ value = newValue;
+ }
+
+ boolean isRunning() {
+ return isRuning.get();
+ }
+}
diff --git a/webapp/org.eclipse.sensinact.studio.webapp.indoor/META-INF/MANIFEST.MF b/webapp/org.eclipse.sensinact.studio.webapp.indoor/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..0275145
--- /dev/null
+++ b/webapp/org.eclipse.sensinact.studio.webapp.indoor/META-INF/MANIFEST.MF
@@ -0,0 +1,16 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Indoor WebApp
+Bundle-SymbolicName: org.eclipse.sensinact.studio.webapp.indoor;singleton:=true
+Bundle-Version: 1.0.0.qualifier
+Bundle-Activator: org.eclipse.sensinact.studio.webapp.indoor.Activator
+Bundle-Vendor: CEA-LETI
+Require-Bundle: org.eclipse.core.runtime,
+ org.restlet,
+ org.eclipse.sensinact.studio.http,
+ org.eclipse.ui.workbench,
+ org.apache.log4j
+Bundle-RequiredExecutionEnvironment: JavaSE-1.7
+Bundle-ActivationPolicy: lazy
+Export-Package: org.eclipse.sensinact.studio.webapp.indoor
+Import-Package: org.apache.log4j
diff --git a/webapp/org.eclipse.sensinact.studio.webapp.indoor/about.html b/webapp/org.eclipse.sensinact.studio.webapp.indoor/about.html
new file mode 100644
index 0000000..3b39f88
--- /dev/null
+++ b/webapp/org.eclipse.sensinact.studio.webapp.indoor/about.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"><head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 5, 2006</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+
+</body></html>
\ No newline at end of file
diff --git a/webapp/org.eclipse.sensinact.studio.webapp.indoor/build.properties b/webapp/org.eclipse.sensinact.studio.webapp.indoor/build.properties
new file mode 100644
index 0000000..c5b3bf8
--- /dev/null
+++ b/webapp/org.eclipse.sensinact.studio.webapp.indoor/build.properties
@@ -0,0 +1,20 @@
+#
+# Copyright (c) 2017 CEA.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+# CEA - initial API and implementation and/or initial documentation
+#
+
+source.. = src/
+bin.includes = .,\
+ .project,\
+ webapp/,\
+ .classpath,\
+ build.properties,\
+ META-INF/,\
+ .settings/,\
+ plugin.xml
diff --git a/webapp/org.eclipse.sensinact.studio.webapp.indoor/plugin.xml b/webapp/org.eclipse.sensinact.studio.webapp.indoor/plugin.xml
new file mode 100644
index 0000000..1dc847d
--- /dev/null
+++ b/webapp/org.eclipse.sensinact.studio.webapp.indoor/plugin.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Copyright (c) 2017 CEA.
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+
+ Contributors:
+ CEA - initial API and implementation and/or initial documentation
+
+-->
+<?eclipse version="3.4"?>
+<plugin>
+ <extension
+ point="org.eclipse.ui.startup">
+ <startup
+ class="org.eclipse.sensinact.studio.webapp.indoor.Startup">
+ </startup>
+ </extension>
+
+</plugin>
diff --git a/webapp/org.eclipse.sensinact.studio.webapp.indoor/src/org/eclipse/sensinact/studio/webapp/indoor/Activator.java b/webapp/org.eclipse.sensinact.studio.webapp.indoor/src/org/eclipse/sensinact/studio/webapp/indoor/Activator.java
new file mode 100644
index 0000000..ba0a822
--- /dev/null
+++ b/webapp/org.eclipse.sensinact.studio.webapp.indoor/src/org/eclipse/sensinact/studio/webapp/indoor/Activator.java
@@ -0,0 +1,49 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.webapp.indoor;
+
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class Activator implements BundleActivator {
+
+ // The plug-in ID
+ public static final String PLUGIN_ID = "org.eclipse.sensinact.studio.webapp.indoor"; //$NON-NLS-1$
+
+ // The shared instance
+ private static Activator plugin;
+
+ /**
+ * The constructor
+ */
+ public Activator() {
+ }
+
+ public void start(BundleContext context) throws Exception {
+ plugin = this;
+ }
+
+ public void stop(BundleContext context) throws Exception {
+ plugin = null;
+ }
+
+ /**
+ * Returns the shared instance
+ *
+ * @return the shared instance
+ */
+ public static Activator getDefault() {
+ return plugin;
+ }
+}
diff --git a/webapp/org.eclipse.sensinact.studio.webapp.indoor/src/org/eclipse/sensinact/studio/webapp/indoor/Startup.java b/webapp/org.eclipse.sensinact.studio.webapp.indoor/src/org/eclipse/sensinact/studio/webapp/indoor/Startup.java
new file mode 100644
index 0000000..eb397d2
--- /dev/null
+++ b/webapp/org.eclipse.sensinact.studio.webapp.indoor/src/org/eclipse/sensinact/studio/webapp/indoor/Startup.java
@@ -0,0 +1,26 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.webapp.indoor;
+
+import org.eclipse.sensinact.studio.http.server.RouteUtil;
+import org.eclipse.sensinact.studio.webapp.indoor.content.IndoorApplication;
+import org.eclipse.ui.IStartup;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class Startup implements IStartup {
+
+ @Override
+ public void earlyStartup() {
+ RouteUtil.attachRoute("/webapp/indoor", new IndoorApplication());
+ }
+}
diff --git a/webapp/org.eclipse.sensinact.studio.webapp.indoor/src/org/eclipse/sensinact/studio/webapp/indoor/content/IndoorApplication.java b/webapp/org.eclipse.sensinact.studio.webapp.indoor/src/org/eclipse/sensinact/studio/webapp/indoor/content/IndoorApplication.java
new file mode 100644
index 0000000..d34602f
--- /dev/null
+++ b/webapp/org.eclipse.sensinact.studio.webapp.indoor/src/org/eclipse/sensinact/studio/webapp/indoor/content/IndoorApplication.java
@@ -0,0 +1,28 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.webapp.indoor.content;
+
+import org.restlet.Application;
+import org.restlet.Restlet;
+import org.restlet.data.Reference;
+import org.restlet.resource.Directory;
+
+/**
+ * @author Nicolas Hili
+ * @since Nov 19, 2014
+ */
+public class IndoorApplication extends Application {
+ @Override
+ public Restlet createInboundRoot() {
+ Directory dir = new Directory(getContext(), new Reference(getClass().getClassLoader().getResource("/webapp")));
+ return dir;
+ }
+}
\ No newline at end of file
diff --git a/webapp/org.eclipse.sensinact.studio.webapp.indoor/webapp/WEB-INF/web.xml b/webapp/org.eclipse.sensinact.studio.webapp.indoor/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000..01f6f06
--- /dev/null
+++ b/webapp/org.eclipse.sensinact.studio.webapp.indoor/webapp/WEB-INF/web.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Copyright (c) 2017 CEA.
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+
+ Contributors:
+ CEA - initial API and implementation and/or initial documentation
+
+-->
+<web-app>
+ <welcome-file-list>
+ <welcome-file>outdoor.html</welcome-file>
+ </welcome-file-list>
+</web-app>
\ No newline at end of file
diff --git a/webapp/org.eclipse.sensinact.studio.webapp.indoor/webapp/css/custom.css b/webapp/org.eclipse.sensinact.studio.webapp.indoor/webapp/css/custom.css
new file mode 100644
index 0000000..1fc505c
--- /dev/null
+++ b/webapp/org.eclipse.sensinact.studio.webapp.indoor/webapp/css/custom.css
@@ -0,0 +1,15 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+html, body, #map {
+ height:100%;
+ margin:0px;
+ padding:0px;
+}
diff --git a/webapp/org.eclipse.sensinact.studio.webapp.indoor/webapp/css/leaflet.css b/webapp/org.eclipse.sensinact.studio.webapp.indoor/webapp/css/leaflet.css
new file mode 100644
index 0000000..c161c31
--- /dev/null
+++ b/webapp/org.eclipse.sensinact.studio.webapp.indoor/webapp/css/leaflet.css
@@ -0,0 +1,479 @@
+/* required styles */
+
+.leaflet-map-pane,
+.leaflet-tile,
+.leaflet-marker-icon,
+.leaflet-marker-shadow,
+.leaflet-tile-pane,
+.leaflet-tile-container,
+.leaflet-overlay-pane,
+.leaflet-shadow-pane,
+.leaflet-marker-pane,
+.leaflet-popup-pane,
+.leaflet-overlay-pane svg,
+.leaflet-zoom-box,
+.leaflet-image-layer,
+.leaflet-layer {
+ position: absolute;
+ left: 0;
+ top: 0;
+ }
+.leaflet-container {
+ overflow: hidden;
+ -ms-touch-action: none;
+ touch-action: none;
+ }
+.leaflet-tile,
+.leaflet-marker-icon,
+.leaflet-marker-shadow {
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ user-select: none;
+ -webkit-user-drag: none;
+ }
+.leaflet-marker-icon,
+.leaflet-marker-shadow {
+ display: block;
+ }
+/* map is broken in FF if you have max-width: 100% on tiles */
+.leaflet-container img {
+ max-width: none !important;
+ }
+/* stupid Android 2 doesn't understand "max-width: none" properly */
+.leaflet-container img.leaflet-image-layer {
+ max-width: 15000px !important;
+ }
+.leaflet-tile {
+ filter: inherit;
+ visibility: hidden;
+ }
+.leaflet-tile-loaded {
+ visibility: inherit;
+ }
+.leaflet-zoom-box {
+ width: 0;
+ height: 0;
+ }
+/* workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=888319 */
+.leaflet-overlay-pane svg {
+ -moz-user-select: none;
+ }
+
+.leaflet-tile-pane { z-index: 2; }
+.leaflet-objects-pane { z-index: 3; }
+.leaflet-overlay-pane { z-index: 4; }
+.leaflet-shadow-pane { z-index: 5; }
+.leaflet-marker-pane { z-index: 6; }
+.leaflet-popup-pane { z-index: 7; }
+
+.leaflet-vml-shape {
+ width: 1px;
+ height: 1px;
+ }
+.lvml {
+ behavior: url(#default#VML);
+ display: inline-block;
+ position: absolute;
+ }
+
+
+/* control positioning */
+
+.leaflet-control {
+ position: relative;
+ z-index: 7;
+ pointer-events: auto;
+ }
+.leaflet-top,
+.leaflet-bottom {
+ position: absolute;
+ z-index: 1000;
+ pointer-events: none;
+ }
+.leaflet-top {
+ top: 0;
+ }
+.leaflet-right {
+ right: 0;
+ }
+.leaflet-bottom {
+ bottom: 0;
+ }
+.leaflet-left {
+ left: 0;
+ }
+.leaflet-control {
+ float: left;
+ clear: both;
+ }
+.leaflet-right .leaflet-control {
+ float: right;
+ }
+.leaflet-top .leaflet-control {
+ margin-top: 10px;
+ }
+.leaflet-bottom .leaflet-control {
+ margin-bottom: 10px;
+ }
+.leaflet-left .leaflet-control {
+ margin-left: 10px;
+ }
+.leaflet-right .leaflet-control {
+ margin-right: 10px;
+ }
+
+
+/* zoom and fade animations */
+
+.leaflet-fade-anim .leaflet-tile,
+.leaflet-fade-anim .leaflet-popup {
+ opacity: 0;
+ -webkit-transition: opacity 0.2s linear;
+ -moz-transition: opacity 0.2s linear;
+ -o-transition: opacity 0.2s linear;
+ transition: opacity 0.2s linear;
+ }
+.leaflet-fade-anim .leaflet-tile-loaded,
+.leaflet-fade-anim .leaflet-map-pane .leaflet-popup {
+ opacity: 1;
+ }
+
+.leaflet-zoom-anim .leaflet-zoom-animated {
+ -webkit-transition: -webkit-transform 0.25s cubic-bezier(0,0,0.25,1);
+ -moz-transition: -moz-transform 0.25s cubic-bezier(0,0,0.25,1);
+ -o-transition: -o-transform 0.25s cubic-bezier(0,0,0.25,1);
+ transition: transform 0.25s cubic-bezier(0,0,0.25,1);
+ }
+.leaflet-zoom-anim .leaflet-tile,
+.leaflet-pan-anim .leaflet-tile,
+.leaflet-touching .leaflet-zoom-animated {
+ -webkit-transition: none;
+ -moz-transition: none;
+ -o-transition: none;
+ transition: none;
+ }
+
+.leaflet-zoom-anim .leaflet-zoom-hide {
+ visibility: hidden;
+ }
+
+
+/* cursors */
+
+.leaflet-clickable {
+ cursor: pointer;
+ }
+.leaflet-container {
+ cursor: -webkit-grab;
+ cursor: -moz-grab;
+ }
+.leaflet-popup-pane,
+.leaflet-control {
+ cursor: auto;
+ }
+.leaflet-dragging .leaflet-container,
+.leaflet-dragging .leaflet-clickable {
+ cursor: move;
+ cursor: -webkit-grabbing;
+ cursor: -moz-grabbing;
+ }
+
+
+/* visual tweaks */
+
+.leaflet-container {
+ background: #ddd;
+ outline: 0;
+ }
+.leaflet-container a {
+ color: #0078A8;
+ }
+.leaflet-container a.leaflet-active {
+ outline: 2px solid orange;
+ }
+.leaflet-zoom-box {
+ border: 2px dotted #38f;
+ background: rgba(255,255,255,0.5);
+ }
+
+
+/* general typography */
+.leaflet-container {
+ font: 12px/1.5 "Helvetica Neue", Arial, Helvetica, sans-serif;
+ }
+
+
+/* general toolbar styles */
+
+.leaflet-bar {
+ box-shadow: 0 1px 5px rgba(0,0,0,0.65);
+ border-radius: 4px;
+ }
+.leaflet-bar a,
+.leaflet-bar a:hover {
+ background-color: #fff;
+ border-bottom: 1px solid #ccc;
+ width: 26px;
+ height: 26px;
+ line-height: 26px;
+ display: block;
+ text-align: center;
+ text-decoration: none;
+ color: black;
+ }
+.leaflet-bar a,
+.leaflet-control-layers-toggle {
+ background-position: 50% 50%;
+ background-repeat: no-repeat;
+ display: block;
+ }
+.leaflet-bar a:hover {
+ background-color: #f4f4f4;
+ }
+.leaflet-bar a:first-child {
+ border-top-left-radius: 4px;
+ border-top-right-radius: 4px;
+ }
+.leaflet-bar a:last-child {
+ border-bottom-left-radius: 4px;
+ border-bottom-right-radius: 4px;
+ border-bottom: none;
+ }
+.leaflet-bar a.leaflet-disabled {
+ cursor: default;
+ background-color: #f4f4f4;
+ color: #bbb;
+ }
+
+.leaflet-touch .leaflet-bar a {
+ width: 30px;
+ height: 30px;
+ line-height: 30px;
+ }
+
+
+/* zoom control */
+
+.leaflet-control-zoom-in,
+.leaflet-control-zoom-out {
+ font: bold 18px 'Lucida Console', Monaco, monospace;
+ text-indent: 1px;
+ }
+.leaflet-control-zoom-out {
+ font-size: 20px;
+ }
+
+.leaflet-touch .leaflet-control-zoom-in {
+ font-size: 22px;
+ }
+.leaflet-touch .leaflet-control-zoom-out {
+ font-size: 24px;
+ }
+
+
+/* layers control */
+
+.leaflet-control-layers {
+ box-shadow: 0 1px 5px rgba(0,0,0,0.4);
+ background: #fff;
+ border-radius: 5px;
+ }
+.leaflet-control-layers-toggle {
+ background-image: url(images/layers.png);
+ width: 36px;
+ height: 36px;
+ }
+.leaflet-retina .leaflet-control-layers-toggle {
+ background-image: url(images/layers-2x.png);
+ background-size: 26px 26px;
+ }
+.leaflet-touch .leaflet-control-layers-toggle {
+ width: 44px;
+ height: 44px;
+ }
+.leaflet-control-layers .leaflet-control-layers-list,
+.leaflet-control-layers-expanded .leaflet-control-layers-toggle {
+ display: none;
+ }
+.leaflet-control-layers-expanded .leaflet-control-layers-list {
+ display: block;
+ position: relative;
+ }
+.leaflet-control-layers-expanded {
+ padding: 6px 10px 6px 6px;
+ color: #333;
+ background: #fff;
+ }
+.leaflet-control-layers-selector {
+ margin-top: 2px;
+ position: relative;
+ top: 1px;
+ }
+.leaflet-control-layers label {
+ display: block;
+ }
+.leaflet-control-layers-separator {
+ height: 0;
+ border-top: 1px solid #ddd;
+ margin: 5px -10px 5px -6px;
+ }
+
+
+/* attribution and scale controls */
+
+.leaflet-container .leaflet-control-attribution {
+ background: #fff;
+ background: rgba(255, 255, 255, 0.7);
+ margin: 0;
+ }
+.leaflet-control-attribution,
+.leaflet-control-scale-line {
+ padding: 0 5px;
+ color: #333;
+ }
+.leaflet-control-attribution a {
+ text-decoration: none;
+ }
+.leaflet-control-attribution a:hover {
+ text-decoration: underline;
+ }
+.leaflet-container .leaflet-control-attribution,
+.leaflet-container .leaflet-control-scale {
+ font-size: 11px;
+ }
+.leaflet-left .leaflet-control-scale {
+ margin-left: 5px;
+ }
+.leaflet-bottom .leaflet-control-scale {
+ margin-bottom: 5px;
+ }
+.leaflet-control-scale-line {
+ border: 2px solid #777;
+ border-top: none;
+ line-height: 1.1;
+ padding: 2px 5px 1px;
+ font-size: 11px;
+ white-space: nowrap;
+ overflow: hidden;
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+
+ background: #fff;
+ background: rgba(255, 255, 255, 0.5);
+ }
+.leaflet-control-scale-line:not(:first-child) {
+ border-top: 2px solid #777;
+ border-bottom: none;
+ margin-top: -2px;
+ }
+.leaflet-control-scale-line:not(:first-child):not(:last-child) {
+ border-bottom: 2px solid #777;
+ }
+
+.leaflet-touch .leaflet-control-attribution,
+.leaflet-touch .leaflet-control-layers,
+.leaflet-touch .leaflet-bar {
+ box-shadow: none;
+ }
+.leaflet-touch .leaflet-control-layers,
+.leaflet-touch .leaflet-bar {
+ border: 2px solid rgba(0,0,0,0.2);
+ background-clip: padding-box;
+ }
+
+
+/* popup */
+
+.leaflet-popup {
+ position: absolute;
+ text-align: center;
+ }
+.leaflet-popup-content-wrapper {
+ padding: 1px;
+ text-align: left;
+ border-radius: 12px;
+ }
+.leaflet-popup-content {
+ margin: 13px 19px;
+ line-height: 1.4;
+ }
+.leaflet-popup-content p {
+ margin: 18px 0;
+ }
+.leaflet-popup-tip-container {
+ margin: 0 auto;
+ width: 40px;
+ height: 20px;
+ position: relative;
+ overflow: hidden;
+ }
+.leaflet-popup-tip {
+ width: 17px;
+ height: 17px;
+ padding: 1px;
+
+ margin: -10px auto 0;
+
+ -webkit-transform: rotate(45deg);
+ -moz-transform: rotate(45deg);
+ -ms-transform: rotate(45deg);
+ -o-transform: rotate(45deg);
+ transform: rotate(45deg);
+ }
+.leaflet-popup-content-wrapper,
+.leaflet-popup-tip {
+ background: white;
+
+ box-shadow: 0 3px 14px rgba(0,0,0,0.4);
+ }
+.leaflet-container a.leaflet-popup-close-button {
+ position: absolute;
+ top: 0;
+ right: 0;
+ padding: 4px 4px 0 0;
+ text-align: center;
+ width: 18px;
+ height: 14px;
+ font: 16px/14px Tahoma, Verdana, sans-serif;
+ color: #c3c3c3;
+ text-decoration: none;
+ font-weight: bold;
+ background: transparent;
+ }
+.leaflet-container a.leaflet-popup-close-button:hover {
+ color: #999;
+ }
+.leaflet-popup-scrolled {
+ overflow: auto;
+ border-bottom: 1px solid #ddd;
+ border-top: 1px solid #ddd;
+ }
+
+.leaflet-oldie .leaflet-popup-content-wrapper {
+ zoom: 1;
+ }
+.leaflet-oldie .leaflet-popup-tip {
+ width: 24px;
+ margin: 0 auto;
+
+ -ms-filter: "progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)";
+ filter: progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678);
+ }
+.leaflet-oldie .leaflet-popup-tip-container {
+ margin-top: -1px;
+ }
+
+.leaflet-oldie .leaflet-control-zoom,
+.leaflet-oldie .leaflet-control-layers,
+.leaflet-oldie .leaflet-popup-content-wrapper,
+.leaflet-oldie .leaflet-popup-tip {
+ border: 1px solid #999;
+ }
+
+
+/* div icon */
+
+.leaflet-div-icon {
+ background: #fff;
+ border: 1px solid #666;
+ }
diff --git a/webapp/org.eclipse.sensinact.studio.webapp.indoor/webapp/indoor.html b/webapp/org.eclipse.sensinact.studio.webapp.indoor/webapp/indoor.html
new file mode 100644
index 0000000..3c239aa
--- /dev/null
+++ b/webapp/org.eclipse.sensinact.studio.webapp.indoor/webapp/indoor.html
@@ -0,0 +1,28 @@
+<!--
+
+ Copyright (c) 2017 CEA.
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+
+ Contributors:
+ CEA - initial API and implementation and/or initial documentation
+
+-->
+<!DOCTYPE html>
+<html lang="en">
+ <head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+ <title>Outdoor Map</title>
+ <link rel="stylesheet" href="css/leaflet.css" />
+ <link rel="stylesheet" href="css/custom.css" />
+ </head>
+ <body>
+ <div id="map"></div>
+ <script src="js/leaflet.js"></script>
+ <script src="js/custom.js"></script>
+ </body>
+</html>
diff --git a/webapp/org.eclipse.sensinact.studio.webapp.indoor/webapp/js/custom.js b/webapp/org.eclipse.sensinact.studio.webapp.indoor/webapp/js/custom.js
new file mode 100644
index 0000000..ca0b455
--- /dev/null
+++ b/webapp/org.eclipse.sensinact.studio.webapp.indoor/webapp/js/custom.js
@@ -0,0 +1,22 @@
+/*
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+var map = L.map('map').setView([43.464304, -3.810365], 15);
+
+L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
+ attribution: '© <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
+}).addTo(map);
+
+function onMapClick(e) {
+ var marker = L.marker([43.464304, -3.810365]).bindPopup("<b>Hello world!</b><br>I am a popup.").addTo(map);
+}
+
+
+map.on('click', onMapClick);
diff --git a/webapp/org.eclipse.sensinact.studio.webapp.indoor/webapp/js/images/layers-2x.png b/webapp/org.eclipse.sensinact.studio.webapp.indoor/webapp/js/images/layers-2x.png
new file mode 100644
index 0000000..a2cf7f9
--- /dev/null
+++ b/webapp/org.eclipse.sensinact.studio.webapp.indoor/webapp/js/images/layers-2x.png
Binary files differ
diff --git a/webapp/org.eclipse.sensinact.studio.webapp.indoor/webapp/js/images/layers.png b/webapp/org.eclipse.sensinact.studio.webapp.indoor/webapp/js/images/layers.png
new file mode 100644
index 0000000..bca0a0e
--- /dev/null
+++ b/webapp/org.eclipse.sensinact.studio.webapp.indoor/webapp/js/images/layers.png
Binary files differ
diff --git a/webapp/org.eclipse.sensinact.studio.webapp.indoor/webapp/js/images/marker-icon-2x.png b/webapp/org.eclipse.sensinact.studio.webapp.indoor/webapp/js/images/marker-icon-2x.png
new file mode 100644
index 0000000..0015b64
--- /dev/null
+++ b/webapp/org.eclipse.sensinact.studio.webapp.indoor/webapp/js/images/marker-icon-2x.png
Binary files differ
diff --git a/webapp/org.eclipse.sensinact.studio.webapp.indoor/webapp/js/images/marker-icon.png b/webapp/org.eclipse.sensinact.studio.webapp.indoor/webapp/js/images/marker-icon.png
new file mode 100644
index 0000000..e2e9f75
--- /dev/null
+++ b/webapp/org.eclipse.sensinact.studio.webapp.indoor/webapp/js/images/marker-icon.png
Binary files differ
diff --git a/webapp/org.eclipse.sensinact.studio.webapp.indoor/webapp/js/images/marker-shadow.png b/webapp/org.eclipse.sensinact.studio.webapp.indoor/webapp/js/images/marker-shadow.png
new file mode 100644
index 0000000..d1e773c
--- /dev/null
+++ b/webapp/org.eclipse.sensinact.studio.webapp.indoor/webapp/js/images/marker-shadow.png
Binary files differ
diff --git a/webapp/org.eclipse.sensinact.studio.webapp.indoor/webapp/js/leaflet-src.js b/webapp/org.eclipse.sensinact.studio.webapp.indoor/webapp/js/leaflet-src.js
new file mode 100644
index 0000000..721ddfb
--- /dev/null
+++ b/webapp/org.eclipse.sensinact.studio.webapp.indoor/webapp/js/leaflet-src.js
@@ -0,0 +1,9168 @@
+/*
+ Leaflet, a JavaScript library for mobile-friendly interactive maps. http://leafletjs.com
+ (c) 2010-2013, Vladimir Agafonkin
+ (c) 2010-2011, CloudMade
+*/
+(function (window, document, undefined) {
+var oldL = window.L,
+ L = {};
+
+L.version = '0.7.7';
+
+// define Leaflet for Node module pattern loaders, including Browserify
+if (typeof module === 'object' && typeof module.exports === 'object') {
+ module.exports = L;
+
+// define Leaflet as an AMD module
+} else if (typeof define === 'function' && define.amd) {
+ define(L);
+}
+
+// define Leaflet as a global L variable, saving the original L to restore later if needed
+
+L.noConflict = function () {
+ window.L = oldL;
+ return this;
+};
+
+window.L = L;
+
+
+/*
+ * L.Util contains various utility functions used throughout Leaflet code.
+ */
+
+L.Util = {
+ extend: function (dest) { // (Object[, Object, ...]) ->
+ var sources = Array.prototype.slice.call(arguments, 1),
+ i, j, len, src;
+
+ for (j = 0, len = sources.length; j < len; j++) {
+ src = sources[j] || {};
+ for (i in src) {
+ if (src.hasOwnProperty(i)) {
+ dest[i] = src[i];
+ }
+ }
+ }
+ return dest;
+ },
+
+ bind: function (fn, obj) { // (Function, Object) -> Function
+ var args = arguments.length > 2 ? Array.prototype.slice.call(arguments, 2) : null;
+ return function () {
+ return fn.apply(obj, args || arguments);
+ };
+ },
+
+ stamp: (function () {
+ var lastId = 0,
+ key = '_leaflet_id';
+ return function (obj) {
+ obj[key] = obj[key] || ++lastId;
+ return obj[key];
+ };
+ }()),
+
+ invokeEach: function (obj, method, context) {
+ var i, args;
+
+ if (typeof obj === 'object') {
+ args = Array.prototype.slice.call(arguments, 3);
+
+ for (i in obj) {
+ method.apply(context, [i, obj[i]].concat(args));
+ }
+ return true;
+ }
+
+ return false;
+ },
+
+ limitExecByInterval: function (fn, time, context) {
+ var lock, execOnUnlock;
+
+ return function wrapperFn() {
+ var args = arguments;
+
+ if (lock) {
+ execOnUnlock = true;
+ return;
+ }
+
+ lock = true;
+
+ setTimeout(function () {
+ lock = false;
+
+ if (execOnUnlock) {
+ wrapperFn.apply(context, args);
+ execOnUnlock = false;
+ }
+ }, time);
+
+ fn.apply(context, args);
+ };
+ },
+
+ falseFn: function () {
+ return false;
+ },
+
+ formatNum: function (num, digits) {
+ var pow = Math.pow(10, digits || 5);
+ return Math.round(num * pow) / pow;
+ },
+
+ trim: function (str) {
+ return str.trim ? str.trim() : str.replace(/^\s+|\s+$/g, '');
+ },
+
+ splitWords: function (str) {
+ return L.Util.trim(str).split(/\s+/);
+ },
+
+ setOptions: function (obj, options) {
+ obj.options = L.extend({}, obj.options, options);
+ return obj.options;
+ },
+
+ getParamString: function (obj, existingUrl, uppercase) {
+ var params = [];
+ for (var i in obj) {
+ params.push(encodeURIComponent(uppercase ? i.toUpperCase() : i) + '=' + encodeURIComponent(obj[i]));
+ }
+ return ((!existingUrl || existingUrl.indexOf('?') === -1) ? '?' : '&') + params.join('&');
+ },
+ template: function (str, data) {
+ return str.replace(/\{ *([\w_]+) *\}/g, function (str, key) {
+ var value = data[key];
+ if (value === undefined) {
+ throw new Error('No value provided for variable ' + str);
+ } else if (typeof value === 'function') {
+ value = value(data);
+ }
+ return value;
+ });
+ },
+
+ isArray: Array.isArray || function (obj) {
+ return (Object.prototype.toString.call(obj) === '[object Array]');
+ },
+
+ emptyImageUrl: 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs='
+};
+
+(function () {
+
+ // inspired by http://paulirish.com/2011/requestanimationframe-for-smart-animating/
+
+ function getPrefixed(name) {
+ var i, fn,
+ prefixes = ['webkit', 'moz', 'o', 'ms'];
+
+ for (i = 0; i < prefixes.length && !fn; i++) {
+ fn = window[prefixes[i] + name];
+ }
+
+ return fn;
+ }
+
+ var lastTime = 0;
+
+ function timeoutDefer(fn) {
+ var time = +new Date(),
+ timeToCall = Math.max(0, 16 - (time - lastTime));
+
+ lastTime = time + timeToCall;
+ return window.setTimeout(fn, timeToCall);
+ }
+
+ var requestFn = window.requestAnimationFrame ||
+ getPrefixed('RequestAnimationFrame') || timeoutDefer;
+
+ var cancelFn = window.cancelAnimationFrame ||
+ getPrefixed('CancelAnimationFrame') ||
+ getPrefixed('CancelRequestAnimationFrame') ||
+ function (id) { window.clearTimeout(id); };
+
+
+ L.Util.requestAnimFrame = function (fn, context, immediate, element) {
+ fn = L.bind(fn, context);
+
+ if (immediate && requestFn === timeoutDefer) {
+ fn();
+ } else {
+ return requestFn.call(window, fn, element);
+ }
+ };
+
+ L.Util.cancelAnimFrame = function (id) {
+ if (id) {
+ cancelFn.call(window, id);
+ }
+ };
+
+}());
+
+// shortcuts for most used utility functions
+L.extend = L.Util.extend;
+L.bind = L.Util.bind;
+L.stamp = L.Util.stamp;
+L.setOptions = L.Util.setOptions;
+
+
+/*
+ * L.Class powers the OOP facilities of the library.
+ * Thanks to John Resig and Dean Edwards for inspiration!
+ */
+
+L.Class = function () {};
+
+L.Class.extend = function (props) {
+
+ // extended class with the new prototype
+ var NewClass = function () {
+
+ // call the constructor
+ if (this.initialize) {
+ this.initialize.apply(this, arguments);
+ }
+
+ // call all constructor hooks
+ if (this._initHooks) {
+ this.callInitHooks();
+ }
+ };
+
+ // instantiate class without calling constructor
+ var F = function () {};
+ F.prototype = this.prototype;
+
+ var proto = new F();
+ proto.constructor = NewClass;
+
+ NewClass.prototype = proto;
+
+ //inherit parent's statics
+ for (var i in this) {
+ if (this.hasOwnProperty(i) && i !== 'prototype') {
+ NewClass[i] = this[i];
+ }
+ }
+
+ // mix static properties into the class
+ if (props.statics) {
+ L.extend(NewClass, props.statics);
+ delete props.statics;
+ }
+
+ // mix includes into the prototype
+ if (props.includes) {
+ L.Util.extend.apply(null, [proto].concat(props.includes));
+ delete props.includes;
+ }
+
+ // merge options
+ if (props.options && proto.options) {
+ props.options = L.extend({}, proto.options, props.options);
+ }
+
+ // mix given properties into the prototype
+ L.extend(proto, props);
+
+ proto._initHooks = [];
+
+ var parent = this;
+ // jshint camelcase: false
+ NewClass.__super__ = parent.prototype;
+
+ // add method for calling all hooks
+ proto.callInitHooks = function () {
+
+ if (this._initHooksCalled) { return; }
+
+ if (parent.prototype.callInitHooks) {
+ parent.prototype.callInitHooks.call(this);
+ }
+
+ this._initHooksCalled = true;
+
+ for (var i = 0, len = proto._initHooks.length; i < len; i++) {
+ proto._initHooks[i].call(this);
+ }
+ };
+
+ return NewClass;
+};
+
+
+// method for adding properties to prototype
+L.Class.include = function (props) {
+ L.extend(this.prototype, props);
+};
+
+// merge new default options to the Class
+L.Class.mergeOptions = function (options) {
+ L.extend(this.prototype.options, options);
+};
+
+// add a constructor hook
+L.Class.addInitHook = function (fn) { // (Function) || (String, args...)
+ var args = Array.prototype.slice.call(arguments, 1);
+
+ var init = typeof fn === 'function' ? fn : function () {
+ this[fn].apply(this, args);
+ };
+
+ this.prototype._initHooks = this.prototype._initHooks || [];
+ this.prototype._initHooks.push(init);
+};
+
+
+/*
+ * L.Mixin.Events is used to add custom events functionality to Leaflet classes.
+ */
+
+var eventsKey = '_leaflet_events';
+
+L.Mixin = {};
+
+L.Mixin.Events = {
+
+ addEventListener: function (types, fn, context) { // (String, Function[, Object]) or (Object[, Object])
+
+ // types can be a map of types/handlers
+ if (L.Util.invokeEach(types, this.addEventListener, this, fn, context)) { return this; }
+
+ var events = this[eventsKey] = this[eventsKey] || {},
+ contextId = context && context !== this && L.stamp(context),
+ i, len, event, type, indexKey, indexLenKey, typeIndex;
+
+ // types can be a string of space-separated words
+ types = L.Util.splitWords(types);
+
+ for (i = 0, len = types.length; i < len; i++) {
+ event = {
+ action: fn,
+ context: context || this
+ };
+ type = types[i];
+
+ if (contextId) {
+ // store listeners of a particular context in a separate hash (if it has an id)
+ // gives a major performance boost when removing thousands of map layers
+
+ indexKey = type + '_idx';
+ indexLenKey = indexKey + '_len';
+
+ typeIndex = events[indexKey] = events[indexKey] || {};
+
+ if (!typeIndex[contextId]) {
+ typeIndex[contextId] = [];
+
+ // keep track of the number of keys in the index to quickly check if it's empty
+ events[indexLenKey] = (events[indexLenKey] || 0) + 1;
+ }
+
+ typeIndex[contextId].push(event);
+
+
+ } else {
+ events[type] = events[type] || [];
+ events[type].push(event);
+ }
+ }
+
+ return this;
+ },
+
+ hasEventListeners: function (type) { // (String) -> Boolean
+ var events = this[eventsKey];
+ return !!events && ((type in events && events[type].length > 0) ||
+ (type + '_idx' in events && events[type + '_idx_len'] > 0));
+ },
+
+ removeEventListener: function (types, fn, context) { // ([String, Function, Object]) or (Object[, Object])
+
+ if (!this[eventsKey]) {
+ return this;
+ }
+
+ if (!types) {
+ return this.clearAllEventListeners();
+ }
+
+ if (L.Util.invokeEach(types, this.removeEventListener, this, fn, context)) { return this; }
+
+ var events = this[eventsKey],
+ contextId = context && context !== this && L.stamp(context),
+ i, len, type, listeners, j, indexKey, indexLenKey, typeIndex, removed;
+
+ types = L.Util.splitWords(types);
+
+ for (i = 0, len = types.length; i < len; i++) {
+ type = types[i];
+ indexKey = type + '_idx';
+ indexLenKey = indexKey + '_len';
+
+ typeIndex = events[indexKey];
+
+ if (!fn) {
+ // clear all listeners for a type if function isn't specified
+ delete events[type];
+ delete events[indexKey];
+ delete events[indexLenKey];
+
+ } else {
+ listeners = contextId && typeIndex ? typeIndex[contextId] : events[type];
+
+ if (listeners) {
+ for (j = listeners.length - 1; j >= 0; j--) {
+ if ((listeners[j].action === fn) && (!context || (listeners[j].context === context))) {
+ removed = listeners.splice(j, 1);
+ // set the old action to a no-op, because it is possible
+ // that the listener is being iterated over as part of a dispatch
+ removed[0].action = L.Util.falseFn;
+ }
+ }
+
+ if (context && typeIndex && (listeners.length === 0)) {
+ delete typeIndex[contextId];
+ events[indexLenKey]--;
+ }
+ }
+ }
+ }
+
+ return this;
+ },
+
+ clearAllEventListeners: function () {
+ delete this[eventsKey];
+ return this;
+ },
+
+ fireEvent: function (type, data) { // (String[, Object])
+ if (!this.hasEventListeners(type)) {
+ return this;
+ }
+
+ var event = L.Util.extend({}, data, { type: type, target: this });
+
+ var events = this[eventsKey],
+ listeners, i, len, typeIndex, contextId;
+
+ if (events[type]) {
+ // make sure adding/removing listeners inside other listeners won't cause infinite loop
+ listeners = events[type].slice();
+
+ for (i = 0, len = listeners.length; i < len; i++) {
+ listeners[i].action.call(listeners[i].context, event);
+ }
+ }
+
+ // fire event for the context-indexed listeners as well
+ typeIndex = events[type + '_idx'];
+
+ for (contextId in typeIndex) {
+ listeners = typeIndex[contextId].slice();
+
+ if (listeners) {
+ for (i = 0, len = listeners.length; i < len; i++) {
+ listeners[i].action.call(listeners[i].context, event);
+ }
+ }
+ }
+
+ return this;
+ },
+
+ addOneTimeEventListener: function (types, fn, context) {
+
+ if (L.Util.invokeEach(types, this.addOneTimeEventListener, this, fn, context)) { return this; }
+
+ var handler = L.bind(function () {
+ this
+ .removeEventListener(types, fn, context)
+ .removeEventListener(types, handler, context);
+ }, this);
+
+ return this
+ .addEventListener(types, fn, context)
+ .addEventListener(types, handler, context);
+ }
+};
+
+L.Mixin.Events.on = L.Mixin.Events.addEventListener;
+L.Mixin.Events.off = L.Mixin.Events.removeEventListener;
+L.Mixin.Events.once = L.Mixin.Events.addOneTimeEventListener;
+L.Mixin.Events.fire = L.Mixin.Events.fireEvent;
+
+
+/*
+ * L.Browser handles different browser and feature detections for internal Leaflet use.
+ */
+
+(function () {
+
+ var ie = 'ActiveXObject' in window,
+ ielt9 = ie && !document.addEventListener,
+
+ // terrible browser detection to work around Safari / iOS / Android browser bugs
+ ua = navigator.userAgent.toLowerCase(),
+ webkit = ua.indexOf('webkit') !== -1,
+ chrome = ua.indexOf('chrome') !== -1,
+ phantomjs = ua.indexOf('phantom') !== -1,
+ android = ua.indexOf('android') !== -1,
+ android23 = ua.search('android [23]') !== -1,
+ gecko = ua.indexOf('gecko') !== -1,
+
+ mobile = typeof orientation !== undefined + '',
+ msPointer = !window.PointerEvent && window.MSPointerEvent,
+ pointer = (window.PointerEvent && window.navigator.pointerEnabled) ||
+ msPointer,
+ retina = ('devicePixelRatio' in window && window.devicePixelRatio > 1) ||
+ ('matchMedia' in window && window.matchMedia('(min-resolution:144dpi)') &&
+ window.matchMedia('(min-resolution:144dpi)').matches),
+
+ doc = document.documentElement,
+ ie3d = ie && ('transition' in doc.style),
+ webkit3d = ('WebKitCSSMatrix' in window) && ('m11' in new window.WebKitCSSMatrix()) && !android23,
+ gecko3d = 'MozPerspective' in doc.style,
+ opera3d = 'OTransition' in doc.style,
+ any3d = !window.L_DISABLE_3D && (ie3d || webkit3d || gecko3d || opera3d) && !phantomjs;
+
+ var touch = !window.L_NO_TOUCH && !phantomjs && (pointer || 'ontouchstart' in window ||
+ (window.DocumentTouch && document instanceof window.DocumentTouch));
+
+ L.Browser = {
+ ie: ie,
+ ielt9: ielt9,
+ webkit: webkit,
+ gecko: gecko && !webkit && !window.opera && !ie,
+
+ android: android,
+ android23: android23,
+
+ chrome: chrome,
+
+ ie3d: ie3d,
+ webkit3d: webkit3d,
+ gecko3d: gecko3d,
+ opera3d: opera3d,
+ any3d: any3d,
+
+ mobile: mobile,
+ mobileWebkit: mobile && webkit,
+ mobileWebkit3d: mobile && webkit3d,
+ mobileOpera: mobile && window.opera,
+
+ touch: touch,
+ msPointer: msPointer,
+ pointer: pointer,
+
+ retina: retina
+ };
+
+}());
+
+
+/*
+ * L.Point represents a point with x and y coordinates.
+ */
+
+L.Point = function (/*Number*/ x, /*Number*/ y, /*Boolean*/ round) {
+ this.x = (round ? Math.round(x) : x);
+ this.y = (round ? Math.round(y) : y);
+};
+
+L.Point.prototype = {
+
+ clone: function () {
+ return new L.Point(this.x, this.y);
+ },
+
+ // non-destructive, returns a new point
+ add: function (point) {
+ return this.clone()._add(L.point(point));
+ },
+
+ // destructive, used directly for performance in situations where it's safe to modify existing point
+ _add: function (point) {
+ this.x += point.x;
+ this.y += point.y;
+ return this;
+ },
+
+ subtract: function (point) {
+ return this.clone()._subtract(L.point(point));
+ },
+
+ _subtract: function (point) {
+ this.x -= point.x;
+ this.y -= point.y;
+ return this;
+ },
+
+ divideBy: function (num) {
+ return this.clone()._divideBy(num);
+ },
+
+ _divideBy: function (num) {
+ this.x /= num;
+ this.y /= num;
+ return this;
+ },
+
+ multiplyBy: function (num) {
+ return this.clone()._multiplyBy(num);
+ },
+
+ _multiplyBy: function (num) {
+ this.x *= num;
+ this.y *= num;
+ return this;
+ },
+
+ round: function () {
+ return this.clone()._round();
+ },
+
+ _round: function () {
+ this.x = Math.round(this.x);
+ this.y = Math.round(this.y);
+ return this;
+ },
+
+ floor: function () {
+ return this.clone()._floor();
+ },
+
+ _floor: function () {
+ this.x = Math.floor(this.x);
+ this.y = Math.floor(this.y);
+ return this;
+ },
+
+ distanceTo: function (point) {
+ point = L.point(point);
+
+ var x = point.x - this.x,
+ y = point.y - this.y;
+
+ return Math.sqrt(x * x + y * y);
+ },
+
+ equals: function (point) {
+ point = L.point(point);
+
+ return point.x === this.x &&
+ point.y === this.y;
+ },
+
+ contains: function (point) {
+ point = L.point(point);
+
+ return Math.abs(point.x) <= Math.abs(this.x) &&
+ Math.abs(point.y) <= Math.abs(this.y);
+ },
+
+ toString: function () {
+ return 'Point(' +
+ L.Util.formatNum(this.x) + ', ' +
+ L.Util.formatNum(this.y) + ')';
+ }
+};
+
+L.point = function (x, y, round) {
+ if (x instanceof L.Point) {
+ return x;
+ }
+ if (L.Util.isArray(x)) {
+ return new L.Point(x[0], x[1]);
+ }
+ if (x === undefined || x === null) {
+ return x;
+ }
+ return new L.Point(x, y, round);
+};
+
+
+/*
+ * L.Bounds represents a rectangular area on the screen in pixel coordinates.
+ */
+
+L.Bounds = function (a, b) { //(Point, Point) or Point[]
+ if (!a) { return; }
+
+ var points = b ? [a, b] : a;
+
+ for (var i = 0, len = points.length; i < len; i++) {
+ this.extend(points[i]);
+ }
+};
+
+L.Bounds.prototype = {
+ // extend the bounds to contain the given point
+ extend: function (point) { // (Point)
+ point = L.point(point);
+
+ if (!this.min && !this.max) {
+ this.min = point.clone();
+ this.max = point.clone();
+ } else {
+ this.min.x = Math.min(point.x, this.min.x);
+ this.max.x = Math.max(point.x, this.max.x);
+ this.min.y = Math.min(point.y, this.min.y);
+ this.max.y = Math.max(point.y, this.max.y);
+ }
+ return this;
+ },
+
+ getCenter: function (round) { // (Boolean) -> Point
+ return new L.Point(
+ (this.min.x + this.max.x) / 2,
+ (this.min.y + this.max.y) / 2, round);
+ },
+
+ getBottomLeft: function () { // -> Point
+ return new L.Point(this.min.x, this.max.y);
+ },
+
+ getTopRight: function () { // -> Point
+ return new L.Point(this.max.x, this.min.y);
+ },
+
+ getSize: function () {
+ return this.max.subtract(this.min);
+ },
+
+ contains: function (obj) { // (Bounds) or (Point) -> Boolean
+ var min, max;
+
+ if (typeof obj[0] === 'number' || obj instanceof L.Point) {
+ obj = L.point(obj);
+ } else {
+ obj = L.bounds(obj);
+ }
+
+ if (obj instanceof L.Bounds) {
+ min = obj.min;
+ max = obj.max;
+ } else {
+ min = max = obj;
+ }
+
+ return (min.x >= this.min.x) &&
+ (max.x <= this.max.x) &&
+ (min.y >= this.min.y) &&
+ (max.y <= this.max.y);
+ },
+
+ intersects: function (bounds) { // (Bounds) -> Boolean
+ bounds = L.bounds(bounds);
+
+ var min = this.min,
+ max = this.max,
+ min2 = bounds.min,
+ max2 = bounds.max,
+ xIntersects = (max2.x >= min.x) && (min2.x <= max.x),
+ yIntersects = (max2.y >= min.y) && (min2.y <= max.y);
+
+ return xIntersects && yIntersects;
+ },
+
+ isValid: function () {
+ return !!(this.min && this.max);
+ }
+};
+
+L.bounds = function (a, b) { // (Bounds) or (Point, Point) or (Point[])
+ if (!a || a instanceof L.Bounds) {
+ return a;
+ }
+ return new L.Bounds(a, b);
+};
+
+
+/*
+ * L.Transformation is an utility class to perform simple point transformations through a 2d-matrix.
+ */
+
+L.Transformation = function (a, b, c, d) {
+ this._a = a;
+ this._b = b;
+ this._c = c;
+ this._d = d;
+};
+
+L.Transformation.prototype = {
+ transform: function (point, scale) { // (Point, Number) -> Point
+ return this._transform(point.clone(), scale);
+ },
+
+ // destructive transform (faster)
+ _transform: function (point, scale) {
+ scale = scale || 1;
+ point.x = scale * (this._a * point.x + this._b);
+ point.y = scale * (this._c * point.y + this._d);
+ return point;
+ },
+
+ untransform: function (point, scale) {
+ scale = scale || 1;
+ return new L.Point(
+ (point.x / scale - this._b) / this._a,
+ (point.y / scale - this._d) / this._c);
+ }
+};
+
+
+/*
+ * L.DomUtil contains various utility functions for working with DOM.
+ */
+
+L.DomUtil = {
+ get: function (id) {
+ return (typeof id === 'string' ? document.getElementById(id) : id);
+ },
+
+ getStyle: function (el, style) {
+
+ var value = el.style[style];
+
+ if (!value && el.currentStyle) {
+ value = el.currentStyle[style];
+ }
+
+ if ((!value || value === 'auto') && document.defaultView) {
+ var css = document.defaultView.getComputedStyle(el, null);
+ value = css ? css[style] : null;
+ }
+
+ return value === 'auto' ? null : value;
+ },
+
+ getViewportOffset: function (element) {
+
+ var top = 0,
+ left = 0,
+ el = element,
+ docBody = document.body,
+ docEl = document.documentElement,
+ pos;
+
+ do {
+ top += el.offsetTop || 0;
+ left += el.offsetLeft || 0;
+
+ //add borders
+ top += parseInt(L.DomUtil.getStyle(el, 'borderTopWidth'), 10) || 0;
+ left += parseInt(L.DomUtil.getStyle(el, 'borderLeftWidth'), 10) || 0;
+
+ pos = L.DomUtil.getStyle(el, 'position');
+
+ if (el.offsetParent === docBody && pos === 'absolute') { break; }
+
+ if (pos === 'fixed') {
+ top += docBody.scrollTop || docEl.scrollTop || 0;
+ left += docBody.scrollLeft || docEl.scrollLeft || 0;
+ break;
+ }
+
+ if (pos === 'relative' && !el.offsetLeft) {
+ var width = L.DomUtil.getStyle(el, 'width'),
+ maxWidth = L.DomUtil.getStyle(el, 'max-width'),
+ r = el.getBoundingClientRect();
+
+ if (width !== 'none' || maxWidth !== 'none') {
+ left += r.left + el.clientLeft;
+ }
+
+ //calculate full y offset since we're breaking out of the loop
+ top += r.top + (docBody.scrollTop || docEl.scrollTop || 0);
+
+ break;
+ }
+
+ el = el.offsetParent;
+
+ } while (el);
+
+ el = element;
+
+ do {
+ if (el === docBody) { break; }
+
+ top -= el.scrollTop || 0;
+ left -= el.scrollLeft || 0;
+
+ el = el.parentNode;
+ } while (el);
+
+ return new L.Point(left, top);
+ },
+
+ documentIsLtr: function () {
+ if (!L.DomUtil._docIsLtrCached) {
+ L.DomUtil._docIsLtrCached = true;
+ L.DomUtil._docIsLtr = L.DomUtil.getStyle(document.body, 'direction') === 'ltr';
+ }
+ return L.DomUtil._docIsLtr;
+ },
+
+ create: function (tagName, className, container) {
+
+ var el = document.createElement(tagName);
+ el.className = className;
+
+ if (container) {
+ container.appendChild(el);
+ }
+
+ return el;
+ },
+
+ hasClass: function (el, name) {
+ if (el.classList !== undefined) {
+ return el.classList.contains(name);
+ }
+ var className = L.DomUtil._getClass(el);
+ return className.length > 0 && new RegExp('(^|\\s)' + name + '(\\s|$)').test(className);
+ },
+
+ addClass: function (el, name) {
+ if (el.classList !== undefined) {
+ var classes = L.Util.splitWords(name);
+ for (var i = 0, len = classes.length; i < len; i++) {
+ el.classList.add(classes[i]);
+ }
+ } else if (!L.DomUtil.hasClass(el, name)) {
+ var className = L.DomUtil._getClass(el);
+ L.DomUtil._setClass(el, (className ? className + ' ' : '') + name);
+ }
+ },
+
+ removeClass: function (el, name) {
+ if (el.classList !== undefined) {
+ el.classList.remove(name);
+ } else {
+ L.DomUtil._setClass(el, L.Util.trim((' ' + L.DomUtil._getClass(el) + ' ').replace(' ' + name + ' ', ' ')));
+ }
+ },
+
+ _setClass: function (el, name) {
+ if (el.className.baseVal === undefined) {
+ el.className = name;
+ } else {
+ // in case of SVG element
+ el.className.baseVal = name;
+ }
+ },
+
+ _getClass: function (el) {
+ return el.className.baseVal === undefined ? el.className : el.className.baseVal;
+ },
+
+ setOpacity: function (el, value) {
+
+ if ('opacity' in el.style) {
+ el.style.opacity = value;
+
+ } else if ('filter' in el.style) {
+
+ var filter = false,
+ filterName = 'DXImageTransform.Microsoft.Alpha';
+
+ // filters collection throws an error if we try to retrieve a filter that doesn't exist
+ try {
+ filter = el.filters.item(filterName);
+ } catch (e) {
+ // don't set opacity to 1 if we haven't already set an opacity,
+ // it isn't needed and breaks transparent pngs.
+ if (value === 1) { return; }
+ }
+
+ value = Math.round(value * 100);
+
+ if (filter) {
+ filter.Enabled = (value !== 100);
+ filter.Opacity = value;
+ } else {
+ el.style.filter += ' progid:' + filterName + '(opacity=' + value + ')';
+ }
+ }
+ },
+
+ testProp: function (props) {
+
+ var style = document.documentElement.style;
+
+ for (var i = 0; i < props.length; i++) {
+ if (props[i] in style) {
+ return props[i];
+ }
+ }
+ return false;
+ },
+
+ getTranslateString: function (point) {
+ // on WebKit browsers (Chrome/Safari/iOS Safari/Android) using translate3d instead of translate
+ // makes animation smoother as it ensures HW accel is used. Firefox 13 doesn't care
+ // (same speed either way), Opera 12 doesn't support translate3d
+
+ var is3d = L.Browser.webkit3d,
+ open = 'translate' + (is3d ? '3d' : '') + '(',
+ close = (is3d ? ',0' : '') + ')';
+
+ return open + point.x + 'px,' + point.y + 'px' + close;
+ },
+
+ getScaleString: function (scale, origin) {
+
+ var preTranslateStr = L.DomUtil.getTranslateString(origin.add(origin.multiplyBy(-1 * scale))),
+ scaleStr = ' scale(' + scale + ') ';
+
+ return preTranslateStr + scaleStr;
+ },
+
+ setPosition: function (el, point, disable3D) { // (HTMLElement, Point[, Boolean])
+
+ // jshint camelcase: false
+ el._leaflet_pos = point;
+
+ if (!disable3D && L.Browser.any3d) {
+ el.style[L.DomUtil.TRANSFORM] = L.DomUtil.getTranslateString(point);
+ } else {
+ el.style.left = point.x + 'px';
+ el.style.top = point.y + 'px';
+ }
+ },
+
+ getPosition: function (el) {
+ // this method is only used for elements previously positioned using setPosition,
+ // so it's safe to cache the position for performance
+
+ // jshint camelcase: false
+ return el._leaflet_pos;
+ }
+};
+
+
+// prefix style property names
+
+L.DomUtil.TRANSFORM = L.DomUtil.testProp(
+ ['transform', 'WebkitTransform', 'OTransform', 'MozTransform', 'msTransform']);
+
+// webkitTransition comes first because some browser versions that drop vendor prefix don't do
+// the same for the transitionend event, in particular the Android 4.1 stock browser
+
+L.DomUtil.TRANSITION = L.DomUtil.testProp(
+ ['webkitTransition', 'transition', 'OTransition', 'MozTransition', 'msTransition']);
+
+L.DomUtil.TRANSITION_END =
+ L.DomUtil.TRANSITION === 'webkitTransition' || L.DomUtil.TRANSITION === 'OTransition' ?
+ L.DomUtil.TRANSITION + 'End' : 'transitionend';
+
+(function () {
+ if ('onselectstart' in document) {
+ L.extend(L.DomUtil, {
+ disableTextSelection: function () {
+ L.DomEvent.on(window, 'selectstart', L.DomEvent.preventDefault);
+ },
+
+ enableTextSelection: function () {
+ L.DomEvent.off(window, 'selectstart', L.DomEvent.preventDefault);
+ }
+ });
+ } else {
+ var userSelectProperty = L.DomUtil.testProp(
+ ['userSelect', 'WebkitUserSelect', 'OUserSelect', 'MozUserSelect', 'msUserSelect']);
+
+ L.extend(L.DomUtil, {
+ disableTextSelection: function () {
+ if (userSelectProperty) {
+ var style = document.documentElement.style;
+ this._userSelect = style[userSelectProperty];
+ style[userSelectProperty] = 'none';
+ }
+ },
+
+ enableTextSelection: function () {
+ if (userSelectProperty) {
+ document.documentElement.style[userSelectProperty] = this._userSelect;
+ delete this._userSelect;
+ }
+ }
+ });
+ }
+
+ L.extend(L.DomUtil, {
+ disableImageDrag: function () {
+ L.DomEvent.on(window, 'dragstart', L.DomEvent.preventDefault);
+ },
+
+ enableImageDrag: function () {
+ L.DomEvent.off(window, 'dragstart', L.DomEvent.preventDefault);
+ }
+ });
+})();
+
+
+/*
+ * L.LatLng represents a geographical point with latitude and longitude coordinates.
+ */
+
+L.LatLng = function (lat, lng, alt) { // (Number, Number, Number)
+ lat = parseFloat(lat);
+ lng = parseFloat(lng);
+
+ if (isNaN(lat) || isNaN(lng)) {
+ throw new Error('Invalid LatLng object: (' + lat + ', ' + lng + ')');
+ }
+
+ this.lat = lat;
+ this.lng = lng;
+
+ if (alt !== undefined) {
+ this.alt = parseFloat(alt);
+ }
+};
+
+L.extend(L.LatLng, {
+ DEG_TO_RAD: Math.PI / 180,
+ RAD_TO_DEG: 180 / Math.PI,
+ MAX_MARGIN: 1.0E-9 // max margin of error for the "equals" check
+});
+
+L.LatLng.prototype = {
+ equals: function (obj) { // (LatLng) -> Boolean
+ if (!obj) { return false; }
+
+ obj = L.latLng(obj);
+
+ var margin = Math.max(
+ Math.abs(this.lat - obj.lat),
+ Math.abs(this.lng - obj.lng));
+
+ return margin <= L.LatLng.MAX_MARGIN;
+ },
+
+ toString: function (precision) { // (Number) -> String
+ return 'LatLng(' +
+ L.Util.formatNum(this.lat, precision) + ', ' +
+ L.Util.formatNum(this.lng, precision) + ')';
+ },
+
+ // Haversine distance formula, see http://en.wikipedia.org/wiki/Haversine_formula
+ // TODO move to projection code, LatLng shouldn't know about Earth
+ distanceTo: function (other) { // (LatLng) -> Number
+ other = L.latLng(other);
+
+ var R = 6378137, // earth radius in meters
+ d2r = L.LatLng.DEG_TO_RAD,
+ dLat = (other.lat - this.lat) * d2r,
+ dLon = (other.lng - this.lng) * d2r,
+ lat1 = this.lat * d2r,
+ lat2 = other.lat * d2r,
+ sin1 = Math.sin(dLat / 2),
+ sin2 = Math.sin(dLon / 2);
+
+ var a = sin1 * sin1 + sin2 * sin2 * Math.cos(lat1) * Math.cos(lat2);
+
+ return R * 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
+ },
+
+ wrap: function (a, b) { // (Number, Number) -> LatLng
+ var lng = this.lng;
+
+ a = a || -180;
+ b = b || 180;
+
+ lng = (lng + b) % (b - a) + (lng < a || lng === b ? b : a);
+
+ return new L.LatLng(this.lat, lng);
+ }
+};
+
+L.latLng = function (a, b) { // (LatLng) or ([Number, Number]) or (Number, Number)
+ if (a instanceof L.LatLng) {
+ return a;
+ }
+ if (L.Util.isArray(a)) {
+ if (typeof a[0] === 'number' || typeof a[0] === 'string') {
+ return new L.LatLng(a[0], a[1], a[2]);
+ } else {
+ return null;
+ }
+ }
+ if (a === undefined || a === null) {
+ return a;
+ }
+ if (typeof a === 'object' && 'lat' in a) {
+ return new L.LatLng(a.lat, 'lng' in a ? a.lng : a.lon);
+ }
+ if (b === undefined) {
+ return null;
+ }
+ return new L.LatLng(a, b);
+};
+
+
+
+/*
+ * L.LatLngBounds represents a rectangular area on the map in geographical coordinates.
+ */
+
+L.LatLngBounds = function (southWest, northEast) { // (LatLng, LatLng) or (LatLng[])
+ if (!southWest) { return; }
+
+ var latlngs = northEast ? [southWest, northEast] : southWest;
+
+ for (var i = 0, len = latlngs.length; i < len; i++) {
+ this.extend(latlngs[i]);
+ }
+};
+
+L.LatLngBounds.prototype = {
+ // extend the bounds to contain the given point or bounds
+ extend: function (obj) { // (LatLng) or (LatLngBounds)
+ if (!obj) { return this; }
+
+ var latLng = L.latLng(obj);
+ if (latLng !== null) {
+ obj = latLng;
+ } else {
+ obj = L.latLngBounds(obj);
+ }
+
+ if (obj instanceof L.LatLng) {
+ if (!this._southWest && !this._northEast) {
+ this._southWest = new L.LatLng(obj.lat, obj.lng);
+ this._northEast = new L.LatLng(obj.lat, obj.lng);
+ } else {
+ this._southWest.lat = Math.min(obj.lat, this._southWest.lat);
+ this._southWest.lng = Math.min(obj.lng, this._southWest.lng);
+
+ this._northEast.lat = Math.max(obj.lat, this._northEast.lat);
+ this._northEast.lng = Math.max(obj.lng, this._northEast.lng);
+ }
+ } else if (obj instanceof L.LatLngBounds) {
+ this.extend(obj._southWest);
+ this.extend(obj._northEast);
+ }
+ return this;
+ },
+
+ // extend the bounds by a percentage
+ pad: function (bufferRatio) { // (Number) -> LatLngBounds
+ var sw = this._southWest,
+ ne = this._northEast,
+ heightBuffer = Math.abs(sw.lat - ne.lat) * bufferRatio,
+ widthBuffer = Math.abs(sw.lng - ne.lng) * bufferRatio;
+
+ return new L.LatLngBounds(
+ new L.LatLng(sw.lat - heightBuffer, sw.lng - widthBuffer),
+ new L.LatLng(ne.lat + heightBuffer, ne.lng + widthBuffer));
+ },
+
+ getCenter: function () { // -> LatLng
+ return new L.LatLng(
+ (this._southWest.lat + this._northEast.lat) / 2,
+ (this._southWest.lng + this._northEast.lng) / 2);
+ },
+
+ getSouthWest: function () {
+ return this._southWest;
+ },
+
+ getNorthEast: function () {
+ return this._northEast;
+ },
+
+ getNorthWest: function () {
+ return new L.LatLng(this.getNorth(), this.getWest());
+ },
+
+ getSouthEast: function () {
+ return new L.LatLng(this.getSouth(), this.getEast());
+ },
+
+ getWest: function () {
+ return this._southWest.lng;
+ },
+
+ getSouth: function () {
+ return this._southWest.lat;
+ },
+
+ getEast: function () {
+ return this._northEast.lng;
+ },
+
+ getNorth: function () {
+ return this._northEast.lat;
+ },
+
+ contains: function (obj) { // (LatLngBounds) or (LatLng) -> Boolean
+ if (typeof obj[0] === 'number' || obj instanceof L.LatLng) {
+ obj = L.latLng(obj);
+ } else {
+ obj = L.latLngBounds(obj);
+ }
+
+ var sw = this._southWest,
+ ne = this._northEast,
+ sw2, ne2;
+
+ if (obj instanceof L.LatLngBounds) {
+ sw2 = obj.getSouthWest();
+ ne2 = obj.getNorthEast();
+ } else {
+ sw2 = ne2 = obj;
+ }
+
+ return (sw2.lat >= sw.lat) && (ne2.lat <= ne.lat) &&
+ (sw2.lng >= sw.lng) && (ne2.lng <= ne.lng);
+ },
+
+ intersects: function (bounds) { // (LatLngBounds)
+ bounds = L.latLngBounds(bounds);
+
+ var sw = this._southWest,
+ ne = this._northEast,
+ sw2 = bounds.getSouthWest(),
+ ne2 = bounds.getNorthEast(),
+
+ latIntersects = (ne2.lat >= sw.lat) && (sw2.lat <= ne.lat),
+ lngIntersects = (ne2.lng >= sw.lng) && (sw2.lng <= ne.lng);
+
+ return latIntersects && lngIntersects;
+ },
+
+ toBBoxString: function () {
+ return [this.getWest(), this.getSouth(), this.getEast(), this.getNorth()].join(',');
+ },
+
+ equals: function (bounds) { // (LatLngBounds)
+ if (!bounds) { return false; }
+
+ bounds = L.latLngBounds(bounds);
+
+ return this._southWest.equals(bounds.getSouthWest()) &&
+ this._northEast.equals(bounds.getNorthEast());
+ },
+
+ isValid: function () {
+ return !!(this._southWest && this._northEast);
+ }
+};
+
+//TODO International date line?
+
+L.latLngBounds = function (a, b) { // (LatLngBounds) or (LatLng, LatLng)
+ if (!a || a instanceof L.LatLngBounds) {
+ return a;
+ }
+ return new L.LatLngBounds(a, b);
+};
+
+
+/*
+ * L.Projection contains various geographical projections used by CRS classes.
+ */
+
+L.Projection = {};
+
+
+/*
+ * Spherical Mercator is the most popular map projection, used by EPSG:3857 CRS used by default.
+ */
+
+L.Projection.SphericalMercator = {
+ MAX_LATITUDE: 85.0511287798,
+
+ project: function (latlng) { // (LatLng) -> Point
+ var d = L.LatLng.DEG_TO_RAD,
+ max = this.MAX_LATITUDE,
+ lat = Math.max(Math.min(max, latlng.lat), -max),
+ x = latlng.lng * d,
+ y = lat * d;
+
+ y = Math.log(Math.tan((Math.PI / 4) + (y / 2)));
+
+ return new L.Point(x, y);
+ },
+
+ unproject: function (point) { // (Point, Boolean) -> LatLng
+ var d = L.LatLng.RAD_TO_DEG,
+ lng = point.x * d,
+ lat = (2 * Math.atan(Math.exp(point.y)) - (Math.PI / 2)) * d;
+
+ return new L.LatLng(lat, lng);
+ }
+};
+
+
+/*
+ * Simple equirectangular (Plate Carree) projection, used by CRS like EPSG:4326 and Simple.
+ */
+
+L.Projection.LonLat = {
+ project: function (latlng) {
+ return new L.Point(latlng.lng, latlng.lat);
+ },
+
+ unproject: function (point) {
+ return new L.LatLng(point.y, point.x);
+ }
+};
+
+
+/*
+ * L.CRS is a base object for all defined CRS (Coordinate Reference Systems) in Leaflet.
+ */
+
+L.CRS = {
+ latLngToPoint: function (latlng, zoom) { // (LatLng, Number) -> Point
+ var projectedPoint = this.projection.project(latlng),
+ scale = this.scale(zoom);
+
+ return this.transformation._transform(projectedPoint, scale);
+ },
+
+ pointToLatLng: function (point, zoom) { // (Point, Number[, Boolean]) -> LatLng
+ var scale = this.scale(zoom),
+ untransformedPoint = this.transformation.untransform(point, scale);
+
+ return this.projection.unproject(untransformedPoint);
+ },
+
+ project: function (latlng) {
+ return this.projection.project(latlng);
+ },
+
+ scale: function (zoom) {
+ return 256 * Math.pow(2, zoom);
+ },
+
+ getSize: function (zoom) {
+ var s = this.scale(zoom);
+ return L.point(s, s);
+ }
+};
+
+
+/*
+ * A simple CRS that can be used for flat non-Earth maps like panoramas or game maps.
+ */
+
+L.CRS.Simple = L.extend({}, L.CRS, {
+ projection: L.Projection.LonLat,
+ transformation: new L.Transformation(1, 0, -1, 0),
+
+ scale: function (zoom) {
+ return Math.pow(2, zoom);
+ }
+});
+
+
+/*
+ * L.CRS.EPSG3857 (Spherical Mercator) is the most common CRS for web mapping
+ * and is used by Leaflet by default.
+ */
+
+L.CRS.EPSG3857 = L.extend({}, L.CRS, {
+ code: 'EPSG:3857',
+
+ projection: L.Projection.SphericalMercator,
+ transformation: new L.Transformation(0.5 / Math.PI, 0.5, -0.5 / Math.PI, 0.5),
+
+ project: function (latlng) { // (LatLng) -> Point
+ var projectedPoint = this.projection.project(latlng),
+ earthRadius = 6378137;
+ return projectedPoint.multiplyBy(earthRadius);
+ }
+});
+
+L.CRS.EPSG900913 = L.extend({}, L.CRS.EPSG3857, {
+ code: 'EPSG:900913'
+});
+
+
+/*
+ * L.CRS.EPSG4326 is a CRS popular among advanced GIS specialists.
+ */
+
+L.CRS.EPSG4326 = L.extend({}, L.CRS, {
+ code: 'EPSG:4326',
+
+ projection: L.Projection.LonLat,
+ transformation: new L.Transformation(1 / 360, 0.5, -1 / 360, 0.5)
+});
+
+
+/*
+ * L.Map is the central class of the API - it is used to create a map.
+ */
+
+L.Map = L.Class.extend({
+
+ includes: L.Mixin.Events,
+
+ options: {
+ crs: L.CRS.EPSG3857,
+
+ /*
+ center: LatLng,
+ zoom: Number,
+ layers: Array,
+ */
+
+ fadeAnimation: L.DomUtil.TRANSITION && !L.Browser.android23,
+ trackResize: true,
+ markerZoomAnimation: L.DomUtil.TRANSITION && L.Browser.any3d
+ },
+
+ initialize: function (id, options) { // (HTMLElement or String, Object)
+ options = L.setOptions(this, options);
+
+
+ this._initContainer(id);
+ this._initLayout();
+
+ // hack for https://github.com/Leaflet/Leaflet/issues/1980
+ this._onResize = L.bind(this._onResize, this);
+
+ this._initEvents();
+
+ if (options.maxBounds) {
+ this.setMaxBounds(options.maxBounds);
+ }
+
+ if (options.center && options.zoom !== undefined) {
+ this.setView(L.latLng(options.center), options.zoom, {reset: true});
+ }
+
+ this._handlers = [];
+
+ this._layers = {};
+ this._zoomBoundLayers = {};
+ this._tileLayersNum = 0;
+
+ this.callInitHooks();
+
+ this._addLayers(options.layers);
+ },
+
+
+ // public methods that modify map state
+
+ // replaced by animation-powered implementation in Map.PanAnimation.js
+ setView: function (center, zoom) {
+ zoom = zoom === undefined ? this.getZoom() : zoom;
+ this._resetView(L.latLng(center), this._limitZoom(zoom));
+ return this;
+ },
+
+ setZoom: function (zoom, options) {
+ if (!this._loaded) {
+ this._zoom = this._limitZoom(zoom);
+ return this;
+ }
+ return this.setView(this.getCenter(), zoom, {zoom: options});
+ },
+
+ zoomIn: function (delta, options) {
+ return this.setZoom(this._zoom + (delta || 1), options);
+ },
+
+ zoomOut: function (delta, options) {
+ return this.setZoom(this._zoom - (delta || 1), options);
+ },
+
+ setZoomAround: function (latlng, zoom, options) {
+ var scale = this.getZoomScale(zoom),
+ viewHalf = this.getSize().divideBy(2),
+ containerPoint = latlng instanceof L.Point ? latlng : this.latLngToContainerPoint(latlng),
+
+ centerOffset = containerPoint.subtract(viewHalf).multiplyBy(1 - 1 / scale),
+ newCenter = this.containerPointToLatLng(viewHalf.add(centerOffset));
+
+ return this.setView(newCenter, zoom, {zoom: options});
+ },
+
+ fitBounds: function (bounds, options) {
+
+ options = options || {};
+ bounds = bounds.getBounds ? bounds.getBounds() : L.latLngBounds(bounds);
+
+ var paddingTL = L.point(options.paddingTopLeft || options.padding || [0, 0]),
+ paddingBR = L.point(options.paddingBottomRight || options.padding || [0, 0]),
+
+ zoom = this.getBoundsZoom(bounds, false, paddingTL.add(paddingBR));
+
+ zoom = (options.maxZoom) ? Math.min(options.maxZoom, zoom) : zoom;
+
+ var paddingOffset = paddingBR.subtract(paddingTL).divideBy(2),
+
+ swPoint = this.project(bounds.getSouthWest(), zoom),
+ nePoint = this.project(bounds.getNorthEast(), zoom),
+ center = this.unproject(swPoint.add(nePoint).divideBy(2).add(paddingOffset), zoom);
+
+ return this.setView(center, zoom, options);
+ },
+
+ fitWorld: function (options) {
+ return this.fitBounds([[-90, -180], [90, 180]], options);
+ },
+
+ panTo: function (center, options) { // (LatLng)
+ return this.setView(center, this._zoom, {pan: options});
+ },
+
+ panBy: function (offset) { // (Point)
+ // replaced with animated panBy in Map.PanAnimation.js
+ this.fire('movestart');
+
+ this._rawPanBy(L.point(offset));
+
+ this.fire('move');
+ return this.fire('moveend');
+ },
+
+ setMaxBounds: function (bounds) {
+ bounds = L.latLngBounds(bounds);
+
+ this.options.maxBounds = bounds;
+
+ if (!bounds) {
+ return this.off('moveend', this._panInsideMaxBounds, this);
+ }
+
+ if (this._loaded) {
+ this._panInsideMaxBounds();
+ }
+
+ return this.on('moveend', this._panInsideMaxBounds, this);
+ },
+
+ panInsideBounds: function (bounds, options) {
+ var center = this.getCenter(),
+ newCenter = this._limitCenter(center, this._zoom, bounds);
+
+ if (center.equals(newCenter)) { return this; }
+
+ return this.panTo(newCenter, options);
+ },
+
+ addLayer: function (layer) {
+ // TODO method is too big, refactor
+
+ var id = L.stamp(layer);
+
+ if (this._layers[id]) { return this; }
+
+ this._layers[id] = layer;
+
+ // TODO getMaxZoom, getMinZoom in ILayer (instead of options)
+ if (layer.options && (!isNaN(layer.options.maxZoom) || !isNaN(layer.options.minZoom))) {
+ this._zoomBoundLayers[id] = layer;
+ this._updateZoomLevels();
+ }
+
+ // TODO looks ugly, refactor!!!
+ if (this.options.zoomAnimation && L.TileLayer && (layer instanceof L.TileLayer)) {
+ this._tileLayersNum++;
+ this._tileLayersToLoad++;
+ layer.on('load', this._onTileLayerLoad, this);
+ }
+
+ if (this._loaded) {
+ this._layerAdd(layer);
+ }
+
+ return this;
+ },
+
+ removeLayer: function (layer) {
+ var id = L.stamp(layer);
+
+ if (!this._layers[id]) { return this; }
+
+ if (this._loaded) {
+ layer.onRemove(this);
+ }
+
+ delete this._layers[id];
+
+ if (this._loaded) {
+ this.fire('layerremove', {layer: layer});
+ }
+
+ if (this._zoomBoundLayers[id]) {
+ delete this._zoomBoundLayers[id];
+ this._updateZoomLevels();
+ }
+
+ // TODO looks ugly, refactor
+ if (this.options.zoomAnimation && L.TileLayer && (layer instanceof L.TileLayer)) {
+ this._tileLayersNum--;
+ this._tileLayersToLoad--;
+ layer.off('load', this._onTileLayerLoad, this);
+ }
+
+ return this;
+ },
+
+ hasLayer: function (layer) {
+ if (!layer) { return false; }
+
+ return (L.stamp(layer) in this._layers);
+ },
+
+ eachLayer: function (method, context) {
+ for (var i in this._layers) {
+ method.call(context, this._layers[i]);
+ }
+ return this;
+ },
+
+ invalidateSize: function (options) {
+ if (!this._loaded) { return this; }
+
+ options = L.extend({
+ animate: false,
+ pan: true
+ }, options === true ? {animate: true} : options);
+
+ var oldSize = this.getSize();
+ this._sizeChanged = true;
+ this._initialCenter = null;
+
+ var newSize = this.getSize(),
+ oldCenter = oldSize.divideBy(2).round(),
+ newCenter = newSize.divideBy(2).round(),
+ offset = oldCenter.subtract(newCenter);
+
+ if (!offset.x && !offset.y) { return this; }
+
+ if (options.animate && options.pan) {
+ this.panBy(offset);
+
+ } else {
+ if (options.pan) {
+ this._rawPanBy(offset);
+ }
+
+ this.fire('move');
+
+ if (options.debounceMoveend) {
+ clearTimeout(this._sizeTimer);
+ this._sizeTimer = setTimeout(L.bind(this.fire, this, 'moveend'), 200);
+ } else {
+ this.fire('moveend');
+ }
+ }
+
+ return this.fire('resize', {
+ oldSize: oldSize,
+ newSize: newSize
+ });
+ },
+
+ // TODO handler.addTo
+ addHandler: function (name, HandlerClass) {
+ if (!HandlerClass) { return this; }
+
+ var handler = this[name] = new HandlerClass(this);
+
+ this._handlers.push(handler);
+
+ if (this.options[name]) {
+ handler.enable();
+ }
+
+ return this;
+ },
+
+ remove: function () {
+ if (this._loaded) {
+ this.fire('unload');
+ }
+
+ this._initEvents('off');
+
+ try {
+ // throws error in IE6-8
+ delete this._container._leaflet;
+ } catch (e) {
+ this._container._leaflet = undefined;
+ }
+
+ this._clearPanes();
+ if (this._clearControlPos) {
+ this._clearControlPos();
+ }
+
+ this._clearHandlers();
+
+ return this;
+ },
+
+
+ // public methods for getting map state
+
+ getCenter: function () { // (Boolean) -> LatLng
+ this._checkIfLoaded();
+
+ if (this._initialCenter && !this._moved()) {
+ return this._initialCenter;
+ }
+ return this.layerPointToLatLng(this._getCenterLayerPoint());
+ },
+
+ getZoom: function () {
+ return this._zoom;
+ },
+
+ getBounds: function () {
+ var bounds = this.getPixelBounds(),
+ sw = this.unproject(bounds.getBottomLeft()),
+ ne = this.unproject(bounds.getTopRight());
+
+ return new L.LatLngBounds(sw, ne);
+ },
+
+ getMinZoom: function () {
+ return this.options.minZoom === undefined ?
+ (this._layersMinZoom === undefined ? 0 : this._layersMinZoom) :
+ this.options.minZoom;
+ },
+
+ getMaxZoom: function () {
+ return this.options.maxZoom === undefined ?
+ (this._layersMaxZoom === undefined ? Infinity : this._layersMaxZoom) :
+ this.options.maxZoom;
+ },
+
+ getBoundsZoom: function (bounds, inside, padding) { // (LatLngBounds[, Boolean, Point]) -> Number
+ bounds = L.latLngBounds(bounds);
+
+ var zoom = this.getMinZoom() - (inside ? 1 : 0),
+ maxZoom = this.getMaxZoom(),
+ size = this.getSize(),
+
+ nw = bounds.getNorthWest(),
+ se = bounds.getSouthEast(),
+
+ zoomNotFound = true,
+ boundsSize;
+
+ padding = L.point(padding || [0, 0]);
+
+ do {
+ zoom++;
+ boundsSize = this.project(se, zoom).subtract(this.project(nw, zoom)).add(padding);
+ zoomNotFound = !inside ? size.contains(boundsSize) : boundsSize.x < size.x || boundsSize.y < size.y;
+
+ } while (zoomNotFound && zoom <= maxZoom);
+
+ if (zoomNotFound && inside) {
+ return null;
+ }
+
+ return inside ? zoom : zoom - 1;
+ },
+
+ getSize: function () {
+ if (!this._size || this._sizeChanged) {
+ this._size = new L.Point(
+ this._container.clientWidth,
+ this._container.clientHeight);
+
+ this._sizeChanged = false;
+ }
+ return this._size.clone();
+ },
+
+ getPixelBounds: function () {
+ var topLeftPoint = this._getTopLeftPoint();
+ return new L.Bounds(topLeftPoint, topLeftPoint.add(this.getSize()));
+ },
+
+ getPixelOrigin: function () {
+ this._checkIfLoaded();
+ return this._initialTopLeftPoint;
+ },
+
+ getPanes: function () {
+ return this._panes;
+ },
+
+ getContainer: function () {
+ return this._container;
+ },
+
+
+ // TODO replace with universal implementation after refactoring projections
+
+ getZoomScale: function (toZoom) {
+ var crs = this.options.crs;
+ return crs.scale(toZoom) / crs.scale(this._zoom);
+ },
+
+ getScaleZoom: function (scale) {
+ return this._zoom + (Math.log(scale) / Math.LN2);
+ },
+
+
+ // conversion methods
+
+ project: function (latlng, zoom) { // (LatLng[, Number]) -> Point
+ zoom = zoom === undefined ? this._zoom : zoom;
+ return this.options.crs.latLngToPoint(L.latLng(latlng), zoom);
+ },
+
+ unproject: function (point, zoom) { // (Point[, Number]) -> LatLng
+ zoom = zoom === undefined ? this._zoom : zoom;
+ return this.options.crs.pointToLatLng(L.point(point), zoom);
+ },
+
+ layerPointToLatLng: function (point) { // (Point)
+ var projectedPoint = L.point(point).add(this.getPixelOrigin());
+ return this.unproject(projectedPoint);
+ },
+
+ latLngToLayerPoint: function (latlng) { // (LatLng)
+ var projectedPoint = this.project(L.latLng(latlng))._round();
+ return projectedPoint._subtract(this.getPixelOrigin());
+ },
+
+ containerPointToLayerPoint: function (point) { // (Point)
+ return L.point(point).subtract(this._getMapPanePos());
+ },
+
+ layerPointToContainerPoint: function (point) { // (Point)
+ return L.point(point).add(this._getMapPanePos());
+ },
+
+ containerPointToLatLng: function (point) {
+ var layerPoint = this.containerPointToLayerPoint(L.point(point));
+ return this.layerPointToLatLng(layerPoint);
+ },
+
+ latLngToContainerPoint: function (latlng) {
+ return this.layerPointToContainerPoint(this.latLngToLayerPoint(L.latLng(latlng)));
+ },
+
+ mouseEventToContainerPoint: function (e) { // (MouseEvent)
+ return L.DomEvent.getMousePosition(e, this._container);
+ },
+
+ mouseEventToLayerPoint: function (e) { // (MouseEvent)
+ return this.containerPointToLayerPoint(this.mouseEventToContainerPoint(e));
+ },
+
+ mouseEventToLatLng: function (e) { // (MouseEvent)
+ return this.layerPointToLatLng(this.mouseEventToLayerPoint(e));
+ },
+
+
+ // map initialization methods
+
+ _initContainer: function (id) {
+ var container = this._container = L.DomUtil.get(id);
+
+ if (!container) {
+ throw new Error('Map container not found.');
+ } else if (container._leaflet) {
+ throw new Error('Map container is already initialized.');
+ }
+
+ container._leaflet = true;
+ },
+
+ _initLayout: function () {
+ var container = this._container;
+
+ L.DomUtil.addClass(container, 'leaflet-container' +
+ (L.Browser.touch ? ' leaflet-touch' : '') +
+ (L.Browser.retina ? ' leaflet-retina' : '') +
+ (L.Browser.ielt9 ? ' leaflet-oldie' : '') +
+ (this.options.fadeAnimation ? ' leaflet-fade-anim' : ''));
+
+ var position = L.DomUtil.getStyle(container, 'position');
+
+ if (position !== 'absolute' && position !== 'relative' && position !== 'fixed') {
+ container.style.position = 'relative';
+ }
+
+ this._initPanes();
+
+ if (this._initControlPos) {
+ this._initControlPos();
+ }
+ },
+
+ _initPanes: function () {
+ var panes = this._panes = {};
+
+ this._mapPane = panes.mapPane = this._createPane('leaflet-map-pane', this._container);
+
+ this._tilePane = panes.tilePane = this._createPane('leaflet-tile-pane', this._mapPane);
+ panes.objectsPane = this._createPane('leaflet-objects-pane', this._mapPane);
+ panes.shadowPane = this._createPane('leaflet-shadow-pane');
+ panes.overlayPane = this._createPane('leaflet-overlay-pane');
+ panes.markerPane = this._createPane('leaflet-marker-pane');
+ panes.popupPane = this._createPane('leaflet-popup-pane');
+
+ var zoomHide = ' leaflet-zoom-hide';
+
+ if (!this.options.markerZoomAnimation) {
+ L.DomUtil.addClass(panes.markerPane, zoomHide);
+ L.DomUtil.addClass(panes.shadowPane, zoomHide);
+ L.DomUtil.addClass(panes.popupPane, zoomHide);
+ }
+ },
+
+ _createPane: function (className, container) {
+ return L.DomUtil.create('div', className, container || this._panes.objectsPane);
+ },
+
+ _clearPanes: function () {
+ this._container.removeChild(this._mapPane);
+ },
+
+ _addLayers: function (layers) {
+ layers = layers ? (L.Util.isArray(layers) ? layers : [layers]) : [];
+
+ for (var i = 0, len = layers.length; i < len; i++) {
+ this.addLayer(layers[i]);
+ }
+ },
+
+
+ // private methods that modify map state
+
+ _resetView: function (center, zoom, preserveMapOffset, afterZoomAnim) {
+
+ var zoomChanged = (this._zoom !== zoom);
+
+ if (!afterZoomAnim) {
+ this.fire('movestart');
+
+ if (zoomChanged) {
+ this.fire('zoomstart');
+ }
+ }
+
+ this._zoom = zoom;
+ this._initialCenter = center;
+
+ this._initialTopLeftPoint = this._getNewTopLeftPoint(center);
+
+ if (!preserveMapOffset) {
+ L.DomUtil.setPosition(this._mapPane, new L.Point(0, 0));
+ } else {
+ this._initialTopLeftPoint._add(this._getMapPanePos());
+ }
+
+ this._tileLayersToLoad = this._tileLayersNum;
+
+ var loading = !this._loaded;
+ this._loaded = true;
+
+ this.fire('viewreset', {hard: !preserveMapOffset});
+
+ if (loading) {
+ this.fire('load');
+ this.eachLayer(this._layerAdd, this);
+ }
+
+ this.fire('move');
+
+ if (zoomChanged || afterZoomAnim) {
+ this.fire('zoomend');
+ }
+
+ this.fire('moveend', {hard: !preserveMapOffset});
+ },
+
+ _rawPanBy: function (offset) {
+ L.DomUtil.setPosition(this._mapPane, this._getMapPanePos().subtract(offset));
+ },
+
+ _getZoomSpan: function () {
+ return this.getMaxZoom() - this.getMinZoom();
+ },
+
+ _updateZoomLevels: function () {
+ var i,
+ minZoom = Infinity,
+ maxZoom = -Infinity,
+ oldZoomSpan = this._getZoomSpan();
+
+ for (i in this._zoomBoundLayers) {
+ var layer = this._zoomBoundLayers[i];
+ if (!isNaN(layer.options.minZoom)) {
+ minZoom = Math.min(minZoom, layer.options.minZoom);
+ }
+ if (!isNaN(layer.options.maxZoom)) {
+ maxZoom = Math.max(maxZoom, layer.options.maxZoom);
+ }
+ }
+
+ if (i === undefined) { // we have no tilelayers
+ this._layersMaxZoom = this._layersMinZoom = undefined;
+ } else {
+ this._layersMaxZoom = maxZoom;
+ this._layersMinZoom = minZoom;
+ }
+
+ if (oldZoomSpan !== this._getZoomSpan()) {
+ this.fire('zoomlevelschange');
+ }
+ },
+
+ _panInsideMaxBounds: function () {
+ this.panInsideBounds(this.options.maxBounds);
+ },
+
+ _checkIfLoaded: function () {
+ if (!this._loaded) {
+ throw new Error('Set map center and zoom first.');
+ }
+ },
+
+ // map events
+
+ _initEvents: function (onOff) {
+ if (!L.DomEvent) { return; }
+
+ onOff = onOff || 'on';
+
+ L.DomEvent[onOff](this._container, 'click', this._onMouseClick, this);
+
+ var events = ['dblclick', 'mousedown', 'mouseup', 'mouseenter',
+ 'mouseleave', 'mousemove', 'contextmenu'],
+ i, len;
+
+ for (i = 0, len = events.length; i < len; i++) {
+ L.DomEvent[onOff](this._container, events[i], this._fireMouseEvent, this);
+ }
+
+ if (this.options.trackResize) {
+ L.DomEvent[onOff](window, 'resize', this._onResize, this);
+ }
+ },
+
+ _onResize: function () {
+ L.Util.cancelAnimFrame(this._resizeRequest);
+ this._resizeRequest = L.Util.requestAnimFrame(
+ function () { this.invalidateSize({debounceMoveend: true}); }, this, false, this._container);
+ },
+
+ _onMouseClick: function (e) {
+ if (!this._loaded || (!e._simulated &&
+ ((this.dragging && this.dragging.moved()) ||
+ (this.boxZoom && this.boxZoom.moved()))) ||
+ L.DomEvent._skipped(e)) { return; }
+
+ this.fire('preclick');
+ this._fireMouseEvent(e);
+ },
+
+ _fireMouseEvent: function (e) {
+ if (!this._loaded || L.DomEvent._skipped(e)) { return; }
+
+ var type = e.type;
+
+ type = (type === 'mouseenter' ? 'mouseover' : (type === 'mouseleave' ? 'mouseout' : type));
+
+ if (!this.hasEventListeners(type)) { return; }
+
+ if (type === 'contextmenu') {
+ L.DomEvent.preventDefault(e);
+ }
+
+ var containerPoint = this.mouseEventToContainerPoint(e),
+ layerPoint = this.containerPointToLayerPoint(containerPoint),
+ latlng = this.layerPointToLatLng(layerPoint);
+
+ this.fire(type, {
+ latlng: latlng,
+ layerPoint: layerPoint,
+ containerPoint: containerPoint,
+ originalEvent: e
+ });
+ },
+
+ _onTileLayerLoad: function () {
+ this._tileLayersToLoad--;
+ if (this._tileLayersNum && !this._tileLayersToLoad) {
+ this.fire('tilelayersload');
+ }
+ },
+
+ _clearHandlers: function () {
+ for (var i = 0, len = this._handlers.length; i < len; i++) {
+ this._handlers[i].disable();
+ }
+ },
+
+ whenReady: function (callback, context) {
+ if (this._loaded) {
+ callback.call(context || this, this);
+ } else {
+ this.on('load', callback, context);
+ }
+ return this;
+ },
+
+ _layerAdd: function (layer) {
+ layer.onAdd(this);
+ this.fire('layeradd', {layer: layer});
+ },
+
+
+ // private methods for getting map state
+
+ _getMapPanePos: function () {
+ return L.DomUtil.getPosition(this._mapPane);
+ },
+
+ _moved: function () {
+ var pos = this._getMapPanePos();
+ return pos && !pos.equals([0, 0]);
+ },
+
+ _getTopLeftPoint: function () {
+ return this.getPixelOrigin().subtract(this._getMapPanePos());
+ },
+
+ _getNewTopLeftPoint: function (center, zoom) {
+ var viewHalf = this.getSize()._divideBy(2);
+ // TODO round on display, not calculation to increase precision?
+ return this.project(center, zoom)._subtract(viewHalf)._round();
+ },
+
+ _latLngToNewLayerPoint: function (latlng, newZoom, newCenter) {
+ var topLeft = this._getNewTopLeftPoint(newCenter, newZoom).add(this._getMapPanePos());
+ return this.project(latlng, newZoom)._subtract(topLeft);
+ },
+
+ // layer point of the current center
+ _getCenterLayerPoint: function () {
+ return this.containerPointToLayerPoint(this.getSize()._divideBy(2));
+ },
+
+ // offset of the specified place to the current center in pixels
+ _getCenterOffset: function (latlng) {
+ return this.latLngToLayerPoint(latlng).subtract(this._getCenterLayerPoint());
+ },
+
+ // adjust center for view to get inside bounds
+ _limitCenter: function (center, zoom, bounds) {
+
+ if (!bounds) { return center; }
+
+ var centerPoint = this.project(center, zoom),
+ viewHalf = this.getSize().divideBy(2),
+ viewBounds = new L.Bounds(centerPoint.subtract(viewHalf), centerPoint.add(viewHalf)),
+ offset = this._getBoundsOffset(viewBounds, bounds, zoom);
+
+ return this.unproject(centerPoint.add(offset), zoom);
+ },
+
+ // adjust offset for view to get inside bounds
+ _limitOffset: function (offset, bounds) {
+ if (!bounds) { return offset; }
+
+ var viewBounds = this.getPixelBounds(),
+ newBounds = new L.Bounds(viewBounds.min.add(offset), viewBounds.max.add(offset));
+
+ return offset.add(this._getBoundsOffset(newBounds, bounds));
+ },
+
+ // returns offset needed for pxBounds to get inside maxBounds at a specified zoom
+ _getBoundsOffset: function (pxBounds, maxBounds, zoom) {
+ var nwOffset = this.project(maxBounds.getNorthWest(), zoom).subtract(pxBounds.min),
+ seOffset = this.project(maxBounds.getSouthEast(), zoom).subtract(pxBounds.max),
+
+ dx = this._rebound(nwOffset.x, -seOffset.x),
+ dy = this._rebound(nwOffset.y, -seOffset.y);
+
+ return new L.Point(dx, dy);
+ },
+
+ _rebound: function (left, right) {
+ return left + right > 0 ?
+ Math.round(left - right) / 2 :
+ Math.max(0, Math.ceil(left)) - Math.max(0, Math.floor(right));
+ },
+
+ _limitZoom: function (zoom) {
+ var min = this.getMinZoom(),
+ max = this.getMaxZoom();
+
+ return Math.max(min, Math.min(max, zoom));
+ }
+});
+
+L.map = function (id, options) {
+ return new L.Map(id, options);
+};
+
+
+/*
+ * Mercator projection that takes into account that the Earth is not a perfect sphere.
+ * Less popular than spherical mercator; used by projections like EPSG:3395.
+ */
+
+L.Projection.Mercator = {
+ MAX_LATITUDE: 85.0840591556,
+
+ R_MINOR: 6356752.314245179,
+ R_MAJOR: 6378137,
+
+ project: function (latlng) { // (LatLng) -> Point
+ var d = L.LatLng.DEG_TO_RAD,
+ max = this.MAX_LATITUDE,
+ lat = Math.max(Math.min(max, latlng.lat), -max),
+ r = this.R_MAJOR,
+ r2 = this.R_MINOR,
+ x = latlng.lng * d * r,
+ y = lat * d,
+ tmp = r2 / r,
+ eccent = Math.sqrt(1.0 - tmp * tmp),
+ con = eccent * Math.sin(y);
+
+ con = Math.pow((1 - con) / (1 + con), eccent * 0.5);
+
+ var ts = Math.tan(0.5 * ((Math.PI * 0.5) - y)) / con;
+ y = -r * Math.log(ts);
+
+ return new L.Point(x, y);
+ },
+
+ unproject: function (point) { // (Point, Boolean) -> LatLng
+ var d = L.LatLng.RAD_TO_DEG,
+ r = this.R_MAJOR,
+ r2 = this.R_MINOR,
+ lng = point.x * d / r,
+ tmp = r2 / r,
+ eccent = Math.sqrt(1 - (tmp * tmp)),
+ ts = Math.exp(- point.y / r),
+ phi = (Math.PI / 2) - 2 * Math.atan(ts),
+ numIter = 15,
+ tol = 1e-7,
+ i = numIter,
+ dphi = 0.1,
+ con;
+
+ while ((Math.abs(dphi) > tol) && (--i > 0)) {
+ con = eccent * Math.sin(phi);
+ dphi = (Math.PI / 2) - 2 * Math.atan(ts *
+ Math.pow((1.0 - con) / (1.0 + con), 0.5 * eccent)) - phi;
+ phi += dphi;
+ }
+
+ return new L.LatLng(phi * d, lng);
+ }
+};
+
+
+
+L.CRS.EPSG3395 = L.extend({}, L.CRS, {
+ code: 'EPSG:3395',
+
+ projection: L.Projection.Mercator,
+
+ transformation: (function () {
+ var m = L.Projection.Mercator,
+ r = m.R_MAJOR,
+ scale = 0.5 / (Math.PI * r);
+
+ return new L.Transformation(scale, 0.5, -scale, 0.5);
+ }())
+});
+
+
+/*
+ * L.TileLayer is used for standard xyz-numbered tile layers.
+ */
+
+L.TileLayer = L.Class.extend({
+ includes: L.Mixin.Events,
+
+ options: {
+ minZoom: 0,
+ maxZoom: 18,
+ tileSize: 256,
+ subdomains: 'abc',
+ errorTileUrl: '',
+ attribution: '',
+ zoomOffset: 0,
+ opacity: 1,
+ /*
+ maxNativeZoom: null,
+ zIndex: null,
+ tms: false,
+ continuousWorld: false,
+ noWrap: false,
+ zoomReverse: false,
+ detectRetina: false,
+ reuseTiles: false,
+ bounds: false,
+ */
+ unloadInvisibleTiles: L.Browser.mobile,
+ updateWhenIdle: L.Browser.mobile
+ },
+
+ initialize: function (url, options) {
+ options = L.setOptions(this, options);
+
+ // detecting retina displays, adjusting tileSize and zoom levels
+ if (options.detectRetina && L.Browser.retina && options.maxZoom > 0) {
+
+ options.tileSize = Math.floor(options.tileSize / 2);
+ options.zoomOffset++;
+
+ if (options.minZoom > 0) {
+ options.minZoom--;
+ }
+ this.options.maxZoom--;
+ }
+
+ if (options.bounds) {
+ options.bounds = L.latLngBounds(options.bounds);
+ }
+
+ this._url = url;
+
+ var subdomains = this.options.subdomains;
+
+ if (typeof subdomains === 'string') {
+ this.options.subdomains = subdomains.split('');
+ }
+ },
+
+ onAdd: function (map) {
+ this._map = map;
+ this._animated = map._zoomAnimated;
+
+ // create a container div for tiles
+ this._initContainer();
+
+ // set up events
+ map.on({
+ 'viewreset': this._reset,
+ 'moveend': this._update
+ }, this);
+
+ if (this._animated) {
+ map.on({
+ 'zoomanim': this._animateZoom,
+ 'zoomend': this._endZoomAnim
+ }, this);
+ }
+
+ if (!this.options.updateWhenIdle) {
+ this._limitedUpdate = L.Util.limitExecByInterval(this._update, 150, this);
+ map.on('move', this._limitedUpdate, this);
+ }
+
+ this._reset();
+ this._update();
+ },
+
+ addTo: function (map) {
+ map.addLayer(this);
+ return this;
+ },
+
+ onRemove: function (map) {
+ this._container.parentNode.removeChild(this._container);
+
+ map.off({
+ 'viewreset': this._reset,
+ 'moveend': this._update
+ }, this);
+
+ if (this._animated) {
+ map.off({
+ 'zoomanim': this._animateZoom,
+ 'zoomend': this._endZoomAnim
+ }, this);
+ }
+
+ if (!this.options.updateWhenIdle) {
+ map.off('move', this._limitedUpdate, this);
+ }
+
+ this._container = null;
+ this._map = null;
+ },
+
+ bringToFront: function () {
+ var pane = this._map._panes.tilePane;
+
+ if (this._container) {
+ pane.appendChild(this._container);
+ this._setAutoZIndex(pane, Math.max);
+ }
+
+ return this;
+ },
+
+ bringToBack: function () {
+ var pane = this._map._panes.tilePane;
+
+ if (this._container) {
+ pane.insertBefore(this._container, pane.firstChild);
+ this._setAutoZIndex(pane, Math.min);
+ }
+
+ return this;
+ },
+
+ getAttribution: function () {
+ return this.options.attribution;
+ },
+
+ getContainer: function () {
+ return this._container;
+ },
+
+ setOpacity: function (opacity) {
+ this.options.opacity = opacity;
+
+ if (this._map) {
+ this._updateOpacity();
+ }
+
+ return this;
+ },
+
+ setZIndex: function (zIndex) {
+ this.options.zIndex = zIndex;
+ this._updateZIndex();
+
+ return this;
+ },
+
+ setUrl: function (url, noRedraw) {
+ this._url = url;
+
+ if (!noRedraw) {
+ this.redraw();
+ }
+
+ return this;
+ },
+
+ redraw: function () {
+ if (this._map) {
+ this._reset({hard: true});
+ this._update();
+ }
+ return this;
+ },
+
+ _updateZIndex: function () {
+ if (this._container && this.options.zIndex !== undefined) {
+ this._container.style.zIndex = this.options.zIndex;
+ }
+ },
+
+ _setAutoZIndex: function (pane, compare) {
+
+ var layers = pane.children,
+ edgeZIndex = -compare(Infinity, -Infinity), // -Infinity for max, Infinity for min
+ zIndex, i, len;
+
+ for (i = 0, len = layers.length; i < len; i++) {
+
+ if (layers[i] !== this._container) {
+ zIndex = parseInt(layers[i].style.zIndex, 10);
+
+ if (!isNaN(zIndex)) {
+ edgeZIndex = compare(edgeZIndex, zIndex);
+ }
+ }
+ }
+
+ this.options.zIndex = this._container.style.zIndex =
+ (isFinite(edgeZIndex) ? edgeZIndex : 0) + compare(1, -1);
+ },
+
+ _updateOpacity: function () {
+ var i,
+ tiles = this._tiles;
+
+ if (L.Browser.ielt9) {
+ for (i in tiles) {
+ L.DomUtil.setOpacity(tiles[i], this.options.opacity);
+ }
+ } else {
+ L.DomUtil.setOpacity(this._container, this.options.opacity);
+ }
+ },
+
+ _initContainer: function () {
+ var tilePane = this._map._panes.tilePane;
+
+ if (!this._container) {
+ this._container = L.DomUtil.create('div', 'leaflet-layer');
+
+ this._updateZIndex();
+
+ if (this._animated) {
+ var className = 'leaflet-tile-container';
+
+ this._bgBuffer = L.DomUtil.create('div', className, this._container);
+ this._tileContainer = L.DomUtil.create('div', className, this._container);
+
+ } else {
+ this._tileContainer = this._container;
+ }
+
+ tilePane.appendChild(this._container);
+
+ if (this.options.opacity < 1) {
+ this._updateOpacity();
+ }
+ }
+ },
+
+ _reset: function (e) {
+ for (var key in this._tiles) {
+ this.fire('tileunload', {tile: this._tiles[key]});
+ }
+
+ this._tiles = {};
+ this._tilesToLoad = 0;
+
+ if (this.options.reuseTiles) {
+ this._unusedTiles = [];
+ }
+
+ this._tileContainer.innerHTML = '';
+
+ if (this._animated && e && e.hard) {
+ this._clearBgBuffer();
+ }
+
+ this._initContainer();
+ },
+
+ _getTileSize: function () {
+ var map = this._map,
+ zoom = map.getZoom() + this.options.zoomOffset,
+ zoomN = this.options.maxNativeZoom,
+ tileSize = this.options.tileSize;
+
+ if (zoomN && zoom > zoomN) {
+ tileSize = Math.round(map.getZoomScale(zoom) / map.getZoomScale(zoomN) * tileSize);
+ }
+
+ return tileSize;
+ },
+
+ _update: function () {
+
+ if (!this._map) { return; }
+
+ var map = this._map,
+ bounds = map.getPixelBounds(),
+ zoom = map.getZoom(),
+ tileSize = this._getTileSize();
+
+ if (zoom > this.options.maxZoom || zoom < this.options.minZoom) {
+ return;
+ }
+
+ var tileBounds = L.bounds(
+ bounds.min.divideBy(tileSize)._floor(),
+ bounds.max.divideBy(tileSize)._floor());
+
+ this._addTilesFromCenterOut(tileBounds);
+
+ if (this.options.unloadInvisibleTiles || this.options.reuseTiles) {
+ this._removeOtherTiles(tileBounds);
+ }
+ },
+
+ _addTilesFromCenterOut: function (bounds) {
+ var queue = [],
+ center = bounds.getCenter();
+
+ var j, i, point;
+
+ for (j = bounds.min.y; j <= bounds.max.y; j++) {
+ for (i = bounds.min.x; i <= bounds.max.x; i++) {
+ point = new L.Point(i, j);
+
+ if (this._tileShouldBeLoaded(point)) {
+ queue.push(point);
+ }
+ }
+ }
+
+ var tilesToLoad = queue.length;
+
+ if (tilesToLoad === 0) { return; }
+
+ // load tiles in order of their distance to center
+ queue.sort(function (a, b) {
+ return a.distanceTo(center) - b.distanceTo(center);
+ });
+
+ var fragment = document.createDocumentFragment();
+
+ // if its the first batch of tiles to load
+ if (!this._tilesToLoad) {
+ this.fire('loading');
+ }
+
+ this._tilesToLoad += tilesToLoad;
+
+ for (i = 0; i < tilesToLoad; i++) {
+ this._addTile(queue[i], fragment);
+ }
+
+ this._tileContainer.appendChild(fragment);
+ },
+
+ _tileShouldBeLoaded: function (tilePoint) {
+ if ((tilePoint.x + ':' + tilePoint.y) in this._tiles) {
+ return false; // already loaded
+ }
+
+ var options = this.options;
+
+ if (!options.continuousWorld) {
+ var limit = this._getWrapTileNum();
+
+ // don't load if exceeds world bounds
+ if ((options.noWrap && (tilePoint.x < 0 || tilePoint.x >= limit.x)) ||
+ tilePoint.y < 0 || tilePoint.y >= limit.y) { return false; }
+ }
+
+ if (options.bounds) {
+ var tileSize = this._getTileSize(),
+ nwPoint = tilePoint.multiplyBy(tileSize),
+ sePoint = nwPoint.add([tileSize, tileSize]),
+ nw = this._map.unproject(nwPoint),
+ se = this._map.unproject(sePoint);
+
+ // TODO temporary hack, will be removed after refactoring projections
+ // https://github.com/Leaflet/Leaflet/issues/1618
+ if (!options.continuousWorld && !options.noWrap) {
+ nw = nw.wrap();
+ se = se.wrap();
+ }
+
+ if (!options.bounds.intersects([nw, se])) { return false; }
+ }
+
+ return true;
+ },
+
+ _removeOtherTiles: function (bounds) {
+ var kArr, x, y, key;
+
+ for (key in this._tiles) {
+ kArr = key.split(':');
+ x = parseInt(kArr[0], 10);
+ y = parseInt(kArr[1], 10);
+
+ // remove tile if it's out of bounds
+ if (x < bounds.min.x || x > bounds.max.x || y < bounds.min.y || y > bounds.max.y) {
+ this._removeTile(key);
+ }
+ }
+ },
+
+ _removeTile: function (key) {
+ var tile = this._tiles[key];
+
+ this.fire('tileunload', {tile: tile, url: tile.src});
+
+ if (this.options.reuseTiles) {
+ L.DomUtil.removeClass(tile, 'leaflet-tile-loaded');
+ this._unusedTiles.push(tile);
+
+ } else if (tile.parentNode === this._tileContainer) {
+ this._tileContainer.removeChild(tile);
+ }
+
+ // for https://github.com/CloudMade/Leaflet/issues/137
+ if (!L.Browser.android) {
+ tile.onload = null;
+ tile.src = L.Util.emptyImageUrl;
+ }
+
+ delete this._tiles[key];
+ },
+
+ _addTile: function (tilePoint, container) {
+ var tilePos = this._getTilePos(tilePoint);
+
+ // get unused tile - or create a new tile
+ var tile = this._getTile();
+
+ /*
+ Chrome 20 layouts much faster with top/left (verify with timeline, frames)
+ Android 4 browser has display issues with top/left and requires transform instead
+ (other browsers don't currently care) - see debug/hacks/jitter.html for an example
+ */
+ L.DomUtil.setPosition(tile, tilePos, L.Browser.chrome);
+
+ this._tiles[tilePoint.x + ':' + tilePoint.y] = tile;
+
+ this._loadTile(tile, tilePoint);
+
+ if (tile.parentNode !== this._tileContainer) {
+ container.appendChild(tile);
+ }
+ },
+
+ _getZoomForUrl: function () {
+
+ var options = this.options,
+ zoom = this._map.getZoom();
+
+ if (options.zoomReverse) {
+ zoom = options.maxZoom - zoom;
+ }
+
+ zoom += options.zoomOffset;
+
+ return options.maxNativeZoom ? Math.min(zoom, options.maxNativeZoom) : zoom;
+ },
+
+ _getTilePos: function (tilePoint) {
+ var origin = this._map.getPixelOrigin(),
+ tileSize = this._getTileSize();
+
+ return tilePoint.multiplyBy(tileSize).subtract(origin);
+ },
+
+ // image-specific code (override to implement e.g. Canvas or SVG tile layer)
+
+ getTileUrl: function (tilePoint) {
+ return L.Util.template(this._url, L.extend({
+ s: this._getSubdomain(tilePoint),
+ z: tilePoint.z,
+ x: tilePoint.x,
+ y: tilePoint.y
+ }, this.options));
+ },
+
+ _getWrapTileNum: function () {
+ var crs = this._map.options.crs,
+ size = crs.getSize(this._map.getZoom());
+ return size.divideBy(this._getTileSize())._floor();
+ },
+
+ _adjustTilePoint: function (tilePoint) {
+
+ var limit = this._getWrapTileNum();
+
+ // wrap tile coordinates
+ if (!this.options.continuousWorld && !this.options.noWrap) {
+ tilePoint.x = ((tilePoint.x % limit.x) + limit.x) % limit.x;
+ }
+
+ if (this.options.tms) {
+ tilePoint.y = limit.y - tilePoint.y - 1;
+ }
+
+ tilePoint.z = this._getZoomForUrl();
+ },
+
+ _getSubdomain: function (tilePoint) {
+ var index = Math.abs(tilePoint.x + tilePoint.y) % this.options.subdomains.length;
+ return this.options.subdomains[index];
+ },
+
+ _getTile: function () {
+ if (this.options.reuseTiles && this._unusedTiles.length > 0) {
+ var tile = this._unusedTiles.pop();
+ this._resetTile(tile);
+ return tile;
+ }
+ return this._createTile();
+ },
+
+ // Override if data stored on a tile needs to be cleaned up before reuse
+ _resetTile: function (/*tile*/) {},
+
+ _createTile: function () {
+ var tile = L.DomUtil.create('img', 'leaflet-tile');
+ tile.style.width = tile.style.height = this._getTileSize() + 'px';
+ tile.galleryimg = 'no';
+
+ tile.onselectstart = tile.onmousemove = L.Util.falseFn;
+
+ if (L.Browser.ielt9 && this.options.opacity !== undefined) {
+ L.DomUtil.setOpacity(tile, this.options.opacity);
+ }
+ // without this hack, tiles disappear after zoom on Chrome for Android
+ // https://github.com/Leaflet/Leaflet/issues/2078
+ if (L.Browser.mobileWebkit3d) {
+ tile.style.WebkitBackfaceVisibility = 'hidden';
+ }
+ return tile;
+ },
+
+ _loadTile: function (tile, tilePoint) {
+ tile._layer = this;
+ tile.onload = this._tileOnLoad;
+ tile.onerror = this._tileOnError;
+
+ this._adjustTilePoint(tilePoint);
+ tile.src = this.getTileUrl(tilePoint);
+
+ this.fire('tileloadstart', {
+ tile: tile,
+ url: tile.src
+ });
+ },
+
+ _tileLoaded: function () {
+ this._tilesToLoad--;
+
+ if (this._animated) {
+ L.DomUtil.addClass(this._tileContainer, 'leaflet-zoom-animated');
+ }
+
+ if (!this._tilesToLoad) {
+ this.fire('load');
+
+ if (this._animated) {
+ // clear scaled tiles after all new tiles are loaded (for performance)
+ clearTimeout(this._clearBgBufferTimer);
+ this._clearBgBufferTimer = setTimeout(L.bind(this._clearBgBuffer, this), 500);
+ }
+ }
+ },
+
+ _tileOnLoad: function () {
+ var layer = this._layer;
+
+ //Only if we are loading an actual image
+ if (this.src !== L.Util.emptyImageUrl) {
+ L.DomUtil.addClass(this, 'leaflet-tile-loaded');
+
+ layer.fire('tileload', {
+ tile: this,
+ url: this.src
+ });
+ }
+
+ layer._tileLoaded();
+ },
+
+ _tileOnError: function () {
+ var layer = this._layer;
+
+ layer.fire('tileerror', {
+ tile: this,
+ url: this.src
+ });
+
+ var newUrl = layer.options.errorTileUrl;
+ if (newUrl) {
+ this.src = newUrl;
+ }
+
+ layer._tileLoaded();
+ }
+});
+
+L.tileLayer = function (url, options) {
+ return new L.TileLayer(url, options);
+};
+
+
+/*
+ * L.TileLayer.WMS is used for putting WMS tile layers on the map.
+ */
+
+L.TileLayer.WMS = L.TileLayer.extend({
+
+ defaultWmsParams: {
+ service: 'WMS',
+ request: 'GetMap',
+ version: '1.1.1',
+ layers: '',
+ styles: '',
+ format: 'image/jpeg',
+ transparent: false
+ },
+
+ initialize: function (url, options) { // (String, Object)
+
+ this._url = url;
+
+ var wmsParams = L.extend({}, this.defaultWmsParams),
+ tileSize = options.tileSize || this.options.tileSize;
+
+ if (options.detectRetina && L.Browser.retina) {
+ wmsParams.width = wmsParams.height = tileSize * 2;
+ } else {
+ wmsParams.width = wmsParams.height = tileSize;
+ }
+
+ for (var i in options) {
+ // all keys that are not TileLayer options go to WMS params
+ if (!this.options.hasOwnProperty(i) && i !== 'crs') {
+ wmsParams[i] = options[i];
+ }
+ }
+
+ this.wmsParams = wmsParams;
+
+ L.setOptions(this, options);
+ },
+
+ onAdd: function (map) {
+
+ this._crs = this.options.crs || map.options.crs;
+
+ this._wmsVersion = parseFloat(this.wmsParams.version);
+
+ var projectionKey = this._wmsVersion >= 1.3 ? 'crs' : 'srs';
+ this.wmsParams[projectionKey] = this._crs.code;
+
+ L.TileLayer.prototype.onAdd.call(this, map);
+ },
+
+ getTileUrl: function (tilePoint) { // (Point, Number) -> String
+
+ var map = this._map,
+ tileSize = this.options.tileSize,
+
+ nwPoint = tilePoint.multiplyBy(tileSize),
+ sePoint = nwPoint.add([tileSize, tileSize]),
+
+ nw = this._crs.project(map.unproject(nwPoint, tilePoint.z)),
+ se = this._crs.project(map.unproject(sePoint, tilePoint.z)),
+ bbox = this._wmsVersion >= 1.3 && this._crs === L.CRS.EPSG4326 ?
+ [se.y, nw.x, nw.y, se.x].join(',') :
+ [nw.x, se.y, se.x, nw.y].join(','),
+
+ url = L.Util.template(this._url, {s: this._getSubdomain(tilePoint)});
+
+ return url + L.Util.getParamString(this.wmsParams, url, true) + '&BBOX=' + bbox;
+ },
+
+ setParams: function (params, noRedraw) {
+
+ L.extend(this.wmsParams, params);
+
+ if (!noRedraw) {
+ this.redraw();
+ }
+
+ return this;
+ }
+});
+
+L.tileLayer.wms = function (url, options) {
+ return new L.TileLayer.WMS(url, options);
+};
+
+
+/*
+ * L.TileLayer.Canvas is a class that you can use as a base for creating
+ * dynamically drawn Canvas-based tile layers.
+ */
+
+L.TileLayer.Canvas = L.TileLayer.extend({
+ options: {
+ async: false
+ },
+
+ initialize: function (options) {
+ L.setOptions(this, options);
+ },
+
+ redraw: function () {
+ if (this._map) {
+ this._reset({hard: true});
+ this._update();
+ }
+
+ for (var i in this._tiles) {
+ this._redrawTile(this._tiles[i]);
+ }
+ return this;
+ },
+
+ _redrawTile: function (tile) {
+ this.drawTile(tile, tile._tilePoint, this._map._zoom);
+ },
+
+ _createTile: function () {
+ var tile = L.DomUtil.create('canvas', 'leaflet-tile');
+ tile.width = tile.height = this.options.tileSize;
+ tile.onselectstart = tile.onmousemove = L.Util.falseFn;
+ return tile;
+ },
+
+ _loadTile: function (tile, tilePoint) {
+ tile._layer = this;
+ tile._tilePoint = tilePoint;
+
+ this._redrawTile(tile);
+
+ if (!this.options.async) {
+ this.tileDrawn(tile);
+ }
+ },
+
+ drawTile: function (/*tile, tilePoint*/) {
+ // override with rendering code
+ },
+
+ tileDrawn: function (tile) {
+ this._tileOnLoad.call(tile);
+ }
+});
+
+
+L.tileLayer.canvas = function (options) {
+ return new L.TileLayer.Canvas(options);
+};
+
+
+/*
+ * L.ImageOverlay is used to overlay images over the map (to specific geographical bounds).
+ */
+
+L.ImageOverlay = L.Class.extend({
+ includes: L.Mixin.Events,
+
+ options: {
+ opacity: 1
+ },
+
+ initialize: function (url, bounds, options) { // (String, LatLngBounds, Object)
+ this._url = url;
+ this._bounds = L.latLngBounds(bounds);
+
+ L.setOptions(this, options);
+ },
+
+ onAdd: function (map) {
+ this._map = map;
+
+ if (!this._image) {
+ this._initImage();
+ }
+
+ map._panes.overlayPane.appendChild(this._image);
+
+ map.on('viewreset', this._reset, this);
+
+ if (map.options.zoomAnimation && L.Browser.any3d) {
+ map.on('zoomanim', this._animateZoom, this);
+ }
+
+ this._reset();
+ },
+
+ onRemove: function (map) {
+ map.getPanes().overlayPane.removeChild(this._image);
+
+ map.off('viewreset', this._reset, this);
+
+ if (map.options.zoomAnimation) {
+ map.off('zoomanim', this._animateZoom, this);
+ }
+ },
+
+ addTo: function (map) {
+ map.addLayer(this);
+ return this;
+ },
+
+ setOpacity: function (opacity) {
+ this.options.opacity = opacity;
+ this._updateOpacity();
+ return this;
+ },
+
+ // TODO remove bringToFront/bringToBack duplication from TileLayer/Path
+ bringToFront: function () {
+ if (this._image) {
+ this._map._panes.overlayPane.appendChild(this._image);
+ }
+ return this;
+ },
+
+ bringToBack: function () {
+ var pane = this._map._panes.overlayPane;
+ if (this._image) {
+ pane.insertBefore(this._image, pane.firstChild);
+ }
+ return this;
+ },
+
+ setUrl: function (url) {
+ this._url = url;
+ this._image.src = this._url;
+ },
+
+ getAttribution: function () {
+ return this.options.attribution;
+ },
+
+ _initImage: function () {
+ this._image = L.DomUtil.create('img', 'leaflet-image-layer');
+
+ if (this._map.options.zoomAnimation && L.Browser.any3d) {
+ L.DomUtil.addClass(this._image, 'leaflet-zoom-animated');
+ } else {
+ L.DomUtil.addClass(this._image, 'leaflet-zoom-hide');
+ }
+
+ this._updateOpacity();
+
+ //TODO createImage util method to remove duplication
+ L.extend(this._image, {
+ galleryimg: 'no',
+ onselectstart: L.Util.falseFn,
+ onmousemove: L.Util.falseFn,
+ onload: L.bind(this._onImageLoad, this),
+ src: this._url
+ });
+ },
+
+ _animateZoom: function (e) {
+ var map = this._map,
+ image = this._image,
+ scale = map.getZoomScale(e.zoom),
+ nw = this._bounds.getNorthWest(),
+ se = this._bounds.getSouthEast(),
+
+ topLeft = map._latLngToNewLayerPoint(nw, e.zoom, e.center),
+ size = map._latLngToNewLayerPoint(se, e.zoom, e.center)._subtract(topLeft),
+ origin = topLeft._add(size._multiplyBy((1 / 2) * (1 - 1 / scale)));
+
+ image.style[L.DomUtil.TRANSFORM] =
+ L.DomUtil.getTranslateString(origin) + ' scale(' + scale + ') ';
+ },
+
+ _reset: function () {
+ var image = this._image,
+ topLeft = this._map.latLngToLayerPoint(this._bounds.getNorthWest()),
+ size = this._map.latLngToLayerPoint(this._bounds.getSouthEast())._subtract(topLeft);
+
+ L.DomUtil.setPosition(image, topLeft);
+
+ image.style.width = size.x + 'px';
+ image.style.height = size.y + 'px';
+ },
+
+ _onImageLoad: function () {
+ this.fire('load');
+ },
+
+ _updateOpacity: function () {
+ L.DomUtil.setOpacity(this._image, this.options.opacity);
+ }
+});
+
+L.imageOverlay = function (url, bounds, options) {
+ return new L.ImageOverlay(url, bounds, options);
+};
+
+
+/*
+ * L.Icon is an image-based icon class that you can use with L.Marker for custom markers.
+ */
+
+L.Icon = L.Class.extend({
+ options: {
+ /*
+ iconUrl: (String) (required)
+ iconRetinaUrl: (String) (optional, used for retina devices if detected)
+ iconSize: (Point) (can be set through CSS)
+ iconAnchor: (Point) (centered by default, can be set in CSS with negative margins)
+ popupAnchor: (Point) (if not specified, popup opens in the anchor point)
+ shadowUrl: (String) (no shadow by default)
+ shadowRetinaUrl: (String) (optional, used for retina devices if detected)
+ shadowSize: (Point)
+ shadowAnchor: (Point)
+ */
+ className: ''
+ },
+
+ initialize: function (options) {
+ L.setOptions(this, options);
+ },
+
+ createIcon: function (oldIcon) {
+ return this._createIcon('icon', oldIcon);
+ },
+
+ createShadow: function (oldIcon) {
+ return this._createIcon('shadow', oldIcon);
+ },
+
+ _createIcon: function (name, oldIcon) {
+ var src = this._getIconUrl(name);
+
+ if (!src) {
+ if (name === 'icon') {
+ throw new Error('iconUrl not set in Icon options (see the docs).');
+ }
+ return null;
+ }
+
+ var img;
+ if (!oldIcon || oldIcon.tagName !== 'IMG') {
+ img = this._createImg(src);
+ } else {
+ img = this._createImg(src, oldIcon);
+ }
+ this._setIconStyles(img, name);
+
+ return img;
+ },
+
+ _setIconStyles: function (img, name) {
+ var options = this.options,
+ size = L.point(options[name + 'Size']),
+ anchor;
+
+ if (name === 'shadow') {
+ anchor = L.point(options.shadowAnchor || options.iconAnchor);
+ } else {
+ anchor = L.point(options.iconAnchor);
+ }
+
+ if (!anchor && size) {
+ anchor = size.divideBy(2, true);
+ }
+
+ img.className = 'leaflet-marker-' + name + ' ' + options.className;
+
+ if (anchor) {
+ img.style.marginLeft = (-anchor.x) + 'px';
+ img.style.marginTop = (-anchor.y) + 'px';
+ }
+
+ if (size) {
+ img.style.width = size.x + 'px';
+ img.style.height = size.y + 'px';
+ }
+ },
+
+ _createImg: function (src, el) {
+ el = el || document.createElement('img');
+ el.src = src;
+ return el;
+ },
+
+ _getIconUrl: function (name) {
+ if (L.Browser.retina && this.options[name + 'RetinaUrl']) {
+ return this.options[name + 'RetinaUrl'];
+ }
+ return this.options[name + 'Url'];
+ }
+});
+
+L.icon = function (options) {
+ return new L.Icon(options);
+};
+
+
+/*
+ * L.Icon.Default is the blue marker icon used by default in Leaflet.
+ */
+
+L.Icon.Default = L.Icon.extend({
+
+ options: {
+ iconSize: [25, 41],
+ iconAnchor: [12, 41],
+ popupAnchor: [1, -34],
+
+ shadowSize: [41, 41]
+ },
+
+ _getIconUrl: function (name) {
+ var key = name + 'Url';
+
+ if (this.options[key]) {
+ return this.options[key];
+ }
+
+ if (L.Browser.retina && name === 'icon') {
+ name += '-2x';
+ }
+
+ var path = L.Icon.Default.imagePath;
+
+ if (!path) {
+ throw new Error('Couldn\'t autodetect L.Icon.Default.imagePath, set it manually.');
+ }
+
+ return path + '/marker-' + name + '.png';
+ }
+});
+
+L.Icon.Default.imagePath = (function () {
+ var scripts = document.getElementsByTagName('script'),
+ leafletRe = /[\/^]leaflet[\-\._]?([\w\-\._]*)\.js\??/;
+
+ var i, len, src, matches, path;
+
+ for (i = 0, len = scripts.length; i < len; i++) {
+ src = scripts[i].src;
+ matches = src.match(leafletRe);
+
+ if (matches) {
+ path = src.split(leafletRe)[0];
+ return (path ? path + '/' : '') + 'images';
+ }
+ }
+}());
+
+
+/*
+ * L.Marker is used to display clickable/draggable icons on the map.
+ */
+
+L.Marker = L.Class.extend({
+
+ includes: L.Mixin.Events,
+
+ options: {
+ icon: new L.Icon.Default(),
+ title: '',
+ alt: '',
+ clickable: true,
+ draggable: false,
+ keyboard: true,
+ zIndexOffset: 0,
+ opacity: 1,
+ riseOnHover: false,
+ riseOffset: 250
+ },
+
+ initialize: function (latlng, options) {
+ L.setOptions(this, options);
+ this._latlng = L.latLng(latlng);
+ },
+
+ onAdd: function (map) {
+ this._map = map;
+
+ map.on('viewreset', this.update, this);
+
+ this._initIcon();
+ this.update();
+ this.fire('add');
+
+ if (map.options.zoomAnimation && map.options.markerZoomAnimation) {
+ map.on('zoomanim', this._animateZoom, this);
+ }
+ },
+
+ addTo: function (map) {
+ map.addLayer(this);
+ return this;
+ },
+
+ onRemove: function (map) {
+ if (this.dragging) {
+ this.dragging.disable();
+ }
+
+ this._removeIcon();
+ this._removeShadow();
+
+ this.fire('remove');
+
+ map.off({
+ 'viewreset': this.update,
+ 'zoomanim': this._animateZoom
+ }, this);
+
+ this._map = null;
+ },
+
+ getLatLng: function () {
+ return this._latlng;
+ },
+
+ setLatLng: function (latlng) {
+ this._latlng = L.latLng(latlng);
+
+ this.update();
+
+ return this.fire('move', { latlng: this._latlng });
+ },
+
+ setZIndexOffset: function (offset) {
+ this.options.zIndexOffset = offset;
+ this.update();
+
+ return this;
+ },
+
+ setIcon: function (icon) {
+
+ this.options.icon = icon;
+
+ if (this._map) {
+ this._initIcon();
+ this.update();
+ }
+
+ if (this._popup) {
+ this.bindPopup(this._popup);
+ }
+
+ return this;
+ },
+
+ update: function () {
+ if (this._icon) {
+ this._setPos(this._map.latLngToLayerPoint(this._latlng).round());
+ }
+ return this;
+ },
+
+ _initIcon: function () {
+ var options = this.options,
+ map = this._map,
+ animation = (map.options.zoomAnimation && map.options.markerZoomAnimation),
+ classToAdd = animation ? 'leaflet-zoom-animated' : 'leaflet-zoom-hide';
+
+ var icon = options.icon.createIcon(this._icon),
+ addIcon = false;
+
+ // if we're not reusing the icon, remove the old one and init new one
+ if (icon !== this._icon) {
+ if (this._icon) {
+ this._removeIcon();
+ }
+ addIcon = true;
+
+ if (options.title) {
+ icon.title = options.title;
+ }
+
+ if (options.alt) {
+ icon.alt = options.alt;
+ }
+ }
+
+ L.DomUtil.addClass(icon, classToAdd);
+
+ if (options.keyboard) {
+ icon.tabIndex = '0';
+ }
+
+ this._icon = icon;
+
+ this._initInteraction();
+
+ if (options.riseOnHover) {
+ L.DomEvent
+ .on(icon, 'mouseover', this._bringToFront, this)
+ .on(icon, 'mouseout', this._resetZIndex, this);
+ }
+
+ var newShadow = options.icon.createShadow(this._shadow),
+ addShadow = false;
+
+ if (newShadow !== this._shadow) {
+ this._removeShadow();
+ addShadow = true;
+ }
+
+ if (newShadow) {
+ L.DomUtil.addClass(newShadow, classToAdd);
+ }
+ this._shadow = newShadow;
+
+
+ if (options.opacity < 1) {
+ this._updateOpacity();
+ }
+
+
+ var panes = this._map._panes;
+
+ if (addIcon) {
+ panes.markerPane.appendChild(this._icon);
+ }
+
+ if (newShadow && addShadow) {
+ panes.shadowPane.appendChild(this._shadow);
+ }
+ },
+
+ _removeIcon: function () {
+ if (this.options.riseOnHover) {
+ L.DomEvent
+ .off(this._icon, 'mouseover', this._bringToFront)
+ .off(this._icon, 'mouseout', this._resetZIndex);
+ }
+
+ this._map._panes.markerPane.removeChild(this._icon);
+
+ this._icon = null;
+ },
+
+ _removeShadow: function () {
+ if (this._shadow) {
+ this._map._panes.shadowPane.removeChild(this._shadow);
+ }
+ this._shadow = null;
+ },
+
+ _setPos: function (pos) {
+ L.DomUtil.setPosition(this._icon, pos);
+
+ if (this._shadow) {
+ L.DomUtil.setPosition(this._shadow, pos);
+ }
+
+ this._zIndex = pos.y + this.options.zIndexOffset;
+
+ this._resetZIndex();
+ },
+
+ _updateZIndex: function (offset) {
+ this._icon.style.zIndex = this._zIndex + offset;
+ },
+
+ _animateZoom: function (opt) {
+ var pos = this._map._latLngToNewLayerPoint(this._latlng, opt.zoom, opt.center).round();
+
+ this._setPos(pos);
+ },
+
+ _initInteraction: function () {
+
+ if (!this.options.clickable) { return; }
+
+ // TODO refactor into something shared with Map/Path/etc. to DRY it up
+
+ var icon = this._icon,
+ events = ['dblclick', 'mousedown', 'mouseover', 'mouseout', 'contextmenu'];
+
+ L.DomUtil.addClass(icon, 'leaflet-clickable');
+ L.DomEvent.on(icon, 'click', this._onMouseClick, this);
+ L.DomEvent.on(icon, 'keypress', this._onKeyPress, this);
+
+ for (var i = 0; i < events.length; i++) {
+ L.DomEvent.on(icon, events[i], this._fireMouseEvent, this);
+ }
+
+ if (L.Handler.MarkerDrag) {
+ this.dragging = new L.Handler.MarkerDrag(this);
+
+ if (this.options.draggable) {
+ this.dragging.enable();
+ }
+ }
+ },
+
+ _onMouseClick: function (e) {
+ var wasDragged = this.dragging && this.dragging.moved();
+
+ if (this.hasEventListeners(e.type) || wasDragged) {
+ L.DomEvent.stopPropagation(e);
+ }
+
+ if (wasDragged) { return; }
+
+ if ((!this.dragging || !this.dragging._enabled) && this._map.dragging && this._map.dragging.moved()) { return; }
+
+ this.fire(e.type, {
+ originalEvent: e,
+ latlng: this._latlng
+ });
+ },
+
+ _onKeyPress: function (e) {
+ if (e.keyCode === 13) {
+ this.fire('click', {
+ originalEvent: e,
+ latlng: this._latlng
+ });
+ }
+ },
+
+ _fireMouseEvent: function (e) {
+
+ this.fire(e.type, {
+ originalEvent: e,
+ latlng: this._latlng
+ });
+
+ // TODO proper custom event propagation
+ // this line will always be called if marker is in a FeatureGroup
+ if (e.type === 'contextmenu' && this.hasEventListeners(e.type)) {
+ L.DomEvent.preventDefault(e);
+ }
+ if (e.type !== 'mousedown') {
+ L.DomEvent.stopPropagation(e);
+ } else {
+ L.DomEvent.preventDefault(e);
+ }
+ },
+
+ setOpacity: function (opacity) {
+ this.options.opacity = opacity;
+ if (this._map) {
+ this._updateOpacity();
+ }
+
+ return this;
+ },
+
+ _updateOpacity: function () {
+ L.DomUtil.setOpacity(this._icon, this.options.opacity);
+ if (this._shadow) {
+ L.DomUtil.setOpacity(this._shadow, this.options.opacity);
+ }
+ },
+
+ _bringToFront: function () {
+ this._updateZIndex(this.options.riseOffset);
+ },
+
+ _resetZIndex: function () {
+ this._updateZIndex(0);
+ }
+});
+
+L.marker = function (latlng, options) {
+ return new L.Marker(latlng, options);
+};
+
+
+/*
+ * L.DivIcon is a lightweight HTML-based icon class (as opposed to the image-based L.Icon)
+ * to use with L.Marker.
+ */
+
+L.DivIcon = L.Icon.extend({
+ options: {
+ iconSize: [12, 12], // also can be set through CSS
+ /*
+ iconAnchor: (Point)
+ popupAnchor: (Point)
+ html: (String)
+ bgPos: (Point)
+ */
+ className: 'leaflet-div-icon',
+ html: false
+ },
+
+ createIcon: function (oldIcon) {
+ var div = (oldIcon && oldIcon.tagName === 'DIV') ? oldIcon : document.createElement('div'),
+ options = this.options;
+
+ if (options.html !== false) {
+ div.innerHTML = options.html;
+ } else {
+ div.innerHTML = '';
+ }
+
+ if (options.bgPos) {
+ div.style.backgroundPosition =
+ (-options.bgPos.x) + 'px ' + (-options.bgPos.y) + 'px';
+ }
+
+ this._setIconStyles(div, 'icon');
+ return div;
+ },
+
+ createShadow: function () {
+ return null;
+ }
+});
+
+L.divIcon = function (options) {
+ return new L.DivIcon(options);
+};
+
+
+/*
+ * L.Popup is used for displaying popups on the map.
+ */
+
+L.Map.mergeOptions({
+ closePopupOnClick: true
+});
+
+L.Popup = L.Class.extend({
+ includes: L.Mixin.Events,
+
+ options: {
+ minWidth: 50,
+ maxWidth: 300,
+ // maxHeight: null,
+ autoPan: true,
+ closeButton: true,
+ offset: [0, 7],
+ autoPanPadding: [5, 5],
+ // autoPanPaddingTopLeft: null,
+ // autoPanPaddingBottomRight: null,
+ keepInView: false,
+ className: '',
+ zoomAnimation: true
+ },
+
+ initialize: function (options, source) {
+ L.setOptions(this, options);
+
+ this._source = source;
+ this._animated = L.Browser.any3d && this.options.zoomAnimation;
+ this._isOpen = false;
+ },
+
+ onAdd: function (map) {
+ this._map = map;
+
+ if (!this._container) {
+ this._initLayout();
+ }
+
+ var animFade = map.options.fadeAnimation;
+
+ if (animFade) {
+ L.DomUtil.setOpacity(this._container, 0);
+ }
+ map._panes.popupPane.appendChild(this._container);
+
+ map.on(this._getEvents(), this);
+
+ this.update();
+
+ if (animFade) {
+ L.DomUtil.setOpacity(this._container, 1);
+ }
+
+ this.fire('open');
+
+ map.fire('popupopen', {popup: this});
+
+ if (this._source) {
+ this._source.fire('popupopen', {popup: this});
+ }
+ },
+
+ addTo: function (map) {
+ map.addLayer(this);
+ return this;
+ },
+
+ openOn: function (map) {
+ map.openPopup(this);
+ return this;
+ },
+
+ onRemove: function (map) {
+ map._panes.popupPane.removeChild(this._container);
+
+ L.Util.falseFn(this._container.offsetWidth); // force reflow
+
+ map.off(this._getEvents(), this);
+
+ if (map.options.fadeAnimation) {
+ L.DomUtil.setOpacity(this._container, 0);
+ }
+
+ this._map = null;
+
+ this.fire('close');
+
+ map.fire('popupclose', {popup: this});
+
+ if (this._source) {
+ this._source.fire('popupclose', {popup: this});
+ }
+ },
+
+ getLatLng: function () {
+ return this._latlng;
+ },
+
+ setLatLng: function (latlng) {
+ this._latlng = L.latLng(latlng);
+ if (this._map) {
+ this._updatePosition();
+ this._adjustPan();
+ }
+ return this;
+ },
+
+ getContent: function () {
+ return this._content;
+ },
+
+ setContent: function (content) {
+ this._content = content;
+ this.update();
+ return this;
+ },
+
+ update: function () {
+ if (!this._map) { return; }
+
+ this._container.style.visibility = 'hidden';
+
+ this._updateContent();
+ this._updateLayout();
+ this._updatePosition();
+
+ this._container.style.visibility = '';
+
+ this._adjustPan();
+ },
+
+ _getEvents: function () {
+ var events = {
+ viewreset: this._updatePosition
+ };
+
+ if (this._animated) {
+ events.zoomanim = this._zoomAnimation;
+ }
+ if ('closeOnClick' in this.options ? this.options.closeOnClick : this._map.options.closePopupOnClick) {
+ events.preclick = this._close;
+ }
+ if (this.options.keepInView) {
+ events.moveend = this._adjustPan;
+ }
+
+ return events;
+ },
+
+ _close: function () {
+ if (this._map) {
+ this._map.closePopup(this);
+ }
+ },
+
+ _initLayout: function () {
+ var prefix = 'leaflet-popup',
+ containerClass = prefix + ' ' + this.options.className + ' leaflet-zoom-' +
+ (this._animated ? 'animated' : 'hide'),
+ container = this._container = L.DomUtil.create('div', containerClass),
+ closeButton;
+
+ if (this.options.closeButton) {
+ closeButton = this._closeButton =
+ L.DomUtil.create('a', prefix + '-close-button', container);
+ closeButton.href = '#close';
+ closeButton.innerHTML = '×';
+ L.DomEvent.disableClickPropagation(closeButton);
+
+ L.DomEvent.on(closeButton, 'click', this._onCloseButtonClick, this);
+ }
+
+ var wrapper = this._wrapper =
+ L.DomUtil.create('div', prefix + '-content-wrapper', container);
+ L.DomEvent.disableClickPropagation(wrapper);
+
+ this._contentNode = L.DomUtil.create('div', prefix + '-content', wrapper);
+
+ L.DomEvent.disableScrollPropagation(this._contentNode);
+ L.DomEvent.on(wrapper, 'contextmenu', L.DomEvent.stopPropagation);
+
+ this._tipContainer = L.DomUtil.create('div', prefix + '-tip-container', container);
+ this._tip = L.DomUtil.create('div', prefix + '-tip', this._tipContainer);
+ },
+
+ _updateContent: function () {
+ if (!this._content) { return; }
+
+ if (typeof this._content === 'string') {
+ this._contentNode.innerHTML = this._content;
+ } else {
+ while (this._contentNode.hasChildNodes()) {
+ this._contentNode.removeChild(this._contentNode.firstChild);
+ }
+ this._contentNode.appendChild(this._content);
+ }
+ this.fire('contentupdate');
+ },
+
+ _updateLayout: function () {
+ var container = this._contentNode,
+ style = container.style;
+
+ style.width = '';
+ style.whiteSpace = 'nowrap';
+
+ var width = container.offsetWidth;
+ width = Math.min(width, this.options.maxWidth);
+ width = Math.max(width, this.options.minWidth);
+
+ style.width = (width + 1) + 'px';
+ style.whiteSpace = '';
+
+ style.height = '';
+
+ var height = container.offsetHeight,
+ maxHeight = this.options.maxHeight,
+ scrolledClass = 'leaflet-popup-scrolled';
+
+ if (maxHeight && height > maxHeight) {
+ style.height = maxHeight + 'px';
+ L.DomUtil.addClass(container, scrolledClass);
+ } else {
+ L.DomUtil.removeClass(container, scrolledClass);
+ }
+
+ this._containerWidth = this._container.offsetWidth;
+ },
+
+ _updatePosition: function () {
+ if (!this._map) { return; }
+
+ var pos = this._map.latLngToLayerPoint(this._latlng),
+ animated = this._animated,
+ offset = L.point(this.options.offset);
+
+ if (animated) {
+ L.DomUtil.setPosition(this._container, pos);
+ }
+
+ this._containerBottom = -offset.y - (animated ? 0 : pos.y);
+ this._containerLeft = -Math.round(this._containerWidth / 2) + offset.x + (animated ? 0 : pos.x);
+
+ // bottom position the popup in case the height of the popup changes (images loading etc)
+ this._container.style.bottom = this._containerBottom + 'px';
+ this._container.style.left = this._containerLeft + 'px';
+ },
+
+ _zoomAnimation: function (opt) {
+ var pos = this._map._latLngToNewLayerPoint(this._latlng, opt.zoom, opt.center);
+
+ L.DomUtil.setPosition(this._container, pos);
+ },
+
+ _adjustPan: function () {
+ if (!this.options.autoPan) { return; }
+
+ var map = this._map,
+ containerHeight = this._container.offsetHeight,
+ containerWidth = this._containerWidth,
+
+ layerPos = new L.Point(this._containerLeft, -containerHeight - this._containerBottom);
+
+ if (this._animated) {
+ layerPos._add(L.DomUtil.getPosition(this._container));
+ }
+
+ var containerPos = map.layerPointToContainerPoint(layerPos),
+ padding = L.point(this.options.autoPanPadding),
+ paddingTL = L.point(this.options.autoPanPaddingTopLeft || padding),
+ paddingBR = L.point(this.options.autoPanPaddingBottomRight || padding),
+ size = map.getSize(),
+ dx = 0,
+ dy = 0;
+
+ if (containerPos.x + containerWidth + paddingBR.x > size.x) { // right
+ dx = containerPos.x + containerWidth - size.x + paddingBR.x;
+ }
+ if (containerPos.x - dx - paddingTL.x < 0) { // left
+ dx = containerPos.x - paddingTL.x;
+ }
+ if (containerPos.y + containerHeight + paddingBR.y > size.y) { // bottom
+ dy = containerPos.y + containerHeight - size.y + paddingBR.y;
+ }
+ if (containerPos.y - dy - paddingTL.y < 0) { // top
+ dy = containerPos.y - paddingTL.y;
+ }
+
+ if (dx || dy) {
+ map
+ .fire('autopanstart')
+ .panBy([dx, dy]);
+ }
+ },
+
+ _onCloseButtonClick: function (e) {
+ this._close();
+ L.DomEvent.stop(e);
+ }
+});
+
+L.popup = function (options, source) {
+ return new L.Popup(options, source);
+};
+
+
+L.Map.include({
+ openPopup: function (popup, latlng, options) { // (Popup) or (String || HTMLElement, LatLng[, Object])
+ this.closePopup();
+
+ if (!(popup instanceof L.Popup)) {
+ var content = popup;
+
+ popup = new L.Popup(options)
+ .setLatLng(latlng)
+ .setContent(content);
+ }
+ popup._isOpen = true;
+
+ this._popup = popup;
+ return this.addLayer(popup);
+ },
+
+ closePopup: function (popup) {
+ if (!popup || popup === this._popup) {
+ popup = this._popup;
+ this._popup = null;
+ }
+ if (popup) {
+ this.removeLayer(popup);
+ popup._isOpen = false;
+ }
+ return this;
+ }
+});
+
+
+/*
+ * Popup extension to L.Marker, adding popup-related methods.
+ */
+
+L.Marker.include({
+ openPopup: function () {
+ if (this._popup && this._map && !this._map.hasLayer(this._popup)) {
+ this._popup.setLatLng(this._latlng);
+ this._map.openPopup(this._popup);
+ }
+
+ return this;
+ },
+
+ closePopup: function () {
+ if (this._popup) {
+ this._popup._close();
+ }
+ return this;
+ },
+
+ togglePopup: function () {
+ if (this._popup) {
+ if (this._popup._isOpen) {
+ this.closePopup();
+ } else {
+ this.openPopup();
+ }
+ }
+ return this;
+ },
+
+ bindPopup: function (content, options) {
+ var anchor = L.point(this.options.icon.options.popupAnchor || [0, 0]);
+
+ anchor = anchor.add(L.Popup.prototype.options.offset);
+
+ if (options && options.offset) {
+ anchor = anchor.add(options.offset);
+ }
+
+ options = L.extend({offset: anchor}, options);
+
+ if (!this._popupHandlersAdded) {
+ this
+ .on('click', this.togglePopup, this)
+ .on('remove', this.closePopup, this)
+ .on('move', this._movePopup, this);
+ this._popupHandlersAdded = true;
+ }
+
+ if (content instanceof L.Popup) {
+ L.setOptions(content, options);
+ this._popup = content;
+ content._source = this;
+ } else {
+ this._popup = new L.Popup(options, this)
+ .setContent(content);
+ }
+
+ return this;
+ },
+
+ setPopupContent: function (content) {
+ if (this._popup) {
+ this._popup.setContent(content);
+ }
+ return this;
+ },
+
+ unbindPopup: function () {
+ if (this._popup) {
+ this._popup = null;
+ this
+ .off('click', this.togglePopup, this)
+ .off('remove', this.closePopup, this)
+ .off('move', this._movePopup, this);
+ this._popupHandlersAdded = false;
+ }
+ return this;
+ },
+
+ getPopup: function () {
+ return this._popup;
+ },
+
+ _movePopup: function (e) {
+ this._popup.setLatLng(e.latlng);
+ }
+});
+
+
+/*
+ * L.LayerGroup is a class to combine several layers into one so that
+ * you can manipulate the group (e.g. add/remove it) as one layer.
+ */
+
+L.LayerGroup = L.Class.extend({
+ initialize: function (layers) {
+ this._layers = {};
+
+ var i, len;
+
+ if (layers) {
+ for (i = 0, len = layers.length; i < len; i++) {
+ this.addLayer(layers[i]);
+ }
+ }
+ },
+
+ addLayer: function (layer) {
+ var id = this.getLayerId(layer);
+
+ this._layers[id] = layer;
+
+ if (this._map) {
+ this._map.addLayer(layer);
+ }
+
+ return this;
+ },
+
+ removeLayer: function (layer) {
+ var id = layer in this._layers ? layer : this.getLayerId(layer);
+
+ if (this._map && this._layers[id]) {
+ this._map.removeLayer(this._layers[id]);
+ }
+
+ delete this._layers[id];
+
+ return this;
+ },
+
+ hasLayer: function (layer) {
+ if (!layer) { return false; }
+
+ return (layer in this._layers || this.getLayerId(layer) in this._layers);
+ },
+
+ clearLayers: function () {
+ this.eachLayer(this.removeLayer, this);
+ return this;
+ },
+
+ invoke: function (methodName) {
+ var args = Array.prototype.slice.call(arguments, 1),
+ i, layer;
+
+ for (i in this._layers) {
+ layer = this._layers[i];
+
+ if (layer[methodName]) {
+ layer[methodName].apply(layer, args);
+ }
+ }
+
+ return this;
+ },
+
+ onAdd: function (map) {
+ this._map = map;
+ this.eachLayer(map.addLayer, map);
+ },
+
+ onRemove: function (map) {
+ this.eachLayer(map.removeLayer, map);
+ this._map = null;
+ },
+
+ addTo: function (map) {
+ map.addLayer(this);
+ return this;
+ },
+
+ eachLayer: function (method, context) {
+ for (var i in this._layers) {
+ method.call(context, this._layers[i]);
+ }
+ return this;
+ },
+
+ getLayer: function (id) {
+ return this._layers[id];
+ },
+
+ getLayers: function () {
+ var layers = [];
+
+ for (var i in this._layers) {
+ layers.push(this._layers[i]);
+ }
+ return layers;
+ },
+
+ setZIndex: function (zIndex) {
+ return this.invoke('setZIndex', zIndex);
+ },
+
+ getLayerId: function (layer) {
+ return L.stamp(layer);
+ }
+});
+
+L.layerGroup = function (layers) {
+ return new L.LayerGroup(layers);
+};
+
+
+/*
+ * L.FeatureGroup extends L.LayerGroup by introducing mouse events and additional methods
+ * shared between a group of interactive layers (like vectors or markers).
+ */
+
+L.FeatureGroup = L.LayerGroup.extend({
+ includes: L.Mixin.Events,
+
+ statics: {
+ EVENTS: 'click dblclick mouseover mouseout mousemove contextmenu popupopen popupclose'
+ },
+
+ addLayer: function (layer) {
+ if (this.hasLayer(layer)) {
+ return this;
+ }
+
+ if ('on' in layer) {
+ layer.on(L.FeatureGroup.EVENTS, this._propagateEvent, this);
+ }
+
+ L.LayerGroup.prototype.addLayer.call(this, layer);
+
+ if (this._popupContent && layer.bindPopup) {
+ layer.bindPopup(this._popupContent, this._popupOptions);
+ }
+
+ return this.fire('layeradd', {layer: layer});
+ },
+
+ removeLayer: function (layer) {
+ if (!this.hasLayer(layer)) {
+ return this;
+ }
+ if (layer in this._layers) {
+ layer = this._layers[layer];
+ }
+
+ if ('off' in layer) {
+ layer.off(L.FeatureGroup.EVENTS, this._propagateEvent, this);
+ }
+
+ L.LayerGroup.prototype.removeLayer.call(this, layer);
+
+ if (this._popupContent) {
+ this.invoke('unbindPopup');
+ }
+
+ return this.fire('layerremove', {layer: layer});
+ },
+
+ bindPopup: function (content, options) {
+ this._popupContent = content;
+ this._popupOptions = options;
+ return this.invoke('bindPopup', content, options);
+ },
+
+ openPopup: function (latlng) {
+ // open popup on the first layer
+ for (var id in this._layers) {
+ this._layers[id].openPopup(latlng);
+ break;
+ }
+ return this;
+ },
+
+ setStyle: function (style) {
+ return this.invoke('setStyle', style);
+ },
+
+ bringToFront: function () {
+ return this.invoke('bringToFront');
+ },
+
+ bringToBack: function () {
+ return this.invoke('bringToBack');
+ },
+
+ getBounds: function () {
+ var bounds = new L.LatLngBounds();
+
+ this.eachLayer(function (layer) {
+ bounds.extend(layer instanceof L.Marker ? layer.getLatLng() : layer.getBounds());
+ });
+
+ return bounds;
+ },
+
+ _propagateEvent: function (e) {
+ e = L.extend({
+ layer: e.target,
+ target: this
+ }, e);
+ this.fire(e.type, e);
+ }
+});
+
+L.featureGroup = function (layers) {
+ return new L.FeatureGroup(layers);
+};
+
+
+/*
+ * L.Path is a base class for rendering vector paths on a map. Inherited by Polyline, Circle, etc.
+ */
+
+L.Path = L.Class.extend({
+ includes: [L.Mixin.Events],
+
+ statics: {
+ // how much to extend the clip area around the map view
+ // (relative to its size, e.g. 0.5 is half the screen in each direction)
+ // set it so that SVG element doesn't exceed 1280px (vectors flicker on dragend if it is)
+ CLIP_PADDING: (function () {
+ var max = L.Browser.mobile ? 1280 : 2000,
+ target = (max / Math.max(window.outerWidth, window.outerHeight) - 1) / 2;
+ return Math.max(0, Math.min(0.5, target));
+ })()
+ },
+
+ options: {
+ stroke: true,
+ color: '#0033ff',
+ dashArray: null,
+ lineCap: null,
+ lineJoin: null,
+ weight: 5,
+ opacity: 0.5,
+
+ fill: false,
+ fillColor: null, //same as color by default
+ fillOpacity: 0.2,
+
+ clickable: true
+ },
+
+ initialize: function (options) {
+ L.setOptions(this, options);
+ },
+
+ onAdd: function (map) {
+ this._map = map;
+
+ if (!this._container) {
+ this._initElements();
+ this._initEvents();
+ }
+
+ this.projectLatlngs();
+ this._updatePath();
+
+ if (this._container) {
+ this._map._pathRoot.appendChild(this._container);
+ }
+
+ this.fire('add');
+
+ map.on({
+ 'viewreset': this.projectLatlngs,
+ 'moveend': this._updatePath
+ }, this);
+ },
+
+ addTo: function (map) {
+ map.addLayer(this);
+ return this;
+ },
+
+ onRemove: function (map) {
+ map._pathRoot.removeChild(this._container);
+
+ // Need to fire remove event before we set _map to null as the event hooks might need the object
+ this.fire('remove');
+ this._map = null;
+
+ if (L.Browser.vml) {
+ this._container = null;
+ this._stroke = null;
+ this._fill = null;
+ }
+
+ map.off({
+ 'viewreset': this.projectLatlngs,
+ 'moveend': this._updatePath
+ }, this);
+ },
+
+ projectLatlngs: function () {
+ // do all projection stuff here
+ },
+
+ setStyle: function (style) {
+ L.setOptions(this, style);
+
+ if (this._container) {
+ this._updateStyle();
+ }
+
+ return this;
+ },
+
+ redraw: function () {
+ if (this._map) {
+ this.projectLatlngs();
+ this._updatePath();
+ }
+ return this;
+ }
+});
+
+L.Map.include({
+ _updatePathViewport: function () {
+ var p = L.Path.CLIP_PADDING,
+ size = this.getSize(),
+ panePos = L.DomUtil.getPosition(this._mapPane),
+ min = panePos.multiplyBy(-1)._subtract(size.multiplyBy(p)._round()),
+ max = min.add(size.multiplyBy(1 + p * 2)._round());
+
+ this._pathViewport = new L.Bounds(min, max);
+ }
+});
+
+
+/*
+ * Extends L.Path with SVG-specific rendering code.
+ */
+
+L.Path.SVG_NS = 'http://www.w3.org/2000/svg';
+
+L.Browser.svg = !!(document.createElementNS && document.createElementNS(L.Path.SVG_NS, 'svg').createSVGRect);
+
+L.Path = L.Path.extend({
+ statics: {
+ SVG: L.Browser.svg
+ },
+
+ bringToFront: function () {
+ var root = this._map._pathRoot,
+ path = this._container;
+
+ if (path && root.lastChild !== path) {
+ root.appendChild(path);
+ }
+ return this;
+ },
+
+ bringToBack: function () {
+ var root = this._map._pathRoot,
+ path = this._container,
+ first = root.firstChild;
+
+ if (path && first !== path) {
+ root.insertBefore(path, first);
+ }
+ return this;
+ },
+
+ getPathString: function () {
+ // form path string here
+ },
+
+ _createElement: function (name) {
+ return document.createElementNS(L.Path.SVG_NS, name);
+ },
+
+ _initElements: function () {
+ this._map._initPathRoot();
+ this._initPath();
+ this._initStyle();
+ },
+
+ _initPath: function () {
+ this._container = this._createElement('g');
+
+ this._path = this._createElement('path');
+
+ if (this.options.className) {
+ L.DomUtil.addClass(this._path, this.options.className);
+ }
+
+ this._container.appendChild(this._path);
+ },
+
+ _initStyle: function () {
+ if (this.options.stroke) {
+ this._path.setAttribute('stroke-linejoin', 'round');
+ this._path.setAttribute('stroke-linecap', 'round');
+ }
+ if (this.options.fill) {
+ this._path.setAttribute('fill-rule', 'evenodd');
+ }
+ if (this.options.pointerEvents) {
+ this._path.setAttribute('pointer-events', this.options.pointerEvents);
+ }
+ if (!this.options.clickable && !this.options.pointerEvents) {
+ this._path.setAttribute('pointer-events', 'none');
+ }
+ this._updateStyle();
+ },
+
+ _updateStyle: function () {
+ if (this.options.stroke) {
+ this._path.setAttribute('stroke', this.options.color);
+ this._path.setAttribute('stroke-opacity', this.options.opacity);
+ this._path.setAttribute('stroke-width', this.options.weight);
+ if (this.options.dashArray) {
+ this._path.setAttribute('stroke-dasharray', this.options.dashArray);
+ } else {
+ this._path.removeAttribute('stroke-dasharray');
+ }
+ if (this.options.lineCap) {
+ this._path.setAttribute('stroke-linecap', this.options.lineCap);
+ }
+ if (this.options.lineJoin) {
+ this._path.setAttribute('stroke-linejoin', this.options.lineJoin);
+ }
+ } else {
+ this._path.setAttribute('stroke', 'none');
+ }
+ if (this.options.fill) {
+ this._path.setAttribute('fill', this.options.fillColor || this.options.color);
+ this._path.setAttribute('fill-opacity', this.options.fillOpacity);
+ } else {
+ this._path.setAttribute('fill', 'none');
+ }
+ },
+
+ _updatePath: function () {
+ var str = this.getPathString();
+ if (!str) {
+ // fix webkit empty string parsing bug
+ str = 'M0 0';
+ }
+ this._path.setAttribute('d', str);
+ },
+
+ // TODO remove duplication with L.Map
+ _initEvents: function () {
+ if (this.options.clickable) {
+ if (L.Browser.svg || !L.Browser.vml) {
+ L.DomUtil.addClass(this._path, 'leaflet-clickable');
+ }
+
+ L.DomEvent.on(this._container, 'click', this._onMouseClick, this);
+
+ var events = ['dblclick', 'mousedown', 'mouseover',
+ 'mouseout', 'mousemove', 'contextmenu'];
+ for (var i = 0; i < events.length; i++) {
+ L.DomEvent.on(this._container, events[i], this._fireMouseEvent, this);
+ }
+ }
+ },
+
+ _onMouseClick: function (e) {
+ if (this._map.dragging && this._map.dragging.moved()) { return; }
+
+ this._fireMouseEvent(e);
+ },
+
+ _fireMouseEvent: function (e) {
+ if (!this._map || !this.hasEventListeners(e.type)) { return; }
+
+ var map = this._map,
+ containerPoint = map.mouseEventToContainerPoint(e),
+ layerPoint = map.containerPointToLayerPoint(containerPoint),
+ latlng = map.layerPointToLatLng(layerPoint);
+
+ this.fire(e.type, {
+ latlng: latlng,
+ layerPoint: layerPoint,
+ containerPoint: containerPoint,
+ originalEvent: e
+ });
+
+ if (e.type === 'contextmenu') {
+ L.DomEvent.preventDefault(e);
+ }
+ if (e.type !== 'mousemove') {
+ L.DomEvent.stopPropagation(e);
+ }
+ }
+});
+
+L.Map.include({
+ _initPathRoot: function () {
+ if (!this._pathRoot) {
+ this._pathRoot = L.Path.prototype._createElement('svg');
+ this._panes.overlayPane.appendChild(this._pathRoot);
+
+ if (this.options.zoomAnimation && L.Browser.any3d) {
+ L.DomUtil.addClass(this._pathRoot, 'leaflet-zoom-animated');
+
+ this.on({
+ 'zoomanim': this._animatePathZoom,
+ 'zoomend': this._endPathZoom
+ });
+ } else {
+ L.DomUtil.addClass(this._pathRoot, 'leaflet-zoom-hide');
+ }
+
+ this.on('moveend', this._updateSvgViewport);
+ this._updateSvgViewport();
+ }
+ },
+
+ _animatePathZoom: function (e) {
+ var scale = this.getZoomScale(e.zoom),
+ offset = this._getCenterOffset(e.center)._multiplyBy(-scale)._add(this._pathViewport.min);
+
+ this._pathRoot.style[L.DomUtil.TRANSFORM] =
+ L.DomUtil.getTranslateString(offset) + ' scale(' + scale + ') ';
+
+ this._pathZooming = true;
+ },
+
+ _endPathZoom: function () {
+ this._pathZooming = false;
+ },
+
+ _updateSvgViewport: function () {
+
+ if (this._pathZooming) {
+ // Do not update SVGs while a zoom animation is going on otherwise the animation will break.
+ // When the zoom animation ends we will be updated again anyway
+ // This fixes the case where you do a momentum move and zoom while the move is still ongoing.
+ return;
+ }
+
+ this._updatePathViewport();
+
+ var vp = this._pathViewport,
+ min = vp.min,
+ max = vp.max,
+ width = max.x - min.x,
+ height = max.y - min.y,
+ root = this._pathRoot,
+ pane = this._panes.overlayPane;
+
+ // Hack to make flicker on drag end on mobile webkit less irritating
+ if (L.Browser.mobileWebkit) {
+ pane.removeChild(root);
+ }
+
+ L.DomUtil.setPosition(root, min);
+ root.setAttribute('width', width);
+ root.setAttribute('height', height);
+ root.setAttribute('viewBox', [min.x, min.y, width, height].join(' '));
+
+ if (L.Browser.mobileWebkit) {
+ pane.appendChild(root);
+ }
+ }
+});
+
+
+/*
+ * Popup extension to L.Path (polylines, polygons, circles), adding popup-related methods.
+ */
+
+L.Path.include({
+
+ bindPopup: function (content, options) {
+
+ if (content instanceof L.Popup) {
+ this._popup = content;
+ } else {
+ if (!this._popup || options) {
+ this._popup = new L.Popup(options, this);
+ }
+ this._popup.setContent(content);
+ }
+
+ if (!this._popupHandlersAdded) {
+ this
+ .on('click', this._openPopup, this)
+ .on('remove', this.closePopup, this);
+
+ this._popupHandlersAdded = true;
+ }
+
+ return this;
+ },
+
+ unbindPopup: function () {
+ if (this._popup) {
+ this._popup = null;
+ this
+ .off('click', this._openPopup)
+ .off('remove', this.closePopup);
+
+ this._popupHandlersAdded = false;
+ }
+ return this;
+ },
+
+ openPopup: function (latlng) {
+
+ if (this._popup) {
+ // open the popup from one of the path's points if not specified
+ latlng = latlng || this._latlng ||
+ this._latlngs[Math.floor(this._latlngs.length / 2)];
+
+ this._openPopup({latlng: latlng});
+ }
+
+ return this;
+ },
+
+ closePopup: function () {
+ if (this._popup) {
+ this._popup._close();
+ }
+ return this;
+ },
+
+ _openPopup: function (e) {
+ this._popup.setLatLng(e.latlng);
+ this._map.openPopup(this._popup);
+ }
+});
+
+
+/*
+ * Vector rendering for IE6-8 through VML.
+ * Thanks to Dmitry Baranovsky and his Raphael library for inspiration!
+ */
+
+L.Browser.vml = !L.Browser.svg && (function () {
+ try {
+ var div = document.createElement('div');
+ div.innerHTML = '<v:shape adj="1"/>';
+
+ var shape = div.firstChild;
+ shape.style.behavior = 'url(#default#VML)';
+
+ return shape && (typeof shape.adj === 'object');
+
+ } catch (e) {
+ return false;
+ }
+}());
+
+L.Path = L.Browser.svg || !L.Browser.vml ? L.Path : L.Path.extend({
+ statics: {
+ VML: true,
+ CLIP_PADDING: 0.02
+ },
+
+ _createElement: (function () {
+ try {
+ document.namespaces.add('lvml', 'urn:schemas-microsoft-com:vml');
+ return function (name) {
+ return document.createElement('<lvml:' + name + ' class="lvml">');
+ };
+ } catch (e) {
+ return function (name) {
+ return document.createElement(
+ '<' + name + ' xmlns="urn:schemas-microsoft.com:vml" class="lvml">');
+ };
+ }
+ }()),
+
+ _initPath: function () {
+ var container = this._container = this._createElement('shape');
+
+ L.DomUtil.addClass(container, 'leaflet-vml-shape' +
+ (this.options.className ? ' ' + this.options.className : ''));
+
+ if (this.options.clickable) {
+ L.DomUtil.addClass(container, 'leaflet-clickable');
+ }
+
+ container.coordsize = '1 1';
+
+ this._path = this._createElement('path');
+ container.appendChild(this._path);
+
+ this._map._pathRoot.appendChild(container);
+ },
+
+ _initStyle: function () {
+ this._updateStyle();
+ },
+
+ _updateStyle: function () {
+ var stroke = this._stroke,
+ fill = this._fill,
+ options = this.options,
+ container = this._container;
+
+ container.stroked = options.stroke;
+ container.filled = options.fill;
+
+ if (options.stroke) {
+ if (!stroke) {
+ stroke = this._stroke = this._createElement('stroke');
+ stroke.endcap = 'round';
+ container.appendChild(stroke);
+ }
+ stroke.weight = options.weight + 'px';
+ stroke.color = options.color;
+ stroke.opacity = options.opacity;
+
+ if (options.dashArray) {
+ stroke.dashStyle = L.Util.isArray(options.dashArray) ?
+ options.dashArray.join(' ') :
+ options.dashArray.replace(/( *, *)/g, ' ');
+ } else {
+ stroke.dashStyle = '';
+ }
+ if (options.lineCap) {
+ stroke.endcap = options.lineCap.replace('butt', 'flat');
+ }
+ if (options.lineJoin) {
+ stroke.joinstyle = options.lineJoin;
+ }
+
+ } else if (stroke) {
+ container.removeChild(stroke);
+ this._stroke = null;
+ }
+
+ if (options.fill) {
+ if (!fill) {
+ fill = this._fill = this._createElement('fill');
+ container.appendChild(fill);
+ }
+ fill.color = options.fillColor || options.color;
+ fill.opacity = options.fillOpacity;
+
+ } else if (fill) {
+ container.removeChild(fill);
+ this._fill = null;
+ }
+ },
+
+ _updatePath: function () {
+ var style = this._container.style;
+
+ style.display = 'none';
+ this._path.v = this.getPathString() + ' '; // the space fixes IE empty path string bug
+ style.display = '';
+ }
+});
+
+L.Map.include(L.Browser.svg || !L.Browser.vml ? {} : {
+ _initPathRoot: function () {
+ if (this._pathRoot) { return; }
+
+ var root = this._pathRoot = document.createElement('div');
+ root.className = 'leaflet-vml-container';
+ this._panes.overlayPane.appendChild(root);
+
+ this.on('moveend', this._updatePathViewport);
+ this._updatePathViewport();
+ }
+});
+
+
+/*
+ * Vector rendering for all browsers that support canvas.
+ */
+
+L.Browser.canvas = (function () {
+ return !!document.createElement('canvas').getContext;
+}());
+
+L.Path = (L.Path.SVG && !window.L_PREFER_CANVAS) || !L.Browser.canvas ? L.Path : L.Path.extend({
+ statics: {
+ //CLIP_PADDING: 0.02, // not sure if there's a need to set it to a small value
+ CANVAS: true,
+ SVG: false
+ },
+
+ redraw: function () {
+ if (this._map) {
+ this.projectLatlngs();
+ this._requestUpdate();
+ }
+ return this;
+ },
+
+ setStyle: function (style) {
+ L.setOptions(this, style);
+
+ if (this._map) {
+ this._updateStyle();
+ this._requestUpdate();
+ }
+ return this;
+ },
+
+ onRemove: function (map) {
+ map
+ .off('viewreset', this.projectLatlngs, this)
+ .off('moveend', this._updatePath, this);
+
+ if (this.options.clickable) {
+ this._map.off('click', this._onClick, this);
+ this._map.off('mousemove', this._onMouseMove, this);
+ }
+
+ this._requestUpdate();
+
+ this.fire('remove');
+ this._map = null;
+ },
+
+ _requestUpdate: function () {
+ if (this._map && !L.Path._updateRequest) {
+ L.Path._updateRequest = L.Util.requestAnimFrame(this._fireMapMoveEnd, this._map);
+ }
+ },
+
+ _fireMapMoveEnd: function () {
+ L.Path._updateRequest = null;
+ this.fire('moveend');
+ },
+
+ _initElements: function () {
+ this._map._initPathRoot();
+ this._ctx = this._map._canvasCtx;
+ },
+
+ _updateStyle: function () {
+ var options = this.options;
+
+ if (options.stroke) {
+ this._ctx.lineWidth = options.weight;
+ this._ctx.strokeStyle = options.color;
+ }
+ if (options.fill) {
+ this._ctx.fillStyle = options.fillColor || options.color;
+ }
+
+ if (options.lineCap) {
+ this._ctx.lineCap = options.lineCap;
+ }
+ if (options.lineJoin) {
+ this._ctx.lineJoin = options.lineJoin;
+ }
+ },
+
+ _drawPath: function () {
+ var i, j, len, len2, point, drawMethod;
+
+ this._ctx.beginPath();
+
+ for (i = 0, len = this._parts.length; i < len; i++) {
+ for (j = 0, len2 = this._parts[i].length; j < len2; j++) {
+ point = this._parts[i][j];
+ drawMethod = (j === 0 ? 'move' : 'line') + 'To';
+
+ this._ctx[drawMethod](point.x, point.y);
+ }
+ // TODO refactor ugly hack
+ if (this instanceof L.Polygon) {
+ this._ctx.closePath();
+ }
+ }
+ },
+
+ _checkIfEmpty: function () {
+ return !this._parts.length;
+ },
+
+ _updatePath: function () {
+ if (this._checkIfEmpty()) { return; }
+
+ var ctx = this._ctx,
+ options = this.options;
+
+ this._drawPath();
+ ctx.save();
+ this._updateStyle();
+
+ if (options.fill) {
+ ctx.globalAlpha = options.fillOpacity;
+ ctx.fill(options.fillRule || 'evenodd');
+ }
+
+ if (options.stroke) {
+ ctx.globalAlpha = options.opacity;
+ ctx.stroke();
+ }
+
+ ctx.restore();
+
+ // TODO optimization: 1 fill/stroke for all features with equal style instead of 1 for each feature
+ },
+
+ _initEvents: function () {
+ if (this.options.clickable) {
+ this._map.on('mousemove', this._onMouseMove, this);
+ this._map.on('click dblclick contextmenu', this._fireMouseEvent, this);
+ }
+ },
+
+ _fireMouseEvent: function (e) {
+ if (this._containsPoint(e.layerPoint)) {
+ this.fire(e.type, e);
+ }
+ },
+
+ _onMouseMove: function (e) {
+ if (!this._map || this._map._animatingZoom) { return; }
+
+ // TODO don't do on each move
+ if (this._containsPoint(e.layerPoint)) {
+ this._ctx.canvas.style.cursor = 'pointer';
+ this._mouseInside = true;
+ this.fire('mouseover', e);
+
+ } else if (this._mouseInside) {
+ this._ctx.canvas.style.cursor = '';
+ this._mouseInside = false;
+ this.fire('mouseout', e);
+ }
+ }
+});
+
+L.Map.include((L.Path.SVG && !window.L_PREFER_CANVAS) || !L.Browser.canvas ? {} : {
+ _initPathRoot: function () {
+ var root = this._pathRoot,
+ ctx;
+
+ if (!root) {
+ root = this._pathRoot = document.createElement('canvas');
+ root.style.position = 'absolute';
+ ctx = this._canvasCtx = root.getContext('2d');
+
+ ctx.lineCap = 'round';
+ ctx.lineJoin = 'round';
+
+ this._panes.overlayPane.appendChild(root);
+
+ if (this.options.zoomAnimation) {
+ this._pathRoot.className = 'leaflet-zoom-animated';
+ this.on('zoomanim', this._animatePathZoom);
+ this.on('zoomend', this._endPathZoom);
+ }
+ this.on('moveend', this._updateCanvasViewport);
+ this._updateCanvasViewport();
+ }
+ },
+
+ _updateCanvasViewport: function () {
+ // don't redraw while zooming. See _updateSvgViewport for more details
+ if (this._pathZooming) { return; }
+ this._updatePathViewport();
+
+ var vp = this._pathViewport,
+ min = vp.min,
+ size = vp.max.subtract(min),
+ root = this._pathRoot;
+
+ //TODO check if this works properly on mobile webkit
+ L.DomUtil.setPosition(root, min);
+ root.width = size.x;
+ root.height = size.y;
+ root.getContext('2d').translate(-min.x, -min.y);
+ }
+});
+
+
+/*
+ * L.LineUtil contains different utility functions for line segments
+ * and polylines (clipping, simplification, distances, etc.)
+ */
+
+/*jshint bitwise:false */ // allow bitwise operations for this file
+
+L.LineUtil = {
+
+ // Simplify polyline with vertex reduction and Douglas-Peucker simplification.
+ // Improves rendering performance dramatically by lessening the number of points to draw.
+
+ simplify: function (/*Point[]*/ points, /*Number*/ tolerance) {
+ if (!tolerance || !points.length) {
+ return points.slice();
+ }
+
+ var sqTolerance = tolerance * tolerance;
+
+ // stage 1: vertex reduction
+ points = this._reducePoints(points, sqTolerance);
+
+ // stage 2: Douglas-Peucker simplification
+ points = this._simplifyDP(points, sqTolerance);
+
+ return points;
+ },
+
+ // distance from a point to a segment between two points
+ pointToSegmentDistance: function (/*Point*/ p, /*Point*/ p1, /*Point*/ p2) {
+ return Math.sqrt(this._sqClosestPointOnSegment(p, p1, p2, true));
+ },
+
+ closestPointOnSegment: function (/*Point*/ p, /*Point*/ p1, /*Point*/ p2) {
+ return this._sqClosestPointOnSegment(p, p1, p2);
+ },
+
+ // Douglas-Peucker simplification, see http://en.wikipedia.org/wiki/Douglas-Peucker_algorithm
+ _simplifyDP: function (points, sqTolerance) {
+
+ var len = points.length,
+ ArrayConstructor = typeof Uint8Array !== undefined + '' ? Uint8Array : Array,
+ markers = new ArrayConstructor(len);
+
+ markers[0] = markers[len - 1] = 1;
+
+ this._simplifyDPStep(points, markers, sqTolerance, 0, len - 1);
+
+ var i,
+ newPoints = [];
+
+ for (i = 0; i < len; i++) {
+ if (markers[i]) {
+ newPoints.push(points[i]);
+ }
+ }
+
+ return newPoints;
+ },
+
+ _simplifyDPStep: function (points, markers, sqTolerance, first, last) {
+
+ var maxSqDist = 0,
+ index, i, sqDist;
+
+ for (i = first + 1; i <= last - 1; i++) {
+ sqDist = this._sqClosestPointOnSegment(points[i], points[first], points[last], true);
+
+ if (sqDist > maxSqDist) {
+ index = i;
+ maxSqDist = sqDist;
+ }
+ }
+
+ if (maxSqDist > sqTolerance) {
+ markers[index] = 1;
+
+ this._simplifyDPStep(points, markers, sqTolerance, first, index);
+ this._simplifyDPStep(points, markers, sqTolerance, index, last);
+ }
+ },
+
+ // reduce points that are too close to each other to a single point
+ _reducePoints: function (points, sqTolerance) {
+ var reducedPoints = [points[0]];
+
+ for (var i = 1, prev = 0, len = points.length; i < len; i++) {
+ if (this._sqDist(points[i], points[prev]) > sqTolerance) {
+ reducedPoints.push(points[i]);
+ prev = i;
+ }
+ }
+ if (prev < len - 1) {
+ reducedPoints.push(points[len - 1]);
+ }
+ return reducedPoints;
+ },
+
+ // Cohen-Sutherland line clipping algorithm.
+ // Used to avoid rendering parts of a polyline that are not currently visible.
+
+ clipSegment: function (a, b, bounds, useLastCode) {
+ var codeA = useLastCode ? this._lastCode : this._getBitCode(a, bounds),
+ codeB = this._getBitCode(b, bounds),
+
+ codeOut, p, newCode;
+
+ // save 2nd code to avoid calculating it on the next segment
+ this._lastCode = codeB;
+
+ while (true) {
+ // if a,b is inside the clip window (trivial accept)
+ if (!(codeA | codeB)) {
+ return [a, b];
+ // if a,b is outside the clip window (trivial reject)
+ } else if (codeA & codeB) {
+ return false;
+ // other cases
+ } else {
+ codeOut = codeA || codeB;
+ p = this._getEdgeIntersection(a, b, codeOut, bounds);
+ newCode = this._getBitCode(p, bounds);
+
+ if (codeOut === codeA) {
+ a = p;
+ codeA = newCode;
+ } else {
+ b = p;
+ codeB = newCode;
+ }
+ }
+ }
+ },
+
+ _getEdgeIntersection: function (a, b, code, bounds) {
+ var dx = b.x - a.x,
+ dy = b.y - a.y,
+ min = bounds.min,
+ max = bounds.max;
+
+ if (code & 8) { // top
+ return new L.Point(a.x + dx * (max.y - a.y) / dy, max.y);
+ } else if (code & 4) { // bottom
+ return new L.Point(a.x + dx * (min.y - a.y) / dy, min.y);
+ } else if (code & 2) { // right
+ return new L.Point(max.x, a.y + dy * (max.x - a.x) / dx);
+ } else if (code & 1) { // left
+ return new L.Point(min.x, a.y + dy * (min.x - a.x) / dx);
+ }
+ },
+
+ _getBitCode: function (/*Point*/ p, bounds) {
+ var code = 0;
+
+ if (p.x < bounds.min.x) { // left
+ code |= 1;
+ } else if (p.x > bounds.max.x) { // right
+ code |= 2;
+ }
+ if (p.y < bounds.min.y) { // bottom
+ code |= 4;
+ } else if (p.y > bounds.max.y) { // top
+ code |= 8;
+ }
+
+ return code;
+ },
+
+ // square distance (to avoid unnecessary Math.sqrt calls)
+ _sqDist: function (p1, p2) {
+ var dx = p2.x - p1.x,
+ dy = p2.y - p1.y;
+ return dx * dx + dy * dy;
+ },
+
+ // return closest point on segment or distance to that point
+ _sqClosestPointOnSegment: function (p, p1, p2, sqDist) {
+ var x = p1.x,
+ y = p1.y,
+ dx = p2.x - x,
+ dy = p2.y - y,
+ dot = dx * dx + dy * dy,
+ t;
+
+ if (dot > 0) {
+ t = ((p.x - x) * dx + (p.y - y) * dy) / dot;
+
+ if (t > 1) {
+ x = p2.x;
+ y = p2.y;
+ } else if (t > 0) {
+ x += dx * t;
+ y += dy * t;
+ }
+ }
+
+ dx = p.x - x;
+ dy = p.y - y;
+
+ return sqDist ? dx * dx + dy * dy : new L.Point(x, y);
+ }
+};
+
+
+/*
+ * L.Polyline is used to display polylines on a map.
+ */
+
+L.Polyline = L.Path.extend({
+ initialize: function (latlngs, options) {
+ L.Path.prototype.initialize.call(this, options);
+
+ this._latlngs = this._convertLatLngs(latlngs);
+ },
+
+ options: {
+ // how much to simplify the polyline on each zoom level
+ // more = better performance and smoother look, less = more accurate
+ smoothFactor: 1.0,
+ noClip: false
+ },
+
+ projectLatlngs: function () {
+ this._originalPoints = [];
+
+ for (var i = 0, len = this._latlngs.length; i < len; i++) {
+ this._originalPoints[i] = this._map.latLngToLayerPoint(this._latlngs[i]);
+ }
+ },
+
+ getPathString: function () {
+ for (var i = 0, len = this._parts.length, str = ''; i < len; i++) {
+ str += this._getPathPartStr(this._parts[i]);
+ }
+ return str;
+ },
+
+ getLatLngs: function () {
+ return this._latlngs;
+ },
+
+ setLatLngs: function (latlngs) {
+ this._latlngs = this._convertLatLngs(latlngs);
+ return this.redraw();
+ },
+
+ addLatLng: function (latlng) {
+ this._latlngs.push(L.latLng(latlng));
+ return this.redraw();
+ },
+
+ spliceLatLngs: function () { // (Number index, Number howMany)
+ var removed = [].splice.apply(this._latlngs, arguments);
+ this._convertLatLngs(this._latlngs, true);
+ this.redraw();
+ return removed;
+ },
+
+ closestLayerPoint: function (p) {
+ var minDistance = Infinity, parts = this._parts, p1, p2, minPoint = null;
+
+ for (var j = 0, jLen = parts.length; j < jLen; j++) {
+ var points = parts[j];
+ for (var i = 1, len = points.length; i < len; i++) {
+ p1 = points[i - 1];
+ p2 = points[i];
+ var sqDist = L.LineUtil._sqClosestPointOnSegment(p, p1, p2, true);
+ if (sqDist < minDistance) {
+ minDistance = sqDist;
+ minPoint = L.LineUtil._sqClosestPointOnSegment(p, p1, p2);
+ }
+ }
+ }
+ if (minPoint) {
+ minPoint.distance = Math.sqrt(minDistance);
+ }
+ return minPoint;
+ },
+
+ getBounds: function () {
+ return new L.LatLngBounds(this.getLatLngs());
+ },
+
+ _convertLatLngs: function (latlngs, overwrite) {
+ var i, len, target = overwrite ? latlngs : [];
+
+ for (i = 0, len = latlngs.length; i < len; i++) {
+ if (L.Util.isArray(latlngs[i]) && typeof latlngs[i][0] !== 'number') {
+ return;
+ }
+ target[i] = L.latLng(latlngs[i]);
+ }
+ return target;
+ },
+
+ _initEvents: function () {
+ L.Path.prototype._initEvents.call(this);
+ },
+
+ _getPathPartStr: function (points) {
+ var round = L.Path.VML;
+
+ for (var j = 0, len2 = points.length, str = '', p; j < len2; j++) {
+ p = points[j];
+ if (round) {
+ p._round();
+ }
+ str += (j ? 'L' : 'M') + p.x + ' ' + p.y;
+ }
+ return str;
+ },
+
+ _clipPoints: function () {
+ var points = this._originalPoints,
+ len = points.length,
+ i, k, segment;
+
+ if (this.options.noClip) {
+ this._parts = [points];
+ return;
+ }
+
+ this._parts = [];
+
+ var parts = this._parts,
+ vp = this._map._pathViewport,
+ lu = L.LineUtil;
+
+ for (i = 0, k = 0; i < len - 1; i++) {
+ segment = lu.clipSegment(points[i], points[i + 1], vp, i);
+ if (!segment) {
+ continue;
+ }
+
+ parts[k] = parts[k] || [];
+ parts[k].push(segment[0]);
+
+ // if segment goes out of screen, or it's the last one, it's the end of the line part
+ if ((segment[1] !== points[i + 1]) || (i === len - 2)) {
+ parts[k].push(segment[1]);
+ k++;
+ }
+ }
+ },
+
+ // simplify each clipped part of the polyline
+ _simplifyPoints: function () {
+ var parts = this._parts,
+ lu = L.LineUtil;
+
+ for (var i = 0, len = parts.length; i < len; i++) {
+ parts[i] = lu.simplify(parts[i], this.options.smoothFactor);
+ }
+ },
+
+ _updatePath: function () {
+ if (!this._map) { return; }
+
+ this._clipPoints();
+ this._simplifyPoints();
+
+ L.Path.prototype._updatePath.call(this);
+ }
+});
+
+L.polyline = function (latlngs, options) {
+ return new L.Polyline(latlngs, options);
+};
+
+
+/*
+ * L.PolyUtil contains utility functions for polygons (clipping, etc.).
+ */
+
+/*jshint bitwise:false */ // allow bitwise operations here
+
+L.PolyUtil = {};
+
+/*
+ * Sutherland-Hodgeman polygon clipping algorithm.
+ * Used to avoid rendering parts of a polygon that are not currently visible.
+ */
+L.PolyUtil.clipPolygon = function (points, bounds) {
+ var clippedPoints,
+ edges = [1, 4, 2, 8],
+ i, j, k,
+ a, b,
+ len, edge, p,
+ lu = L.LineUtil;
+
+ for (i = 0, len = points.length; i < len; i++) {
+ points[i]._code = lu._getBitCode(points[i], bounds);
+ }
+
+ // for each edge (left, bottom, right, top)
+ for (k = 0; k < 4; k++) {
+ edge = edges[k];
+ clippedPoints = [];
+
+ for (i = 0, len = points.length, j = len - 1; i < len; j = i++) {
+ a = points[i];
+ b = points[j];
+
+ // if a is inside the clip window
+ if (!(a._code & edge)) {
+ // if b is outside the clip window (a->b goes out of screen)
+ if (b._code & edge) {
+ p = lu._getEdgeIntersection(b, a, edge, bounds);
+ p._code = lu._getBitCode(p, bounds);
+ clippedPoints.push(p);
+ }
+ clippedPoints.push(a);
+
+ // else if b is inside the clip window (a->b enters the screen)
+ } else if (!(b._code & edge)) {
+ p = lu._getEdgeIntersection(b, a, edge, bounds);
+ p._code = lu._getBitCode(p, bounds);
+ clippedPoints.push(p);
+ }
+ }
+ points = clippedPoints;
+ }
+
+ return points;
+};
+
+
+/*
+ * L.Polygon is used to display polygons on a map.
+ */
+
+L.Polygon = L.Polyline.extend({
+ options: {
+ fill: true
+ },
+
+ initialize: function (latlngs, options) {
+ L.Polyline.prototype.initialize.call(this, latlngs, options);
+ this._initWithHoles(latlngs);
+ },
+
+ _initWithHoles: function (latlngs) {
+ var i, len, hole;
+ if (latlngs && L.Util.isArray(latlngs[0]) && (typeof latlngs[0][0] !== 'number')) {
+ this._latlngs = this._convertLatLngs(latlngs[0]);
+ this._holes = latlngs.slice(1);
+
+ for (i = 0, len = this._holes.length; i < len; i++) {
+ hole = this._holes[i] = this._convertLatLngs(this._holes[i]);
+ if (hole[0].equals(hole[hole.length - 1])) {
+ hole.pop();
+ }
+ }
+ }
+
+ // filter out last point if its equal to the first one
+ latlngs = this._latlngs;
+
+ if (latlngs.length >= 2 && latlngs[0].equals(latlngs[latlngs.length - 1])) {
+ latlngs.pop();
+ }
+ },
+
+ projectLatlngs: function () {
+ L.Polyline.prototype.projectLatlngs.call(this);
+
+ // project polygon holes points
+ // TODO move this logic to Polyline to get rid of duplication
+ this._holePoints = [];
+
+ if (!this._holes) { return; }
+
+ var i, j, len, len2;
+
+ for (i = 0, len = this._holes.length; i < len; i++) {
+ this._holePoints[i] = [];
+
+ for (j = 0, len2 = this._holes[i].length; j < len2; j++) {
+ this._holePoints[i][j] = this._map.latLngToLayerPoint(this._holes[i][j]);
+ }
+ }
+ },
+
+ setLatLngs: function (latlngs) {
+ if (latlngs && L.Util.isArray(latlngs[0]) && (typeof latlngs[0][0] !== 'number')) {
+ this._initWithHoles(latlngs);
+ return this.redraw();
+ } else {
+ return L.Polyline.prototype.setLatLngs.call(this, latlngs);
+ }
+ },
+
+ _clipPoints: function () {
+ var points = this._originalPoints,
+ newParts = [];
+
+ this._parts = [points].concat(this._holePoints);
+
+ if (this.options.noClip) { return; }
+
+ for (var i = 0, len = this._parts.length; i < len; i++) {
+ var clipped = L.PolyUtil.clipPolygon(this._parts[i], this._map._pathViewport);
+ if (clipped.length) {
+ newParts.push(clipped);
+ }
+ }
+
+ this._parts = newParts;
+ },
+
+ _getPathPartStr: function (points) {
+ var str = L.Polyline.prototype._getPathPartStr.call(this, points);
+ return str + (L.Browser.svg ? 'z' : 'x');
+ }
+});
+
+L.polygon = function (latlngs, options) {
+ return new L.Polygon(latlngs, options);
+};
+
+
+/*
+ * Contains L.MultiPolyline and L.MultiPolygon layers.
+ */
+
+(function () {
+ function createMulti(Klass) {
+
+ return L.FeatureGroup.extend({
+
+ initialize: function (latlngs, options) {
+ this._layers = {};
+ this._options = options;
+ this.setLatLngs(latlngs);
+ },
+
+ setLatLngs: function (latlngs) {
+ var i = 0,
+ len = latlngs.length;
+
+ this.eachLayer(function (layer) {
+ if (i < len) {
+ layer.setLatLngs(latlngs[i++]);
+ } else {
+ this.removeLayer(layer);
+ }
+ }, this);
+
+ while (i < len) {
+ this.addLayer(new Klass(latlngs[i++], this._options));
+ }
+
+ return this;
+ },
+
+ getLatLngs: function () {
+ var latlngs = [];
+
+ this.eachLayer(function (layer) {
+ latlngs.push(layer.getLatLngs());
+ });
+
+ return latlngs;
+ }
+ });
+ }
+
+ L.MultiPolyline = createMulti(L.Polyline);
+ L.MultiPolygon = createMulti(L.Polygon);
+
+ L.multiPolyline = function (latlngs, options) {
+ return new L.MultiPolyline(latlngs, options);
+ };
+
+ L.multiPolygon = function (latlngs, options) {
+ return new L.MultiPolygon(latlngs, options);
+ };
+}());
+
+
+/*
+ * L.Rectangle extends Polygon and creates a rectangle when passed a LatLngBounds object.
+ */
+
+L.Rectangle = L.Polygon.extend({
+ initialize: function (latLngBounds, options) {
+ L.Polygon.prototype.initialize.call(this, this._boundsToLatLngs(latLngBounds), options);
+ },
+
+ setBounds: function (latLngBounds) {
+ this.setLatLngs(this._boundsToLatLngs(latLngBounds));
+ },
+
+ _boundsToLatLngs: function (latLngBounds) {
+ latLngBounds = L.latLngBounds(latLngBounds);
+ return [
+ latLngBounds.getSouthWest(),
+ latLngBounds.getNorthWest(),
+ latLngBounds.getNorthEast(),
+ latLngBounds.getSouthEast()
+ ];
+ }
+});
+
+L.rectangle = function (latLngBounds, options) {
+ return new L.Rectangle(latLngBounds, options);
+};
+
+
+/*
+ * L.Circle is a circle overlay (with a certain radius in meters).
+ */
+
+L.Circle = L.Path.extend({
+ initialize: function (latlng, radius, options) {
+ L.Path.prototype.initialize.call(this, options);
+
+ this._latlng = L.latLng(latlng);
+ this._mRadius = radius;
+ },
+
+ options: {
+ fill: true
+ },
+
+ setLatLng: function (latlng) {
+ this._latlng = L.latLng(latlng);
+ return this.redraw();
+ },
+
+ setRadius: function (radius) {
+ this._mRadius = radius;
+ return this.redraw();
+ },
+
+ projectLatlngs: function () {
+ var lngRadius = this._getLngRadius(),
+ latlng = this._latlng,
+ pointLeft = this._map.latLngToLayerPoint([latlng.lat, latlng.lng - lngRadius]);
+
+ this._point = this._map.latLngToLayerPoint(latlng);
+ this._radius = Math.max(this._point.x - pointLeft.x, 1);
+ },
+
+ getBounds: function () {
+ var lngRadius = this._getLngRadius(),
+ latRadius = (this._mRadius / 40075017) * 360,
+ latlng = this._latlng;
+
+ return new L.LatLngBounds(
+ [latlng.lat - latRadius, latlng.lng - lngRadius],
+ [latlng.lat + latRadius, latlng.lng + lngRadius]);
+ },
+
+ getLatLng: function () {
+ return this._latlng;
+ },
+
+ getPathString: function () {
+ var p = this._point,
+ r = this._radius;
+
+ if (this._checkIfEmpty()) {
+ return '';
+ }
+
+ if (L.Browser.svg) {
+ return 'M' + p.x + ',' + (p.y - r) +
+ 'A' + r + ',' + r + ',0,1,1,' +
+ (p.x - 0.1) + ',' + (p.y - r) + ' z';
+ } else {
+ p._round();
+ r = Math.round(r);
+ return 'AL ' + p.x + ',' + p.y + ' ' + r + ',' + r + ' 0,' + (65535 * 360);
+ }
+ },
+
+ getRadius: function () {
+ return this._mRadius;
+ },
+
+ // TODO Earth hardcoded, move into projection code!
+
+ _getLatRadius: function () {
+ return (this._mRadius / 40075017) * 360;
+ },
+
+ _getLngRadius: function () {
+ return this._getLatRadius() / Math.cos(L.LatLng.DEG_TO_RAD * this._latlng.lat);
+ },
+
+ _checkIfEmpty: function () {
+ if (!this._map) {
+ return false;
+ }
+ var vp = this._map._pathViewport,
+ r = this._radius,
+ p = this._point;
+
+ return p.x - r > vp.max.x || p.y - r > vp.max.y ||
+ p.x + r < vp.min.x || p.y + r < vp.min.y;
+ }
+});
+
+L.circle = function (latlng, radius, options) {
+ return new L.Circle(latlng, radius, options);
+};
+
+
+/*
+ * L.CircleMarker is a circle overlay with a permanent pixel radius.
+ */
+
+L.CircleMarker = L.Circle.extend({
+ options: {
+ radius: 10,
+ weight: 2
+ },
+
+ initialize: function (latlng, options) {
+ L.Circle.prototype.initialize.call(this, latlng, null, options);
+ this._radius = this.options.radius;
+ },
+
+ projectLatlngs: function () {
+ this._point = this._map.latLngToLayerPoint(this._latlng);
+ },
+
+ _updateStyle : function () {
+ L.Circle.prototype._updateStyle.call(this);
+ this.setRadius(this.options.radius);
+ },
+
+ setLatLng: function (latlng) {
+ L.Circle.prototype.setLatLng.call(this, latlng);
+ if (this._popup && this._popup._isOpen) {
+ this._popup.setLatLng(latlng);
+ }
+ return this;
+ },
+
+ setRadius: function (radius) {
+ this.options.radius = this._radius = radius;
+ return this.redraw();
+ },
+
+ getRadius: function () {
+ return this._radius;
+ }
+});
+
+L.circleMarker = function (latlng, options) {
+ return new L.CircleMarker(latlng, options);
+};
+
+
+/*
+ * Extends L.Polyline to be able to manually detect clicks on Canvas-rendered polylines.
+ */
+
+L.Polyline.include(!L.Path.CANVAS ? {} : {
+ _containsPoint: function (p, closed) {
+ var i, j, k, len, len2, dist, part,
+ w = this.options.weight / 2;
+
+ if (L.Browser.touch) {
+ w += 10; // polyline click tolerance on touch devices
+ }
+
+ for (i = 0, len = this._parts.length; i < len; i++) {
+ part = this._parts[i];
+ for (j = 0, len2 = part.length, k = len2 - 1; j < len2; k = j++) {
+ if (!closed && (j === 0)) {
+ continue;
+ }
+
+ dist = L.LineUtil.pointToSegmentDistance(p, part[k], part[j]);
+
+ if (dist <= w) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+});
+
+
+/*
+ * Extends L.Polygon to be able to manually detect clicks on Canvas-rendered polygons.
+ */
+
+L.Polygon.include(!L.Path.CANVAS ? {} : {
+ _containsPoint: function (p) {
+ var inside = false,
+ part, p1, p2,
+ i, j, k,
+ len, len2;
+
+ // TODO optimization: check if within bounds first
+
+ if (L.Polyline.prototype._containsPoint.call(this, p, true)) {
+ // click on polygon border
+ return true;
+ }
+
+ // ray casting algorithm for detecting if point is in polygon
+
+ for (i = 0, len = this._parts.length; i < len; i++) {
+ part = this._parts[i];
+
+ for (j = 0, len2 = part.length, k = len2 - 1; j < len2; k = j++) {
+ p1 = part[j];
+ p2 = part[k];
+
+ if (((p1.y > p.y) !== (p2.y > p.y)) &&
+ (p.x < (p2.x - p1.x) * (p.y - p1.y) / (p2.y - p1.y) + p1.x)) {
+ inside = !inside;
+ }
+ }
+ }
+
+ return inside;
+ }
+});
+
+
+/*
+ * Extends L.Circle with Canvas-specific code.
+ */
+
+L.Circle.include(!L.Path.CANVAS ? {} : {
+ _drawPath: function () {
+ var p = this._point;
+ this._ctx.beginPath();
+ this._ctx.arc(p.x, p.y, this._radius, 0, Math.PI * 2, false);
+ },
+
+ _containsPoint: function (p) {
+ var center = this._point,
+ w2 = this.options.stroke ? this.options.weight / 2 : 0;
+
+ return (p.distanceTo(center) <= this._radius + w2);
+ }
+});
+
+
+/*
+ * CircleMarker canvas specific drawing parts.
+ */
+
+L.CircleMarker.include(!L.Path.CANVAS ? {} : {
+ _updateStyle: function () {
+ L.Path.prototype._updateStyle.call(this);
+ }
+});
+
+
+/*
+ * L.GeoJSON turns any GeoJSON data into a Leaflet layer.
+ */
+
+L.GeoJSON = L.FeatureGroup.extend({
+
+ initialize: function (geojson, options) {
+ L.setOptions(this, options);
+
+ this._layers = {};
+
+ if (geojson) {
+ this.addData(geojson);
+ }
+ },
+
+ addData: function (geojson) {
+ var features = L.Util.isArray(geojson) ? geojson : geojson.features,
+ i, len, feature;
+
+ if (features) {
+ for (i = 0, len = features.length; i < len; i++) {
+ // Only add this if geometry or geometries are set and not null
+ feature = features[i];
+ if (feature.geometries || feature.geometry || feature.features || feature.coordinates) {
+ this.addData(features[i]);
+ }
+ }
+ return this;
+ }
+
+ var options = this.options;
+
+ if (options.filter && !options.filter(geojson)) { return; }
+
+ var layer = L.GeoJSON.geometryToLayer(geojson, options.pointToLayer, options.coordsToLatLng, options);
+ layer.feature = L.GeoJSON.asFeature(geojson);
+
+ layer.defaultOptions = layer.options;
+ this.resetStyle(layer);
+
+ if (options.onEachFeature) {
+ options.onEachFeature(geojson, layer);
+ }
+
+ return this.addLayer(layer);
+ },
+
+ resetStyle: function (layer) {
+ var style = this.options.style;
+ if (style) {
+ // reset any custom styles
+ L.Util.extend(layer.options, layer.defaultOptions);
+
+ this._setLayerStyle(layer, style);
+ }
+ },
+
+ setStyle: function (style) {
+ this.eachLayer(function (layer) {
+ this._setLayerStyle(layer, style);
+ }, this);
+ },
+
+ _setLayerStyle: function (layer, style) {
+ if (typeof style === 'function') {
+ style = style(layer.feature);
+ }
+ if (layer.setStyle) {
+ layer.setStyle(style);
+ }
+ }
+});
+
+L.extend(L.GeoJSON, {
+ geometryToLayer: function (geojson, pointToLayer, coordsToLatLng, vectorOptions) {
+ var geometry = geojson.type === 'Feature' ? geojson.geometry : geojson,
+ coords = geometry.coordinates,
+ layers = [],
+ latlng, latlngs, i, len;
+
+ coordsToLatLng = coordsToLatLng || this.coordsToLatLng;
+
+ switch (geometry.type) {
+ case 'Point':
+ latlng = coordsToLatLng(coords);
+ return pointToLayer ? pointToLayer(geojson, latlng) : new L.Marker(latlng);
+
+ case 'MultiPoint':
+ for (i = 0, len = coords.length; i < len; i++) {
+ latlng = coordsToLatLng(coords[i]);
+ layers.push(pointToLayer ? pointToLayer(geojson, latlng) : new L.Marker(latlng));
+ }
+ return new L.FeatureGroup(layers);
+
+ case 'LineString':
+ latlngs = this.coordsToLatLngs(coords, 0, coordsToLatLng);
+ return new L.Polyline(latlngs, vectorOptions);
+
+ case 'Polygon':
+ if (coords.length === 2 && !coords[1].length) {
+ throw new Error('Invalid GeoJSON object.');
+ }
+ latlngs = this.coordsToLatLngs(coords, 1, coordsToLatLng);
+ return new L.Polygon(latlngs, vectorOptions);
+
+ case 'MultiLineString':
+ latlngs = this.coordsToLatLngs(coords, 1, coordsToLatLng);
+ return new L.MultiPolyline(latlngs, vectorOptions);
+
+ case 'MultiPolygon':
+ latlngs = this.coordsToLatLngs(coords, 2, coordsToLatLng);
+ return new L.MultiPolygon(latlngs, vectorOptions);
+
+ case 'GeometryCollection':
+ for (i = 0, len = geometry.geometries.length; i < len; i++) {
+
+ layers.push(this.geometryToLayer({
+ geometry: geometry.geometries[i],
+ type: 'Feature',
+ properties: geojson.properties
+ }, pointToLayer, coordsToLatLng, vectorOptions));
+ }
+ return new L.FeatureGroup(layers);
+
+ default:
+ throw new Error('Invalid GeoJSON object.');
+ }
+ },
+
+ coordsToLatLng: function (coords) { // (Array[, Boolean]) -> LatLng
+ return new L.LatLng(coords[1], coords[0], coords[2]);
+ },
+
+ coordsToLatLngs: function (coords, levelsDeep, coordsToLatLng) { // (Array[, Number, Function]) -> Array
+ var latlng, i, len,
+ latlngs = [];
+
+ for (i = 0, len = coords.length; i < len; i++) {
+ latlng = levelsDeep ?
+ this.coordsToLatLngs(coords[i], levelsDeep - 1, coordsToLatLng) :
+ (coordsToLatLng || this.coordsToLatLng)(coords[i]);
+
+ latlngs.push(latlng);
+ }
+
+ return latlngs;
+ },
+
+ latLngToCoords: function (latlng) {
+ var coords = [latlng.lng, latlng.lat];
+
+ if (latlng.alt !== undefined) {
+ coords.push(latlng.alt);
+ }
+ return coords;
+ },
+
+ latLngsToCoords: function (latLngs) {
+ var coords = [];
+
+ for (var i = 0, len = latLngs.length; i < len; i++) {
+ coords.push(L.GeoJSON.latLngToCoords(latLngs[i]));
+ }
+
+ return coords;
+ },
+
+ getFeature: function (layer, newGeometry) {
+ return layer.feature ? L.extend({}, layer.feature, {geometry: newGeometry}) : L.GeoJSON.asFeature(newGeometry);
+ },
+
+ asFeature: function (geoJSON) {
+ if (geoJSON.type === 'Feature') {
+ return geoJSON;
+ }
+
+ return {
+ type: 'Feature',
+ properties: {},
+ geometry: geoJSON
+ };
+ }
+});
+
+var PointToGeoJSON = {
+ toGeoJSON: function () {
+ return L.GeoJSON.getFeature(this, {
+ type: 'Point',
+ coordinates: L.GeoJSON.latLngToCoords(this.getLatLng())
+ });
+ }
+};
+
+L.Marker.include(PointToGeoJSON);
+L.Circle.include(PointToGeoJSON);
+L.CircleMarker.include(PointToGeoJSON);
+
+L.Polyline.include({
+ toGeoJSON: function () {
+ return L.GeoJSON.getFeature(this, {
+ type: 'LineString',
+ coordinates: L.GeoJSON.latLngsToCoords(this.getLatLngs())
+ });
+ }
+});
+
+L.Polygon.include({
+ toGeoJSON: function () {
+ var coords = [L.GeoJSON.latLngsToCoords(this.getLatLngs())],
+ i, len, hole;
+
+ coords[0].push(coords[0][0]);
+
+ if (this._holes) {
+ for (i = 0, len = this._holes.length; i < len; i++) {
+ hole = L.GeoJSON.latLngsToCoords(this._holes[i]);
+ hole.push(hole[0]);
+ coords.push(hole);
+ }
+ }
+
+ return L.GeoJSON.getFeature(this, {
+ type: 'Polygon',
+ coordinates: coords
+ });
+ }
+});
+
+(function () {
+ function multiToGeoJSON(type) {
+ return function () {
+ var coords = [];
+
+ this.eachLayer(function (layer) {
+ coords.push(layer.toGeoJSON().geometry.coordinates);
+ });
+
+ return L.GeoJSON.getFeature(this, {
+ type: type,
+ coordinates: coords
+ });
+ };
+ }
+
+ L.MultiPolyline.include({toGeoJSON: multiToGeoJSON('MultiLineString')});
+ L.MultiPolygon.include({toGeoJSON: multiToGeoJSON('MultiPolygon')});
+
+ L.LayerGroup.include({
+ toGeoJSON: function () {
+
+ var geometry = this.feature && this.feature.geometry,
+ jsons = [],
+ json;
+
+ if (geometry && geometry.type === 'MultiPoint') {
+ return multiToGeoJSON('MultiPoint').call(this);
+ }
+
+ var isGeometryCollection = geometry && geometry.type === 'GeometryCollection';
+
+ this.eachLayer(function (layer) {
+ if (layer.toGeoJSON) {
+ json = layer.toGeoJSON();
+ jsons.push(isGeometryCollection ? json.geometry : L.GeoJSON.asFeature(json));
+ }
+ });
+
+ if (isGeometryCollection) {
+ return L.GeoJSON.getFeature(this, {
+ geometries: jsons,
+ type: 'GeometryCollection'
+ });
+ }
+
+ return {
+ type: 'FeatureCollection',
+ features: jsons
+ };
+ }
+ });
+}());
+
+L.geoJson = function (geojson, options) {
+ return new L.GeoJSON(geojson, options);
+};
+
+
+/*
+ * L.DomEvent contains functions for working with DOM events.
+ */
+
+L.DomEvent = {
+ /* inspired by John Resig, Dean Edwards and YUI addEvent implementations */
+ addListener: function (obj, type, fn, context) { // (HTMLElement, String, Function[, Object])
+
+ var id = L.stamp(fn),
+ key = '_leaflet_' + type + id,
+ handler, originalHandler, newType;
+
+ if (obj[key]) { return this; }
+
+ handler = function (e) {
+ return fn.call(context || obj, e || L.DomEvent._getEvent());
+ };
+
+ if (L.Browser.pointer && type.indexOf('touch') === 0) {
+ return this.addPointerListener(obj, type, handler, id);
+ }
+ if (L.Browser.touch && (type === 'dblclick') && this.addDoubleTapListener) {
+ this.addDoubleTapListener(obj, handler, id);
+ }
+
+ if ('addEventListener' in obj) {
+
+ if (type === 'mousewheel') {
+ obj.addEventListener('DOMMouseScroll', handler, false);
+ obj.addEventListener(type, handler, false);
+
+ } else if ((type === 'mouseenter') || (type === 'mouseleave')) {
+
+ originalHandler = handler;
+ newType = (type === 'mouseenter' ? 'mouseover' : 'mouseout');
+
+ handler = function (e) {
+ if (!L.DomEvent._checkMouse(obj, e)) { return; }
+ return originalHandler(e);
+ };
+
+ obj.addEventListener(newType, handler, false);
+
+ } else if (type === 'click' && L.Browser.android) {
+ originalHandler = handler;
+ handler = function (e) {
+ return L.DomEvent._filterClick(e, originalHandler);
+ };
+
+ obj.addEventListener(type, handler, false);
+ } else {
+ obj.addEventListener(type, handler, false);
+ }
+
+ } else if ('attachEvent' in obj) {
+ obj.attachEvent('on' + type, handler);
+ }
+
+ obj[key] = handler;
+
+ return this;
+ },
+
+ removeListener: function (obj, type, fn) { // (HTMLElement, String, Function)
+
+ var id = L.stamp(fn),
+ key = '_leaflet_' + type + id,
+ handler = obj[key];
+
+ if (!handler) { return this; }
+
+ if (L.Browser.pointer && type.indexOf('touch') === 0) {
+ this.removePointerListener(obj, type, id);
+ } else if (L.Browser.touch && (type === 'dblclick') && this.removeDoubleTapListener) {
+ this.removeDoubleTapListener(obj, id);
+
+ } else if ('removeEventListener' in obj) {
+
+ if (type === 'mousewheel') {
+ obj.removeEventListener('DOMMouseScroll', handler, false);
+ obj.removeEventListener(type, handler, false);
+
+ } else if ((type === 'mouseenter') || (type === 'mouseleave')) {
+ obj.removeEventListener((type === 'mouseenter' ? 'mouseover' : 'mouseout'), handler, false);
+ } else {
+ obj.removeEventListener(type, handler, false);
+ }
+ } else if ('detachEvent' in obj) {
+ obj.detachEvent('on' + type, handler);
+ }
+
+ obj[key] = null;
+
+ return this;
+ },
+
+ stopPropagation: function (e) {
+
+ if (e.stopPropagation) {
+ e.stopPropagation();
+ } else {
+ e.cancelBubble = true;
+ }
+ L.DomEvent._skipped(e);
+
+ return this;
+ },
+
+ disableScrollPropagation: function (el) {
+ var stop = L.DomEvent.stopPropagation;
+
+ return L.DomEvent
+ .on(el, 'mousewheel', stop)
+ .on(el, 'MozMousePixelScroll', stop);
+ },
+
+ disableClickPropagation: function (el) {
+ var stop = L.DomEvent.stopPropagation;
+
+ for (var i = L.Draggable.START.length - 1; i >= 0; i--) {
+ L.DomEvent.on(el, L.Draggable.START[i], stop);
+ }
+
+ return L.DomEvent
+ .on(el, 'click', L.DomEvent._fakeStop)
+ .on(el, 'dblclick', stop);
+ },
+
+ preventDefault: function (e) {
+
+ if (e.preventDefault) {
+ e.preventDefault();
+ } else {
+ e.returnValue = false;
+ }
+ return this;
+ },
+
+ stop: function (e) {
+ return L.DomEvent
+ .preventDefault(e)
+ .stopPropagation(e);
+ },
+
+ getMousePosition: function (e, container) {
+ if (!container) {
+ return new L.Point(e.clientX, e.clientY);
+ }
+
+ var rect = container.getBoundingClientRect();
+
+ return new L.Point(
+ e.clientX - rect.left - container.clientLeft,
+ e.clientY - rect.top - container.clientTop);
+ },
+
+ getWheelDelta: function (e) {
+
+ var delta = 0;
+
+ if (e.wheelDelta) {
+ delta = e.wheelDelta / 120;
+ }
+ if (e.detail) {
+ delta = -e.detail / 3;
+ }
+ return delta;
+ },
+
+ _skipEvents: {},
+
+ _fakeStop: function (e) {
+ // fakes stopPropagation by setting a special event flag, checked/reset with L.DomEvent._skipped(e)
+ L.DomEvent._skipEvents[e.type] = true;
+ },
+
+ _skipped: function (e) {
+ var skipped = this._skipEvents[e.type];
+ // reset when checking, as it's only used in map container and propagates outside of the map
+ this._skipEvents[e.type] = false;
+ return skipped;
+ },
+
+ // check if element really left/entered the event target (for mouseenter/mouseleave)
+ _checkMouse: function (el, e) {
+
+ var related = e.relatedTarget;
+
+ if (!related) { return true; }
+
+ try {
+ while (related && (related !== el)) {
+ related = related.parentNode;
+ }
+ } catch (err) {
+ return false;
+ }
+ return (related !== el);
+ },
+
+ _getEvent: function () { // evil magic for IE
+ /*jshint noarg:false */
+ var e = window.event;
+ if (!e) {
+ var caller = arguments.callee.caller;
+ while (caller) {
+ e = caller['arguments'][0];
+ if (e && window.Event === e.constructor) {
+ break;
+ }
+ caller = caller.caller;
+ }
+ }
+ return e;
+ },
+
+ // this is a horrible workaround for a bug in Android where a single touch triggers two click events
+ _filterClick: function (e, handler) {
+ var timeStamp = (e.timeStamp || e.originalEvent.timeStamp),
+ elapsed = L.DomEvent._lastClick && (timeStamp - L.DomEvent._lastClick);
+
+ // are they closer together than 500ms yet more than 100ms?
+ // Android typically triggers them ~300ms apart while multiple listeners
+ // on the same event should be triggered far faster;
+ // or check if click is simulated on the element, and if it is, reject any non-simulated events
+
+ if ((elapsed && elapsed > 100 && elapsed < 500) || (e.target._simulatedClick && !e._simulated)) {
+ L.DomEvent.stop(e);
+ return;
+ }
+ L.DomEvent._lastClick = timeStamp;
+
+ return handler(e);
+ }
+};
+
+L.DomEvent.on = L.DomEvent.addListener;
+L.DomEvent.off = L.DomEvent.removeListener;
+
+
+/*
+ * L.Draggable allows you to add dragging capabilities to any element. Supports mobile devices too.
+ */
+
+L.Draggable = L.Class.extend({
+ includes: L.Mixin.Events,
+
+ statics: {
+ START: L.Browser.touch ? ['touchstart', 'mousedown'] : ['mousedown'],
+ END: {
+ mousedown: 'mouseup',
+ touchstart: 'touchend',
+ pointerdown: 'touchend',
+ MSPointerDown: 'touchend'
+ },
+ MOVE: {
+ mousedown: 'mousemove',
+ touchstart: 'touchmove',
+ pointerdown: 'touchmove',
+ MSPointerDown: 'touchmove'
+ }
+ },
+
+ initialize: function (element, dragStartTarget) {
+ this._element = element;
+ this._dragStartTarget = dragStartTarget || element;
+ },
+
+ enable: function () {
+ if (this._enabled) { return; }
+
+ for (var i = L.Draggable.START.length - 1; i >= 0; i--) {
+ L.DomEvent.on(this._dragStartTarget, L.Draggable.START[i], this._onDown, this);
+ }
+
+ this._enabled = true;
+ },
+
+ disable: function () {
+ if (!this._enabled) { return; }
+
+ for (var i = L.Draggable.START.length - 1; i >= 0; i--) {
+ L.DomEvent.off(this._dragStartTarget, L.Draggable.START[i], this._onDown, this);
+ }
+
+ this._enabled = false;
+ this._moved = false;
+ },
+
+ _onDown: function (e) {
+ this._moved = false;
+
+ if (e.shiftKey || ((e.which !== 1) && (e.button !== 1) && !e.touches)) { return; }
+
+ L.DomEvent.stopPropagation(e);
+
+ if (L.Draggable._disabled) { return; }
+
+ L.DomUtil.disableImageDrag();
+ L.DomUtil.disableTextSelection();
+
+ if (this._moving) { return; }
+
+ var first = e.touches ? e.touches[0] : e;
+
+ this._startPoint = new L.Point(first.clientX, first.clientY);
+ this._startPos = this._newPos = L.DomUtil.getPosition(this._element);
+
+ L.DomEvent
+ .on(document, L.Draggable.MOVE[e.type], this._onMove, this)
+ .on(document, L.Draggable.END[e.type], this._onUp, this);
+ },
+
+ _onMove: function (e) {
+ if (e.touches && e.touches.length > 1) {
+ this._moved = true;
+ return;
+ }
+
+ var first = (e.touches && e.touches.length === 1 ? e.touches[0] : e),
+ newPoint = new L.Point(first.clientX, first.clientY),
+ offset = newPoint.subtract(this._startPoint);
+
+ if (!offset.x && !offset.y) { return; }
+ if (L.Browser.touch && Math.abs(offset.x) + Math.abs(offset.y) < 3) { return; }
+
+ L.DomEvent.preventDefault(e);
+
+ if (!this._moved) {
+ this.fire('dragstart');
+
+ this._moved = true;
+ this._startPos = L.DomUtil.getPosition(this._element).subtract(offset);
+
+ L.DomUtil.addClass(document.body, 'leaflet-dragging');
+ this._lastTarget = e.target || e.srcElement;
+ L.DomUtil.addClass(this._lastTarget, 'leaflet-drag-target');
+ }
+
+ this._newPos = this._startPos.add(offset);
+ this._moving = true;
+
+ L.Util.cancelAnimFrame(this._animRequest);
+ this._animRequest = L.Util.requestAnimFrame(this._updatePosition, this, true, this._dragStartTarget);
+ },
+
+ _updatePosition: function () {
+ this.fire('predrag');
+ L.DomUtil.setPosition(this._element, this._newPos);
+ this.fire('drag');
+ },
+
+ _onUp: function () {
+ L.DomUtil.removeClass(document.body, 'leaflet-dragging');
+
+ if (this._lastTarget) {
+ L.DomUtil.removeClass(this._lastTarget, 'leaflet-drag-target');
+ this._lastTarget = null;
+ }
+
+ for (var i in L.Draggable.MOVE) {
+ L.DomEvent
+ .off(document, L.Draggable.MOVE[i], this._onMove)
+ .off(document, L.Draggable.END[i], this._onUp);
+ }
+
+ L.DomUtil.enableImageDrag();
+ L.DomUtil.enableTextSelection();
+
+ if (this._moved && this._moving) {
+ // ensure drag is not fired after dragend
+ L.Util.cancelAnimFrame(this._animRequest);
+
+ this.fire('dragend', {
+ distance: this._newPos.distanceTo(this._startPos)
+ });
+ }
+
+ this._moving = false;
+ }
+});
+
+
+/*
+ L.Handler is a base class for handler classes that are used internally to inject
+ interaction features like dragging to classes like Map and Marker.
+*/
+
+L.Handler = L.Class.extend({
+ initialize: function (map) {
+ this._map = map;
+ },
+
+ enable: function () {
+ if (this._enabled) { return; }
+
+ this._enabled = true;
+ this.addHooks();
+ },
+
+ disable: function () {
+ if (!this._enabled) { return; }
+
+ this._enabled = false;
+ this.removeHooks();
+ },
+
+ enabled: function () {
+ return !!this._enabled;
+ }
+});
+
+
+/*
+ * L.Handler.MapDrag is used to make the map draggable (with panning inertia), enabled by default.
+ */
+
+L.Map.mergeOptions({
+ dragging: true,
+
+ inertia: !L.Browser.android23,
+ inertiaDeceleration: 3400, // px/s^2
+ inertiaMaxSpeed: Infinity, // px/s
+ inertiaThreshold: L.Browser.touch ? 32 : 18, // ms
+ easeLinearity: 0.25,
+
+ // TODO refactor, move to CRS
+ worldCopyJump: false
+});
+
+L.Map.Drag = L.Handler.extend({
+ addHooks: function () {
+ if (!this._draggable) {
+ var map = this._map;
+
+ this._draggable = new L.Draggable(map._mapPane, map._container);
+
+ this._draggable.on({
+ 'dragstart': this._onDragStart,
+ 'drag': this._onDrag,
+ 'dragend': this._onDragEnd
+ }, this);
+
+ if (map.options.worldCopyJump) {
+ this._draggable.on('predrag', this._onPreDrag, this);
+ map.on('viewreset', this._onViewReset, this);
+
+ map.whenReady(this._onViewReset, this);
+ }
+ }
+ this._draggable.enable();
+ },
+
+ removeHooks: function () {
+ this._draggable.disable();
+ },
+
+ moved: function () {
+ return this._draggable && this._draggable._moved;
+ },
+
+ _onDragStart: function () {
+ var map = this._map;
+
+ if (map._panAnim) {
+ map._panAnim.stop();
+ }
+
+ map
+ .fire('movestart')
+ .fire('dragstart');
+
+ if (map.options.inertia) {
+ this._positions = [];
+ this._times = [];
+ }
+ },
+
+ _onDrag: function () {
+ if (this._map.options.inertia) {
+ var time = this._lastTime = +new Date(),
+ pos = this._lastPos = this._draggable._newPos;
+
+ this._positions.push(pos);
+ this._times.push(time);
+
+ if (time - this._times[0] > 200) {
+ this._positions.shift();
+ this._times.shift();
+ }
+ }
+
+ this._map
+ .fire('move')
+ .fire('drag');
+ },
+
+ _onViewReset: function () {
+ // TODO fix hardcoded Earth values
+ var pxCenter = this._map.getSize()._divideBy(2),
+ pxWorldCenter = this._map.latLngToLayerPoint([0, 0]);
+
+ this._initialWorldOffset = pxWorldCenter.subtract(pxCenter).x;
+ this._worldWidth = this._map.project([0, 180]).x;
+ },
+
+ _onPreDrag: function () {
+ // TODO refactor to be able to adjust map pane position after zoom
+ var worldWidth = this._worldWidth,
+ halfWidth = Math.round(worldWidth / 2),
+ dx = this._initialWorldOffset,
+ x = this._draggable._newPos.x,
+ newX1 = (x - halfWidth + dx) % worldWidth + halfWidth - dx,
+ newX2 = (x + halfWidth + dx) % worldWidth - halfWidth - dx,
+ newX = Math.abs(newX1 + dx) < Math.abs(newX2 + dx) ? newX1 : newX2;
+
+ this._draggable._newPos.x = newX;
+ },
+
+ _onDragEnd: function (e) {
+ var map = this._map,
+ options = map.options,
+ delay = +new Date() - this._lastTime,
+
+ noInertia = !options.inertia || delay > options.inertiaThreshold || !this._positions[0];
+
+ map.fire('dragend', e);
+
+ if (noInertia) {
+ map.fire('moveend');
+
+ } else {
+
+ var direction = this._lastPos.subtract(this._positions[0]),
+ duration = (this._lastTime + delay - this._times[0]) / 1000,
+ ease = options.easeLinearity,
+
+ speedVector = direction.multiplyBy(ease / duration),
+ speed = speedVector.distanceTo([0, 0]),
+
+ limitedSpeed = Math.min(options.inertiaMaxSpeed, speed),
+ limitedSpeedVector = speedVector.multiplyBy(limitedSpeed / speed),
+
+ decelerationDuration = limitedSpeed / (options.inertiaDeceleration * ease),
+ offset = limitedSpeedVector.multiplyBy(-decelerationDuration / 2).round();
+
+ if (!offset.x || !offset.y) {
+ map.fire('moveend');
+
+ } else {
+ offset = map._limitOffset(offset, map.options.maxBounds);
+
+ L.Util.requestAnimFrame(function () {
+ map.panBy(offset, {
+ duration: decelerationDuration,
+ easeLinearity: ease,
+ noMoveStart: true
+ });
+ });
+ }
+ }
+ }
+});
+
+L.Map.addInitHook('addHandler', 'dragging', L.Map.Drag);
+
+
+/*
+ * L.Handler.DoubleClickZoom is used to handle double-click zoom on the map, enabled by default.
+ */
+
+L.Map.mergeOptions({
+ doubleClickZoom: true
+});
+
+L.Map.DoubleClickZoom = L.Handler.extend({
+ addHooks: function () {
+ this._map.on('dblclick', this._onDoubleClick, this);
+ },
+
+ removeHooks: function () {
+ this._map.off('dblclick', this._onDoubleClick, this);
+ },
+
+ _onDoubleClick: function (e) {
+ var map = this._map,
+ zoom = map.getZoom() + (e.originalEvent.shiftKey ? -1 : 1);
+
+ if (map.options.doubleClickZoom === 'center') {
+ map.setZoom(zoom);
+ } else {
+ map.setZoomAround(e.containerPoint, zoom);
+ }
+ }
+});
+
+L.Map.addInitHook('addHandler', 'doubleClickZoom', L.Map.DoubleClickZoom);
+
+
+/*
+ * L.Handler.ScrollWheelZoom is used by L.Map to enable mouse scroll wheel zoom on the map.
+ */
+
+L.Map.mergeOptions({
+ scrollWheelZoom: true
+});
+
+L.Map.ScrollWheelZoom = L.Handler.extend({
+ addHooks: function () {
+ L.DomEvent.on(this._map._container, 'mousewheel', this._onWheelScroll, this);
+ L.DomEvent.on(this._map._container, 'MozMousePixelScroll', L.DomEvent.preventDefault);
+ this._delta = 0;
+ },
+
+ removeHooks: function () {
+ L.DomEvent.off(this._map._container, 'mousewheel', this._onWheelScroll);
+ L.DomEvent.off(this._map._container, 'MozMousePixelScroll', L.DomEvent.preventDefault);
+ },
+
+ _onWheelScroll: function (e) {
+ var delta = L.DomEvent.getWheelDelta(e);
+
+ this._delta += delta;
+ this._lastMousePos = this._map.mouseEventToContainerPoint(e);
+
+ if (!this._startTime) {
+ this._startTime = +new Date();
+ }
+
+ var left = Math.max(40 - (+new Date() - this._startTime), 0);
+
+ clearTimeout(this._timer);
+ this._timer = setTimeout(L.bind(this._performZoom, this), left);
+
+ L.DomEvent.preventDefault(e);
+ L.DomEvent.stopPropagation(e);
+ },
+
+ _performZoom: function () {
+ var map = this._map,
+ delta = this._delta,
+ zoom = map.getZoom();
+
+ delta = delta > 0 ? Math.ceil(delta) : Math.floor(delta);
+ delta = Math.max(Math.min(delta, 4), -4);
+ delta = map._limitZoom(zoom + delta) - zoom;
+
+ this._delta = 0;
+ this._startTime = null;
+
+ if (!delta) { return; }
+
+ if (map.options.scrollWheelZoom === 'center') {
+ map.setZoom(zoom + delta);
+ } else {
+ map.setZoomAround(this._lastMousePos, zoom + delta);
+ }
+ }
+});
+
+L.Map.addInitHook('addHandler', 'scrollWheelZoom', L.Map.ScrollWheelZoom);
+
+
+/*
+ * Extends the event handling code with double tap support for mobile browsers.
+ */
+
+L.extend(L.DomEvent, {
+
+ _touchstart: L.Browser.msPointer ? 'MSPointerDown' : L.Browser.pointer ? 'pointerdown' : 'touchstart',
+ _touchend: L.Browser.msPointer ? 'MSPointerUp' : L.Browser.pointer ? 'pointerup' : 'touchend',
+
+ // inspired by Zepto touch code by Thomas Fuchs
+ addDoubleTapListener: function (obj, handler, id) {
+ var last,
+ doubleTap = false,
+ delay = 250,
+ touch,
+ pre = '_leaflet_',
+ touchstart = this._touchstart,
+ touchend = this._touchend,
+ trackedTouches = [];
+
+ function onTouchStart(e) {
+ var count;
+
+ if (L.Browser.pointer) {
+ trackedTouches.push(e.pointerId);
+ count = trackedTouches.length;
+ } else {
+ count = e.touches.length;
+ }
+ if (count > 1) {
+ return;
+ }
+
+ var now = Date.now(),
+ delta = now - (last || now);
+
+ touch = e.touches ? e.touches[0] : e;
+ doubleTap = (delta > 0 && delta <= delay);
+ last = now;
+ }
+
+ function onTouchEnd(e) {
+ if (L.Browser.pointer) {
+ var idx = trackedTouches.indexOf(e.pointerId);
+ if (idx === -1) {
+ return;
+ }
+ trackedTouches.splice(idx, 1);
+ }
+
+ if (doubleTap) {
+ if (L.Browser.pointer) {
+ // work around .type being readonly with MSPointer* events
+ var newTouch = { },
+ prop;
+
+ // jshint forin:false
+ for (var i in touch) {
+ prop = touch[i];
+ if (typeof prop === 'function') {
+ newTouch[i] = prop.bind(touch);
+ } else {
+ newTouch[i] = prop;
+ }
+ }
+ touch = newTouch;
+ }
+ touch.type = 'dblclick';
+ handler(touch);
+ last = null;
+ }
+ }
+ obj[pre + touchstart + id] = onTouchStart;
+ obj[pre + touchend + id] = onTouchEnd;
+
+ // on pointer we need to listen on the document, otherwise a drag starting on the map and moving off screen
+ // will not come through to us, so we will lose track of how many touches are ongoing
+ var endElement = L.Browser.pointer ? document.documentElement : obj;
+
+ obj.addEventListener(touchstart, onTouchStart, false);
+ endElement.addEventListener(touchend, onTouchEnd, false);
+
+ if (L.Browser.pointer) {
+ endElement.addEventListener(L.DomEvent.POINTER_CANCEL, onTouchEnd, false);
+ }
+
+ return this;
+ },
+
+ removeDoubleTapListener: function (obj, id) {
+ var pre = '_leaflet_';
+
+ obj.removeEventListener(this._touchstart, obj[pre + this._touchstart + id], false);
+ (L.Browser.pointer ? document.documentElement : obj).removeEventListener(
+ this._touchend, obj[pre + this._touchend + id], false);
+
+ if (L.Browser.pointer) {
+ document.documentElement.removeEventListener(L.DomEvent.POINTER_CANCEL, obj[pre + this._touchend + id],
+ false);
+ }
+
+ return this;
+ }
+});
+
+
+/*
+ * Extends L.DomEvent to provide touch support for Internet Explorer and Windows-based devices.
+ */
+
+L.extend(L.DomEvent, {
+
+ //static
+ POINTER_DOWN: L.Browser.msPointer ? 'MSPointerDown' : 'pointerdown',
+ POINTER_MOVE: L.Browser.msPointer ? 'MSPointerMove' : 'pointermove',
+ POINTER_UP: L.Browser.msPointer ? 'MSPointerUp' : 'pointerup',
+ POINTER_CANCEL: L.Browser.msPointer ? 'MSPointerCancel' : 'pointercancel',
+
+ _pointers: [],
+ _pointerDocumentListener: false,
+
+ // Provides a touch events wrapper for (ms)pointer events.
+ // Based on changes by veproza https://github.com/CloudMade/Leaflet/pull/1019
+ //ref http://www.w3.org/TR/pointerevents/ https://www.w3.org/Bugs/Public/show_bug.cgi?id=22890
+
+ addPointerListener: function (obj, type, handler, id) {
+
+ switch (type) {
+ case 'touchstart':
+ return this.addPointerListenerStart(obj, type, handler, id);
+ case 'touchend':
+ return this.addPointerListenerEnd(obj, type, handler, id);
+ case 'touchmove':
+ return this.addPointerListenerMove(obj, type, handler, id);
+ default:
+ throw 'Unknown touch event type';
+ }
+ },
+
+ addPointerListenerStart: function (obj, type, handler, id) {
+ var pre = '_leaflet_',
+ pointers = this._pointers;
+
+ var cb = function (e) {
+ if (e.pointerType !== 'mouse' && e.pointerType !== e.MSPOINTER_TYPE_MOUSE) {
+ L.DomEvent.preventDefault(e);
+ }
+
+ var alreadyInArray = false;
+ for (var i = 0; i < pointers.length; i++) {
+ if (pointers[i].pointerId === e.pointerId) {
+ alreadyInArray = true;
+ break;
+ }
+ }
+ if (!alreadyInArray) {
+ pointers.push(e);
+ }
+
+ e.touches = pointers.slice();
+ e.changedTouches = [e];
+
+ handler(e);
+ };
+
+ obj[pre + 'touchstart' + id] = cb;
+ obj.addEventListener(this.POINTER_DOWN, cb, false);
+
+ // need to also listen for end events to keep the _pointers list accurate
+ // this needs to be on the body and never go away
+ if (!this._pointerDocumentListener) {
+ var internalCb = function (e) {
+ for (var i = 0; i < pointers.length; i++) {
+ if (pointers[i].pointerId === e.pointerId) {
+ pointers.splice(i, 1);
+ break;
+ }
+ }
+ };
+ //We listen on the documentElement as any drags that end by moving the touch off the screen get fired there
+ document.documentElement.addEventListener(this.POINTER_UP, internalCb, false);
+ document.documentElement.addEventListener(this.POINTER_CANCEL, internalCb, false);
+
+ this._pointerDocumentListener = true;
+ }
+
+ return this;
+ },
+
+ addPointerListenerMove: function (obj, type, handler, id) {
+ var pre = '_leaflet_',
+ touches = this._pointers;
+
+ function cb(e) {
+
+ // don't fire touch moves when mouse isn't down
+ if ((e.pointerType === e.MSPOINTER_TYPE_MOUSE || e.pointerType === 'mouse') && e.buttons === 0) { return; }
+
+ for (var i = 0; i < touches.length; i++) {
+ if (touches[i].pointerId === e.pointerId) {
+ touches[i] = e;
+ break;
+ }
+ }
+
+ e.touches = touches.slice();
+ e.changedTouches = [e];
+
+ handler(e);
+ }
+
+ obj[pre + 'touchmove' + id] = cb;
+ obj.addEventListener(this.POINTER_MOVE, cb, false);
+
+ return this;
+ },
+
+ addPointerListenerEnd: function (obj, type, handler, id) {
+ var pre = '_leaflet_',
+ touches = this._pointers;
+
+ var cb = function (e) {
+ for (var i = 0; i < touches.length; i++) {
+ if (touches[i].pointerId === e.pointerId) {
+ touches.splice(i, 1);
+ break;
+ }
+ }
+
+ e.touches = touches.slice();
+ e.changedTouches = [e];
+
+ handler(e);
+ };
+
+ obj[pre + 'touchend' + id] = cb;
+ obj.addEventListener(this.POINTER_UP, cb, false);
+ obj.addEventListener(this.POINTER_CANCEL, cb, false);
+
+ return this;
+ },
+
+ removePointerListener: function (obj, type, id) {
+ var pre = '_leaflet_',
+ cb = obj[pre + type + id];
+
+ switch (type) {
+ case 'touchstart':
+ obj.removeEventListener(this.POINTER_DOWN, cb, false);
+ break;
+ case 'touchmove':
+ obj.removeEventListener(this.POINTER_MOVE, cb, false);
+ break;
+ case 'touchend':
+ obj.removeEventListener(this.POINTER_UP, cb, false);
+ obj.removeEventListener(this.POINTER_CANCEL, cb, false);
+ break;
+ }
+
+ return this;
+ }
+});
+
+
+/*
+ * L.Handler.TouchZoom is used by L.Map to add pinch zoom on supported mobile browsers.
+ */
+
+L.Map.mergeOptions({
+ touchZoom: L.Browser.touch && !L.Browser.android23,
+ bounceAtZoomLimits: true
+});
+
+L.Map.TouchZoom = L.Handler.extend({
+ addHooks: function () {
+ L.DomEvent.on(this._map._container, 'touchstart', this._onTouchStart, this);
+ },
+
+ removeHooks: function () {
+ L.DomEvent.off(this._map._container, 'touchstart', this._onTouchStart, this);
+ },
+
+ _onTouchStart: function (e) {
+ var map = this._map;
+
+ if (!e.touches || e.touches.length !== 2 || map._animatingZoom || this._zooming) { return; }
+
+ var p1 = map.mouseEventToLayerPoint(e.touches[0]),
+ p2 = map.mouseEventToLayerPoint(e.touches[1]),
+ viewCenter = map._getCenterLayerPoint();
+
+ this._startCenter = p1.add(p2)._divideBy(2);
+ this._startDist = p1.distanceTo(p2);
+
+ this._moved = false;
+ this._zooming = true;
+
+ this._centerOffset = viewCenter.subtract(this._startCenter);
+
+ if (map._panAnim) {
+ map._panAnim.stop();
+ }
+
+ L.DomEvent
+ .on(document, 'touchmove', this._onTouchMove, this)
+ .on(document, 'touchend', this._onTouchEnd, this);
+
+ L.DomEvent.preventDefault(e);
+ },
+
+ _onTouchMove: function (e) {
+ var map = this._map;
+
+ if (!e.touches || e.touches.length !== 2 || !this._zooming) { return; }
+
+ var p1 = map.mouseEventToLayerPoint(e.touches[0]),
+ p2 = map.mouseEventToLayerPoint(e.touches[1]);
+
+ this._scale = p1.distanceTo(p2) / this._startDist;
+ this._delta = p1._add(p2)._divideBy(2)._subtract(this._startCenter);
+
+ if (this._scale === 1) { return; }
+
+ if (!map.options.bounceAtZoomLimits) {
+ if ((map.getZoom() === map.getMinZoom() && this._scale < 1) ||
+ (map.getZoom() === map.getMaxZoom() && this._scale > 1)) { return; }
+ }
+
+ if (!this._moved) {
+ L.DomUtil.addClass(map._mapPane, 'leaflet-touching');
+
+ map
+ .fire('movestart')
+ .fire('zoomstart');
+
+ this._moved = true;
+ }
+
+ L.Util.cancelAnimFrame(this._animRequest);
+ this._animRequest = L.Util.requestAnimFrame(
+ this._updateOnMove, this, true, this._map._container);
+
+ L.DomEvent.preventDefault(e);
+ },
+
+ _updateOnMove: function () {
+ var map = this._map,
+ origin = this._getScaleOrigin(),
+ center = map.layerPointToLatLng(origin),
+ zoom = map.getScaleZoom(this._scale);
+
+ map._animateZoom(center, zoom, this._startCenter, this._scale, this._delta, false, true);
+ },
+
+ _onTouchEnd: function () {
+ if (!this._moved || !this._zooming) {
+ this._zooming = false;
+ return;
+ }
+
+ var map = this._map;
+
+ this._zooming = false;
+ L.DomUtil.removeClass(map._mapPane, 'leaflet-touching');
+ L.Util.cancelAnimFrame(this._animRequest);
+
+ L.DomEvent
+ .off(document, 'touchmove', this._onTouchMove)
+ .off(document, 'touchend', this._onTouchEnd);
+
+ var origin = this._getScaleOrigin(),
+ center = map.layerPointToLatLng(origin),
+
+ oldZoom = map.getZoom(),
+ floatZoomDelta = map.getScaleZoom(this._scale) - oldZoom,
+ roundZoomDelta = (floatZoomDelta > 0 ?
+ Math.ceil(floatZoomDelta) : Math.floor(floatZoomDelta)),
+
+ zoom = map._limitZoom(oldZoom + roundZoomDelta),
+ scale = map.getZoomScale(zoom) / this._scale;
+
+ map._animateZoom(center, zoom, origin, scale);
+ },
+
+ _getScaleOrigin: function () {
+ var centerOffset = this._centerOffset.subtract(this._delta).divideBy(this._scale);
+ return this._startCenter.add(centerOffset);
+ }
+});
+
+L.Map.addInitHook('addHandler', 'touchZoom', L.Map.TouchZoom);
+
+
+/*
+ * L.Map.Tap is used to enable mobile hacks like quick taps and long hold.
+ */
+
+L.Map.mergeOptions({
+ tap: true,
+ tapTolerance: 15
+});
+
+L.Map.Tap = L.Handler.extend({
+ addHooks: function () {
+ L.DomEvent.on(this._map._container, 'touchstart', this._onDown, this);
+ },
+
+ removeHooks: function () {
+ L.DomEvent.off(this._map._container, 'touchstart', this._onDown, this);
+ },
+
+ _onDown: function (e) {
+ if (!e.touches) { return; }
+
+ L.DomEvent.preventDefault(e);
+
+ this._fireClick = true;
+
+ // don't simulate click or track longpress if more than 1 touch
+ if (e.touches.length > 1) {
+ this._fireClick = false;
+ clearTimeout(this._holdTimeout);
+ return;
+ }
+
+ var first = e.touches[0],
+ el = first.target;
+
+ this._startPos = this._newPos = new L.Point(first.clientX, first.clientY);
+
+ // if touching a link, highlight it
+ if (el.tagName && el.tagName.toLowerCase() === 'a') {
+ L.DomUtil.addClass(el, 'leaflet-active');
+ }
+
+ // simulate long hold but setting a timeout
+ this._holdTimeout = setTimeout(L.bind(function () {
+ if (this._isTapValid()) {
+ this._fireClick = false;
+ this._onUp();
+ this._simulateEvent('contextmenu', first);
+ }
+ }, this), 1000);
+
+ L.DomEvent
+ .on(document, 'touchmove', this._onMove, this)
+ .on(document, 'touchend', this._onUp, this);
+ },
+
+ _onUp: function (e) {
+ clearTimeout(this._holdTimeout);
+
+ L.DomEvent
+ .off(document, 'touchmove', this._onMove, this)
+ .off(document, 'touchend', this._onUp, this);
+
+ if (this._fireClick && e && e.changedTouches) {
+
+ var first = e.changedTouches[0],
+ el = first.target;
+
+ if (el && el.tagName && el.tagName.toLowerCase() === 'a') {
+ L.DomUtil.removeClass(el, 'leaflet-active');
+ }
+
+ // simulate click if the touch didn't move too much
+ if (this._isTapValid()) {
+ this._simulateEvent('click', first);
+ }
+ }
+ },
+
+ _isTapValid: function () {
+ return this._newPos.distanceTo(this._startPos) <= this._map.options.tapTolerance;
+ },
+
+ _onMove: function (e) {
+ var first = e.touches[0];
+ this._newPos = new L.Point(first.clientX, first.clientY);
+ },
+
+ _simulateEvent: function (type, e) {
+ var simulatedEvent = document.createEvent('MouseEvents');
+
+ simulatedEvent._simulated = true;
+ e.target._simulatedClick = true;
+
+ simulatedEvent.initMouseEvent(
+ type, true, true, window, 1,
+ e.screenX, e.screenY,
+ e.clientX, e.clientY,
+ false, false, false, false, 0, null);
+
+ e.target.dispatchEvent(simulatedEvent);
+ }
+});
+
+if (L.Browser.touch && !L.Browser.pointer) {
+ L.Map.addInitHook('addHandler', 'tap', L.Map.Tap);
+}
+
+
+/*
+ * L.Handler.ShiftDragZoom is used to add shift-drag zoom interaction to the map
+ * (zoom to a selected bounding box), enabled by default.
+ */
+
+L.Map.mergeOptions({
+ boxZoom: true
+});
+
+L.Map.BoxZoom = L.Handler.extend({
+ initialize: function (map) {
+ this._map = map;
+ this._container = map._container;
+ this._pane = map._panes.overlayPane;
+ this._moved = false;
+ },
+
+ addHooks: function () {
+ L.DomEvent.on(this._container, 'mousedown', this._onMouseDown, this);
+ },
+
+ removeHooks: function () {
+ L.DomEvent.off(this._container, 'mousedown', this._onMouseDown);
+ this._moved = false;
+ },
+
+ moved: function () {
+ return this._moved;
+ },
+
+ _onMouseDown: function (e) {
+ this._moved = false;
+
+ if (!e.shiftKey || ((e.which !== 1) && (e.button !== 1))) { return false; }
+
+ L.DomUtil.disableTextSelection();
+ L.DomUtil.disableImageDrag();
+
+ this._startLayerPoint = this._map.mouseEventToLayerPoint(e);
+
+ L.DomEvent
+ .on(document, 'mousemove', this._onMouseMove, this)
+ .on(document, 'mouseup', this._onMouseUp, this)
+ .on(document, 'keydown', this._onKeyDown, this);
+ },
+
+ _onMouseMove: function (e) {
+ if (!this._moved) {
+ this._box = L.DomUtil.create('div', 'leaflet-zoom-box', this._pane);
+ L.DomUtil.setPosition(this._box, this._startLayerPoint);
+
+ //TODO refactor: move cursor to styles
+ this._container.style.cursor = 'crosshair';
+ this._map.fire('boxzoomstart');
+ }
+
+ var startPoint = this._startLayerPoint,
+ box = this._box,
+
+ layerPoint = this._map.mouseEventToLayerPoint(e),
+ offset = layerPoint.subtract(startPoint),
+
+ newPos = new L.Point(
+ Math.min(layerPoint.x, startPoint.x),
+ Math.min(layerPoint.y, startPoint.y));
+
+ L.DomUtil.setPosition(box, newPos);
+
+ this._moved = true;
+
+ // TODO refactor: remove hardcoded 4 pixels
+ box.style.width = (Math.max(0, Math.abs(offset.x) - 4)) + 'px';
+ box.style.height = (Math.max(0, Math.abs(offset.y) - 4)) + 'px';
+ },
+
+ _finish: function () {
+ if (this._moved) {
+ this._pane.removeChild(this._box);
+ this._container.style.cursor = '';
+ }
+
+ L.DomUtil.enableTextSelection();
+ L.DomUtil.enableImageDrag();
+
+ L.DomEvent
+ .off(document, 'mousemove', this._onMouseMove)
+ .off(document, 'mouseup', this._onMouseUp)
+ .off(document, 'keydown', this._onKeyDown);
+ },
+
+ _onMouseUp: function (e) {
+
+ this._finish();
+
+ var map = this._map,
+ layerPoint = map.mouseEventToLayerPoint(e);
+
+ if (this._startLayerPoint.equals(layerPoint)) { return; }
+
+ var bounds = new L.LatLngBounds(
+ map.layerPointToLatLng(this._startLayerPoint),
+ map.layerPointToLatLng(layerPoint));
+
+ map.fitBounds(bounds);
+
+ map.fire('boxzoomend', {
+ boxZoomBounds: bounds
+ });
+ },
+
+ _onKeyDown: function (e) {
+ if (e.keyCode === 27) {
+ this._finish();
+ }
+ }
+});
+
+L.Map.addInitHook('addHandler', 'boxZoom', L.Map.BoxZoom);
+
+
+/*
+ * L.Map.Keyboard is handling keyboard interaction with the map, enabled by default.
+ */
+
+L.Map.mergeOptions({
+ keyboard: true,
+ keyboardPanOffset: 80,
+ keyboardZoomOffset: 1
+});
+
+L.Map.Keyboard = L.Handler.extend({
+
+ keyCodes: {
+ left: [37],
+ right: [39],
+ down: [40],
+ up: [38],
+ zoomIn: [187, 107, 61, 171],
+ zoomOut: [189, 109, 173]
+ },
+
+ initialize: function (map) {
+ this._map = map;
+
+ this._setPanOffset(map.options.keyboardPanOffset);
+ this._setZoomOffset(map.options.keyboardZoomOffset);
+ },
+
+ addHooks: function () {
+ var container = this._map._container;
+
+ // make the container focusable by tabbing
+ if (container.tabIndex === -1) {
+ container.tabIndex = '0';
+ }
+
+ L.DomEvent
+ .on(container, 'focus', this._onFocus, this)
+ .on(container, 'blur', this._onBlur, this)
+ .on(container, 'mousedown', this._onMouseDown, this);
+
+ this._map
+ .on('focus', this._addHooks, this)
+ .on('blur', this._removeHooks, this);
+ },
+
+ removeHooks: function () {
+ this._removeHooks();
+
+ var container = this._map._container;
+
+ L.DomEvent
+ .off(container, 'focus', this._onFocus, this)
+ .off(container, 'blur', this._onBlur, this)
+ .off(container, 'mousedown', this._onMouseDown, this);
+
+ this._map
+ .off('focus', this._addHooks, this)
+ .off('blur', this._removeHooks, this);
+ },
+
+ _onMouseDown: function () {
+ if (this._focused) { return; }
+
+ var body = document.body,
+ docEl = document.documentElement,
+ top = body.scrollTop || docEl.scrollTop,
+ left = body.scrollLeft || docEl.scrollLeft;
+
+ this._map._container.focus();
+
+ window.scrollTo(left, top);
+ },
+
+ _onFocus: function () {
+ this._focused = true;
+ this._map.fire('focus');
+ },
+
+ _onBlur: function () {
+ this._focused = false;
+ this._map.fire('blur');
+ },
+
+ _setPanOffset: function (pan) {
+ var keys = this._panKeys = {},
+ codes = this.keyCodes,
+ i, len;
+
+ for (i = 0, len = codes.left.length; i < len; i++) {
+ keys[codes.left[i]] = [-1 * pan, 0];
+ }
+ for (i = 0, len = codes.right.length; i < len; i++) {
+ keys[codes.right[i]] = [pan, 0];
+ }
+ for (i = 0, len = codes.down.length; i < len; i++) {
+ keys[codes.down[i]] = [0, pan];
+ }
+ for (i = 0, len = codes.up.length; i < len; i++) {
+ keys[codes.up[i]] = [0, -1 * pan];
+ }
+ },
+
+ _setZoomOffset: function (zoom) {
+ var keys = this._zoomKeys = {},
+ codes = this.keyCodes,
+ i, len;
+
+ for (i = 0, len = codes.zoomIn.length; i < len; i++) {
+ keys[codes.zoomIn[i]] = zoom;
+ }
+ for (i = 0, len = codes.zoomOut.length; i < len; i++) {
+ keys[codes.zoomOut[i]] = -zoom;
+ }
+ },
+
+ _addHooks: function () {
+ L.DomEvent.on(document, 'keydown', this._onKeyDown, this);
+ },
+
+ _removeHooks: function () {
+ L.DomEvent.off(document, 'keydown', this._onKeyDown, this);
+ },
+
+ _onKeyDown: function (e) {
+ var key = e.keyCode,
+ map = this._map;
+
+ if (key in this._panKeys) {
+
+ if (map._panAnim && map._panAnim._inProgress) { return; }
+
+ map.panBy(this._panKeys[key]);
+
+ if (map.options.maxBounds) {
+ map.panInsideBounds(map.options.maxBounds);
+ }
+
+ } else if (key in this._zoomKeys) {
+ map.setZoom(map.getZoom() + this._zoomKeys[key]);
+
+ } else {
+ return;
+ }
+
+ L.DomEvent.stop(e);
+ }
+});
+
+L.Map.addInitHook('addHandler', 'keyboard', L.Map.Keyboard);
+
+
+/*
+ * L.Handler.MarkerDrag is used internally by L.Marker to make the markers draggable.
+ */
+
+L.Handler.MarkerDrag = L.Handler.extend({
+ initialize: function (marker) {
+ this._marker = marker;
+ },
+
+ addHooks: function () {
+ var icon = this._marker._icon;
+ if (!this._draggable) {
+ this._draggable = new L.Draggable(icon, icon);
+ }
+
+ this._draggable
+ .on('dragstart', this._onDragStart, this)
+ .on('drag', this._onDrag, this)
+ .on('dragend', this._onDragEnd, this);
+ this._draggable.enable();
+ L.DomUtil.addClass(this._marker._icon, 'leaflet-marker-draggable');
+ },
+
+ removeHooks: function () {
+ this._draggable
+ .off('dragstart', this._onDragStart, this)
+ .off('drag', this._onDrag, this)
+ .off('dragend', this._onDragEnd, this);
+
+ this._draggable.disable();
+ L.DomUtil.removeClass(this._marker._icon, 'leaflet-marker-draggable');
+ },
+
+ moved: function () {
+ return this._draggable && this._draggable._moved;
+ },
+
+ _onDragStart: function () {
+ this._marker
+ .closePopup()
+ .fire('movestart')
+ .fire('dragstart');
+ },
+
+ _onDrag: function () {
+ var marker = this._marker,
+ shadow = marker._shadow,
+ iconPos = L.DomUtil.getPosition(marker._icon),
+ latlng = marker._map.layerPointToLatLng(iconPos);
+
+ // update shadow position
+ if (shadow) {
+ L.DomUtil.setPosition(shadow, iconPos);
+ }
+
+ marker._latlng = latlng;
+
+ marker
+ .fire('move', {latlng: latlng})
+ .fire('drag');
+ },
+
+ _onDragEnd: function (e) {
+ this._marker
+ .fire('moveend')
+ .fire('dragend', e);
+ }
+});
+
+
+/*
+ * L.Control is a base class for implementing map controls. Handles positioning.
+ * All other controls extend from this class.
+ */
+
+L.Control = L.Class.extend({
+ options: {
+ position: 'topright'
+ },
+
+ initialize: function (options) {
+ L.setOptions(this, options);
+ },
+
+ getPosition: function () {
+ return this.options.position;
+ },
+
+ setPosition: function (position) {
+ var map = this._map;
+
+ if (map) {
+ map.removeControl(this);
+ }
+
+ this.options.position = position;
+
+ if (map) {
+ map.addControl(this);
+ }
+
+ return this;
+ },
+
+ getContainer: function () {
+ return this._container;
+ },
+
+ addTo: function (map) {
+ this._map = map;
+
+ var container = this._container = this.onAdd(map),
+ pos = this.getPosition(),
+ corner = map._controlCorners[pos];
+
+ L.DomUtil.addClass(container, 'leaflet-control');
+
+ if (pos.indexOf('bottom') !== -1) {
+ corner.insertBefore(container, corner.firstChild);
+ } else {
+ corner.appendChild(container);
+ }
+
+ return this;
+ },
+
+ removeFrom: function (map) {
+ var pos = this.getPosition(),
+ corner = map._controlCorners[pos];
+
+ corner.removeChild(this._container);
+ this._map = null;
+
+ if (this.onRemove) {
+ this.onRemove(map);
+ }
+
+ return this;
+ },
+
+ _refocusOnMap: function () {
+ if (this._map) {
+ this._map.getContainer().focus();
+ }
+ }
+});
+
+L.control = function (options) {
+ return new L.Control(options);
+};
+
+
+// adds control-related methods to L.Map
+
+L.Map.include({
+ addControl: function (control) {
+ control.addTo(this);
+ return this;
+ },
+
+ removeControl: function (control) {
+ control.removeFrom(this);
+ return this;
+ },
+
+ _initControlPos: function () {
+ var corners = this._controlCorners = {},
+ l = 'leaflet-',
+ container = this._controlContainer =
+ L.DomUtil.create('div', l + 'control-container', this._container);
+
+ function createCorner(vSide, hSide) {
+ var className = l + vSide + ' ' + l + hSide;
+
+ corners[vSide + hSide] = L.DomUtil.create('div', className, container);
+ }
+
+ createCorner('top', 'left');
+ createCorner('top', 'right');
+ createCorner('bottom', 'left');
+ createCorner('bottom', 'right');
+ },
+
+ _clearControlPos: function () {
+ this._container.removeChild(this._controlContainer);
+ }
+});
+
+
+/*
+ * L.Control.Zoom is used for the default zoom buttons on the map.
+ */
+
+L.Control.Zoom = L.Control.extend({
+ options: {
+ position: 'topleft',
+ zoomInText: '+',
+ zoomInTitle: 'Zoom in',
+ zoomOutText: '-',
+ zoomOutTitle: 'Zoom out'
+ },
+
+ onAdd: function (map) {
+ var zoomName = 'leaflet-control-zoom',
+ container = L.DomUtil.create('div', zoomName + ' leaflet-bar');
+
+ this._map = map;
+
+ this._zoomInButton = this._createButton(
+ this.options.zoomInText, this.options.zoomInTitle,
+ zoomName + '-in', container, this._zoomIn, this);
+ this._zoomOutButton = this._createButton(
+ this.options.zoomOutText, this.options.zoomOutTitle,
+ zoomName + '-out', container, this._zoomOut, this);
+
+ this._updateDisabled();
+ map.on('zoomend zoomlevelschange', this._updateDisabled, this);
+
+ return container;
+ },
+
+ onRemove: function (map) {
+ map.off('zoomend zoomlevelschange', this._updateDisabled, this);
+ },
+
+ _zoomIn: function (e) {
+ this._map.zoomIn(e.shiftKey ? 3 : 1);
+ },
+
+ _zoomOut: function (e) {
+ this._map.zoomOut(e.shiftKey ? 3 : 1);
+ },
+
+ _createButton: function (html, title, className, container, fn, context) {
+ var link = L.DomUtil.create('a', className, container);
+ link.innerHTML = html;
+ link.href = '#';
+ link.title = title;
+
+ var stop = L.DomEvent.stopPropagation;
+
+ L.DomEvent
+ .on(link, 'click', stop)
+ .on(link, 'mousedown', stop)
+ .on(link, 'dblclick', stop)
+ .on(link, 'click', L.DomEvent.preventDefault)
+ .on(link, 'click', fn, context)
+ .on(link, 'click', this._refocusOnMap, context);
+
+ return link;
+ },
+
+ _updateDisabled: function () {
+ var map = this._map,
+ className = 'leaflet-disabled';
+
+ L.DomUtil.removeClass(this._zoomInButton, className);
+ L.DomUtil.removeClass(this._zoomOutButton, className);
+
+ if (map._zoom === map.getMinZoom()) {
+ L.DomUtil.addClass(this._zoomOutButton, className);
+ }
+ if (map._zoom === map.getMaxZoom()) {
+ L.DomUtil.addClass(this._zoomInButton, className);
+ }
+ }
+});
+
+L.Map.mergeOptions({
+ zoomControl: true
+});
+
+L.Map.addInitHook(function () {
+ if (this.options.zoomControl) {
+ this.zoomControl = new L.Control.Zoom();
+ this.addControl(this.zoomControl);
+ }
+});
+
+L.control.zoom = function (options) {
+ return new L.Control.Zoom(options);
+};
+
+
+
+/*
+ * L.Control.Attribution is used for displaying attribution on the map (added by default).
+ */
+
+L.Control.Attribution = L.Control.extend({
+ options: {
+ position: 'bottomright',
+ prefix: '<a href="http://leafletjs.com" title="A JS library for interactive maps">Leaflet</a>'
+ },
+
+ initialize: function (options) {
+ L.setOptions(this, options);
+
+ this._attributions = {};
+ },
+
+ onAdd: function (map) {
+ this._container = L.DomUtil.create('div', 'leaflet-control-attribution');
+ L.DomEvent.disableClickPropagation(this._container);
+
+ for (var i in map._layers) {
+ if (map._layers[i].getAttribution) {
+ this.addAttribution(map._layers[i].getAttribution());
+ }
+ }
+
+ map
+ .on('layeradd', this._onLayerAdd, this)
+ .on('layerremove', this._onLayerRemove, this);
+
+ this._update();
+
+ return this._container;
+ },
+
+ onRemove: function (map) {
+ map
+ .off('layeradd', this._onLayerAdd)
+ .off('layerremove', this._onLayerRemove);
+
+ },
+
+ setPrefix: function (prefix) {
+ this.options.prefix = prefix;
+ this._update();
+ return this;
+ },
+
+ addAttribution: function (text) {
+ if (!text) { return; }
+
+ if (!this._attributions[text]) {
+ this._attributions[text] = 0;
+ }
+ this._attributions[text]++;
+
+ this._update();
+
+ return this;
+ },
+
+ removeAttribution: function (text) {
+ if (!text) { return; }
+
+ if (this._attributions[text]) {
+ this._attributions[text]--;
+ this._update();
+ }
+
+ return this;
+ },
+
+ _update: function () {
+ if (!this._map) { return; }
+
+ var attribs = [];
+
+ for (var i in this._attributions) {
+ if (this._attributions[i]) {
+ attribs.push(i);
+ }
+ }
+
+ var prefixAndAttribs = [];
+
+ if (this.options.prefix) {
+ prefixAndAttribs.push(this.options.prefix);
+ }
+ if (attribs.length) {
+ prefixAndAttribs.push(attribs.join(', '));
+ }
+
+ this._container.innerHTML = prefixAndAttribs.join(' | ');
+ },
+
+ _onLayerAdd: function (e) {
+ if (e.layer.getAttribution) {
+ this.addAttribution(e.layer.getAttribution());
+ }
+ },
+
+ _onLayerRemove: function (e) {
+ if (e.layer.getAttribution) {
+ this.removeAttribution(e.layer.getAttribution());
+ }
+ }
+});
+
+L.Map.mergeOptions({
+ attributionControl: true
+});
+
+L.Map.addInitHook(function () {
+ if (this.options.attributionControl) {
+ this.attributionControl = (new L.Control.Attribution()).addTo(this);
+ }
+});
+
+L.control.attribution = function (options) {
+ return new L.Control.Attribution(options);
+};
+
+
+/*
+ * L.Control.Scale is used for displaying metric/imperial scale on the map.
+ */
+
+L.Control.Scale = L.Control.extend({
+ options: {
+ position: 'bottomleft',
+ maxWidth: 100,
+ metric: true,
+ imperial: true,
+ updateWhenIdle: false
+ },
+
+ onAdd: function (map) {
+ this._map = map;
+
+ var className = 'leaflet-control-scale',
+ container = L.DomUtil.create('div', className),
+ options = this.options;
+
+ this._addScales(options, className, container);
+
+ map.on(options.updateWhenIdle ? 'moveend' : 'move', this._update, this);
+ map.whenReady(this._update, this);
+
+ return container;
+ },
+
+ onRemove: function (map) {
+ map.off(this.options.updateWhenIdle ? 'moveend' : 'move', this._update, this);
+ },
+
+ _addScales: function (options, className, container) {
+ if (options.metric) {
+ this._mScale = L.DomUtil.create('div', className + '-line', container);
+ }
+ if (options.imperial) {
+ this._iScale = L.DomUtil.create('div', className + '-line', container);
+ }
+ },
+
+ _update: function () {
+ var bounds = this._map.getBounds(),
+ centerLat = bounds.getCenter().lat,
+ halfWorldMeters = 6378137 * Math.PI * Math.cos(centerLat * Math.PI / 180),
+ dist = halfWorldMeters * (bounds.getNorthEast().lng - bounds.getSouthWest().lng) / 180,
+
+ size = this._map.getSize(),
+ options = this.options,
+ maxMeters = 0;
+
+ if (size.x > 0) {
+ maxMeters = dist * (options.maxWidth / size.x);
+ }
+
+ this._updateScales(options, maxMeters);
+ },
+
+ _updateScales: function (options, maxMeters) {
+ if (options.metric && maxMeters) {
+ this._updateMetric(maxMeters);
+ }
+
+ if (options.imperial && maxMeters) {
+ this._updateImperial(maxMeters);
+ }
+ },
+
+ _updateMetric: function (maxMeters) {
+ var meters = this._getRoundNum(maxMeters);
+
+ this._mScale.style.width = this._getScaleWidth(meters / maxMeters) + 'px';
+ this._mScale.innerHTML = meters < 1000 ? meters + ' m' : (meters / 1000) + ' km';
+ },
+
+ _updateImperial: function (maxMeters) {
+ var maxFeet = maxMeters * 3.2808399,
+ scale = this._iScale,
+ maxMiles, miles, feet;
+
+ if (maxFeet > 5280) {
+ maxMiles = maxFeet / 5280;
+ miles = this._getRoundNum(maxMiles);
+
+ scale.style.width = this._getScaleWidth(miles / maxMiles) + 'px';
+ scale.innerHTML = miles + ' mi';
+
+ } else {
+ feet = this._getRoundNum(maxFeet);
+
+ scale.style.width = this._getScaleWidth(feet / maxFeet) + 'px';
+ scale.innerHTML = feet + ' ft';
+ }
+ },
+
+ _getScaleWidth: function (ratio) {
+ return Math.round(this.options.maxWidth * ratio) - 10;
+ },
+
+ _getRoundNum: function (num) {
+ var pow10 = Math.pow(10, (Math.floor(num) + '').length - 1),
+ d = num / pow10;
+
+ d = d >= 10 ? 10 : d >= 5 ? 5 : d >= 3 ? 3 : d >= 2 ? 2 : 1;
+
+ return pow10 * d;
+ }
+});
+
+L.control.scale = function (options) {
+ return new L.Control.Scale(options);
+};
+
+
+/*
+ * L.Control.Layers is a control to allow users to switch between different layers on the map.
+ */
+
+L.Control.Layers = L.Control.extend({
+ options: {
+ collapsed: true,
+ position: 'topright',
+ autoZIndex: true
+ },
+
+ initialize: function (baseLayers, overlays, options) {
+ L.setOptions(this, options);
+
+ this._layers = {};
+ this._lastZIndex = 0;
+ this._handlingClick = false;
+
+ for (var i in baseLayers) {
+ this._addLayer(baseLayers[i], i);
+ }
+
+ for (i in overlays) {
+ this._addLayer(overlays[i], i, true);
+ }
+ },
+
+ onAdd: function (map) {
+ this._initLayout();
+ this._update();
+
+ map
+ .on('layeradd', this._onLayerChange, this)
+ .on('layerremove', this._onLayerChange, this);
+
+ return this._container;
+ },
+
+ onRemove: function (map) {
+ map
+ .off('layeradd', this._onLayerChange, this)
+ .off('layerremove', this._onLayerChange, this);
+ },
+
+ addBaseLayer: function (layer, name) {
+ this._addLayer(layer, name);
+ this._update();
+ return this;
+ },
+
+ addOverlay: function (layer, name) {
+ this._addLayer(layer, name, true);
+ this._update();
+ return this;
+ },
+
+ removeLayer: function (layer) {
+ var id = L.stamp(layer);
+ delete this._layers[id];
+ this._update();
+ return this;
+ },
+
+ _initLayout: function () {
+ var className = 'leaflet-control-layers',
+ container = this._container = L.DomUtil.create('div', className);
+
+ //Makes this work on IE10 Touch devices by stopping it from firing a mouseout event when the touch is released
+ container.setAttribute('aria-haspopup', true);
+
+ if (!L.Browser.touch) {
+ L.DomEvent
+ .disableClickPropagation(container)
+ .disableScrollPropagation(container);
+ } else {
+ L.DomEvent.on(container, 'click', L.DomEvent.stopPropagation);
+ }
+
+ var form = this._form = L.DomUtil.create('form', className + '-list');
+
+ if (this.options.collapsed) {
+ if (!L.Browser.android) {
+ L.DomEvent
+ .on(container, 'mouseover', this._expand, this)
+ .on(container, 'mouseout', this._collapse, this);
+ }
+ var link = this._layersLink = L.DomUtil.create('a', className + '-toggle', container);
+ link.href = '#';
+ link.title = 'Layers';
+
+ if (L.Browser.touch) {
+ L.DomEvent
+ .on(link, 'click', L.DomEvent.stop)
+ .on(link, 'click', this._expand, this);
+ }
+ else {
+ L.DomEvent.on(link, 'focus', this._expand, this);
+ }
+ //Work around for Firefox android issue https://github.com/Leaflet/Leaflet/issues/2033
+ L.DomEvent.on(form, 'click', function () {
+ setTimeout(L.bind(this._onInputClick, this), 0);
+ }, this);
+
+ this._map.on('click', this._collapse, this);
+ // TODO keyboard accessibility
+ } else {
+ this._expand();
+ }
+
+ this._baseLayersList = L.DomUtil.create('div', className + '-base', form);
+ this._separator = L.DomUtil.create('div', className + '-separator', form);
+ this._overlaysList = L.DomUtil.create('div', className + '-overlays', form);
+
+ container.appendChild(form);
+ },
+
+ _addLayer: function (layer, name, overlay) {
+ var id = L.stamp(layer);
+
+ this._layers[id] = {
+ layer: layer,
+ name: name,
+ overlay: overlay
+ };
+
+ if (this.options.autoZIndex && layer.setZIndex) {
+ this._lastZIndex++;
+ layer.setZIndex(this._lastZIndex);
+ }
+ },
+
+ _update: function () {
+ if (!this._container) {
+ return;
+ }
+
+ this._baseLayersList.innerHTML = '';
+ this._overlaysList.innerHTML = '';
+
+ var baseLayersPresent = false,
+ overlaysPresent = false,
+ i, obj;
+
+ for (i in this._layers) {
+ obj = this._layers[i];
+ this._addItem(obj);
+ overlaysPresent = overlaysPresent || obj.overlay;
+ baseLayersPresent = baseLayersPresent || !obj.overlay;
+ }
+
+ this._separator.style.display = overlaysPresent && baseLayersPresent ? '' : 'none';
+ },
+
+ _onLayerChange: function (e) {
+ var obj = this._layers[L.stamp(e.layer)];
+
+ if (!obj) { return; }
+
+ if (!this._handlingClick) {
+ this._update();
+ }
+
+ var type = obj.overlay ?
+ (e.type === 'layeradd' ? 'overlayadd' : 'overlayremove') :
+ (e.type === 'layeradd' ? 'baselayerchange' : null);
+
+ if (type) {
+ this._map.fire(type, obj);
+ }
+ },
+
+ // IE7 bugs out if you create a radio dynamically, so you have to do it this hacky way (see http://bit.ly/PqYLBe)
+ _createRadioElement: function (name, checked) {
+
+ var radioHtml = '<input type="radio" class="leaflet-control-layers-selector" name="' + name + '"';
+ if (checked) {
+ radioHtml += ' checked="checked"';
+ }
+ radioHtml += '/>';
+
+ var radioFragment = document.createElement('div');
+ radioFragment.innerHTML = radioHtml;
+
+ return radioFragment.firstChild;
+ },
+
+ _addItem: function (obj) {
+ var label = document.createElement('label'),
+ input,
+ checked = this._map.hasLayer(obj.layer);
+
+ if (obj.overlay) {
+ input = document.createElement('input');
+ input.type = 'checkbox';
+ input.className = 'leaflet-control-layers-selector';
+ input.defaultChecked = checked;
+ } else {
+ input = this._createRadioElement('leaflet-base-layers', checked);
+ }
+
+ input.layerId = L.stamp(obj.layer);
+
+ L.DomEvent.on(input, 'click', this._onInputClick, this);
+
+ var name = document.createElement('span');
+ name.innerHTML = ' ' + obj.name;
+
+ label.appendChild(input);
+ label.appendChild(name);
+
+ var container = obj.overlay ? this._overlaysList : this._baseLayersList;
+ container.appendChild(label);
+
+ return label;
+ },
+
+ _onInputClick: function () {
+ var i, input, obj,
+ inputs = this._form.getElementsByTagName('input'),
+ inputsLen = inputs.length;
+
+ this._handlingClick = true;
+
+ for (i = 0; i < inputsLen; i++) {
+ input = inputs[i];
+ obj = this._layers[input.layerId];
+
+ if (input.checked && !this._map.hasLayer(obj.layer)) {
+ this._map.addLayer(obj.layer);
+
+ } else if (!input.checked && this._map.hasLayer(obj.layer)) {
+ this._map.removeLayer(obj.layer);
+ }
+ }
+
+ this._handlingClick = false;
+
+ this._refocusOnMap();
+ },
+
+ _expand: function () {
+ L.DomUtil.addClass(this._container, 'leaflet-control-layers-expanded');
+ },
+
+ _collapse: function () {
+ this._container.className = this._container.className.replace(' leaflet-control-layers-expanded', '');
+ }
+});
+
+L.control.layers = function (baseLayers, overlays, options) {
+ return new L.Control.Layers(baseLayers, overlays, options);
+};
+
+
+/*
+ * L.PosAnimation is used by Leaflet internally for pan animations.
+ */
+
+L.PosAnimation = L.Class.extend({
+ includes: L.Mixin.Events,
+
+ run: function (el, newPos, duration, easeLinearity) { // (HTMLElement, Point[, Number, Number])
+ this.stop();
+
+ this._el = el;
+ this._inProgress = true;
+ this._newPos = newPos;
+
+ this.fire('start');
+
+ el.style[L.DomUtil.TRANSITION] = 'all ' + (duration || 0.25) +
+ 's cubic-bezier(0,0,' + (easeLinearity || 0.5) + ',1)';
+
+ L.DomEvent.on(el, L.DomUtil.TRANSITION_END, this._onTransitionEnd, this);
+ L.DomUtil.setPosition(el, newPos);
+
+ // toggle reflow, Chrome flickers for some reason if you don't do this
+ L.Util.falseFn(el.offsetWidth);
+
+ // there's no native way to track value updates of transitioned properties, so we imitate this
+ this._stepTimer = setInterval(L.bind(this._onStep, this), 50);
+ },
+
+ stop: function () {
+ if (!this._inProgress) { return; }
+
+ // if we just removed the transition property, the element would jump to its final position,
+ // so we need to make it stay at the current position
+
+ L.DomUtil.setPosition(this._el, this._getPos());
+ this._onTransitionEnd();
+ L.Util.falseFn(this._el.offsetWidth); // force reflow in case we are about to start a new animation
+ },
+
+ _onStep: function () {
+ var stepPos = this._getPos();
+ if (!stepPos) {
+ this._onTransitionEnd();
+ return;
+ }
+ // jshint camelcase: false
+ // make L.DomUtil.getPosition return intermediate position value during animation
+ this._el._leaflet_pos = stepPos;
+
+ this.fire('step');
+ },
+
+ // you can't easily get intermediate values of properties animated with CSS3 Transitions,
+ // we need to parse computed style (in case of transform it returns matrix string)
+
+ _transformRe: /([-+]?(?:\d*\.)?\d+)\D*, ([-+]?(?:\d*\.)?\d+)\D*\)/,
+
+ _getPos: function () {
+ var left, top, matches,
+ el = this._el,
+ style = window.getComputedStyle(el);
+
+ if (L.Browser.any3d) {
+ matches = style[L.DomUtil.TRANSFORM].match(this._transformRe);
+ if (!matches) { return; }
+ left = parseFloat(matches[1]);
+ top = parseFloat(matches[2]);
+ } else {
+ left = parseFloat(style.left);
+ top = parseFloat(style.top);
+ }
+
+ return new L.Point(left, top, true);
+ },
+
+ _onTransitionEnd: function () {
+ L.DomEvent.off(this._el, L.DomUtil.TRANSITION_END, this._onTransitionEnd, this);
+
+ if (!this._inProgress) { return; }
+ this._inProgress = false;
+
+ this._el.style[L.DomUtil.TRANSITION] = '';
+
+ // jshint camelcase: false
+ // make sure L.DomUtil.getPosition returns the final position value after animation
+ this._el._leaflet_pos = this._newPos;
+
+ clearInterval(this._stepTimer);
+
+ this.fire('step').fire('end');
+ }
+
+});
+
+
+/*
+ * Extends L.Map to handle panning animations.
+ */
+
+L.Map.include({
+
+ setView: function (center, zoom, options) {
+
+ zoom = zoom === undefined ? this._zoom : this._limitZoom(zoom);
+ center = this._limitCenter(L.latLng(center), zoom, this.options.maxBounds);
+ options = options || {};
+
+ if (this._panAnim) {
+ this._panAnim.stop();
+ }
+
+ if (this._loaded && !options.reset && options !== true) {
+
+ if (options.animate !== undefined) {
+ options.zoom = L.extend({animate: options.animate}, options.zoom);
+ options.pan = L.extend({animate: options.animate}, options.pan);
+ }
+
+ // try animating pan or zoom
+ var animated = (this._zoom !== zoom) ?
+ this._tryAnimatedZoom && this._tryAnimatedZoom(center, zoom, options.zoom) :
+ this._tryAnimatedPan(center, options.pan);
+
+ if (animated) {
+ // prevent resize handler call, the view will refresh after animation anyway
+ clearTimeout(this._sizeTimer);
+ return this;
+ }
+ }
+
+ // animation didn't start, just reset the map view
+ this._resetView(center, zoom);
+
+ return this;
+ },
+
+ panBy: function (offset, options) {
+ offset = L.point(offset).round();
+ options = options || {};
+
+ if (!offset.x && !offset.y) {
+ return this;
+ }
+
+ if (!this._panAnim) {
+ this._panAnim = new L.PosAnimation();
+
+ this._panAnim.on({
+ 'step': this._onPanTransitionStep,
+ 'end': this._onPanTransitionEnd
+ }, this);
+ }
+
+ // don't fire movestart if animating inertia
+ if (!options.noMoveStart) {
+ this.fire('movestart');
+ }
+
+ // animate pan unless animate: false specified
+ if (options.animate !== false) {
+ L.DomUtil.addClass(this._mapPane, 'leaflet-pan-anim');
+
+ var newPos = this._getMapPanePos().subtract(offset);
+ this._panAnim.run(this._mapPane, newPos, options.duration || 0.25, options.easeLinearity);
+ } else {
+ this._rawPanBy(offset);
+ this.fire('move').fire('moveend');
+ }
+
+ return this;
+ },
+
+ _onPanTransitionStep: function () {
+ this.fire('move');
+ },
+
+ _onPanTransitionEnd: function () {
+ L.DomUtil.removeClass(this._mapPane, 'leaflet-pan-anim');
+ this.fire('moveend');
+ },
+
+ _tryAnimatedPan: function (center, options) {
+ // difference between the new and current centers in pixels
+ var offset = this._getCenterOffset(center)._floor();
+
+ // don't animate too far unless animate: true specified in options
+ if ((options && options.animate) !== true && !this.getSize().contains(offset)) { return false; }
+
+ this.panBy(offset, options);
+
+ return true;
+ }
+});
+
+
+/*
+ * L.PosAnimation fallback implementation that powers Leaflet pan animations
+ * in browsers that don't support CSS3 Transitions.
+ */
+
+L.PosAnimation = L.DomUtil.TRANSITION ? L.PosAnimation : L.PosAnimation.extend({
+
+ run: function (el, newPos, duration, easeLinearity) { // (HTMLElement, Point[, Number, Number])
+ this.stop();
+
+ this._el = el;
+ this._inProgress = true;
+ this._duration = duration || 0.25;
+ this._easeOutPower = 1 / Math.max(easeLinearity || 0.5, 0.2);
+
+ this._startPos = L.DomUtil.getPosition(el);
+ this._offset = newPos.subtract(this._startPos);
+ this._startTime = +new Date();
+
+ this.fire('start');
+
+ this._animate();
+ },
+
+ stop: function () {
+ if (!this._inProgress) { return; }
+
+ this._step();
+ this._complete();
+ },
+
+ _animate: function () {
+ // animation loop
+ this._animId = L.Util.requestAnimFrame(this._animate, this);
+ this._step();
+ },
+
+ _step: function () {
+ var elapsed = (+new Date()) - this._startTime,
+ duration = this._duration * 1000;
+
+ if (elapsed < duration) {
+ this._runFrame(this._easeOut(elapsed / duration));
+ } else {
+ this._runFrame(1);
+ this._complete();
+ }
+ },
+
+ _runFrame: function (progress) {
+ var pos = this._startPos.add(this._offset.multiplyBy(progress));
+ L.DomUtil.setPosition(this._el, pos);
+
+ this.fire('step');
+ },
+
+ _complete: function () {
+ L.Util.cancelAnimFrame(this._animId);
+
+ this._inProgress = false;
+ this.fire('end');
+ },
+
+ _easeOut: function (t) {
+ return 1 - Math.pow(1 - t, this._easeOutPower);
+ }
+});
+
+
+/*
+ * Extends L.Map to handle zoom animations.
+ */
+
+L.Map.mergeOptions({
+ zoomAnimation: true,
+ zoomAnimationThreshold: 4
+});
+
+if (L.DomUtil.TRANSITION) {
+
+ L.Map.addInitHook(function () {
+ // don't animate on browsers without hardware-accelerated transitions or old Android/Opera
+ this._zoomAnimated = this.options.zoomAnimation && L.DomUtil.TRANSITION &&
+ L.Browser.any3d && !L.Browser.android23 && !L.Browser.mobileOpera;
+
+ // zoom transitions run with the same duration for all layers, so if one of transitionend events
+ // happens after starting zoom animation (propagating to the map pane), we know that it ended globally
+ if (this._zoomAnimated) {
+ L.DomEvent.on(this._mapPane, L.DomUtil.TRANSITION_END, this._catchTransitionEnd, this);
+ }
+ });
+}
+
+L.Map.include(!L.DomUtil.TRANSITION ? {} : {
+
+ _catchTransitionEnd: function (e) {
+ if (this._animatingZoom && e.propertyName.indexOf('transform') >= 0) {
+ this._onZoomTransitionEnd();
+ }
+ },
+
+ _nothingToAnimate: function () {
+ return !this._container.getElementsByClassName('leaflet-zoom-animated').length;
+ },
+
+ _tryAnimatedZoom: function (center, zoom, options) {
+
+ if (this._animatingZoom) { return true; }
+
+ options = options || {};
+
+ // don't animate if disabled, not supported or zoom difference is too large
+ if (!this._zoomAnimated || options.animate === false || this._nothingToAnimate() ||
+ Math.abs(zoom - this._zoom) > this.options.zoomAnimationThreshold) { return false; }
+
+ // offset is the pixel coords of the zoom origin relative to the current center
+ var scale = this.getZoomScale(zoom),
+ offset = this._getCenterOffset(center)._divideBy(1 - 1 / scale),
+ origin = this._getCenterLayerPoint()._add(offset);
+
+ // don't animate if the zoom origin isn't within one screen from the current center, unless forced
+ if (options.animate !== true && !this.getSize().contains(offset)) { return false; }
+
+ this
+ .fire('movestart')
+ .fire('zoomstart');
+
+ this._animateZoom(center, zoom, origin, scale, null, true);
+
+ return true;
+ },
+
+ _animateZoom: function (center, zoom, origin, scale, delta, backwards, forTouchZoom) {
+
+ if (!forTouchZoom) {
+ this._animatingZoom = true;
+ }
+
+ // put transform transition on all layers with leaflet-zoom-animated class
+ L.DomUtil.addClass(this._mapPane, 'leaflet-zoom-anim');
+
+ // remember what center/zoom to set after animation
+ this._animateToCenter = center;
+ this._animateToZoom = zoom;
+
+ // disable any dragging during animation
+ if (L.Draggable) {
+ L.Draggable._disabled = true;
+ }
+
+ L.Util.requestAnimFrame(function () {
+ this.fire('zoomanim', {
+ center: center,
+ zoom: zoom,
+ origin: origin,
+ scale: scale,
+ delta: delta,
+ backwards: backwards
+ });
+ // horrible hack to work around a Chrome bug https://github.com/Leaflet/Leaflet/issues/3689
+ setTimeout(L.bind(this._onZoomTransitionEnd, this), 250);
+ }, this);
+ },
+
+ _onZoomTransitionEnd: function () {
+ if (!this._animatingZoom) { return; }
+
+ this._animatingZoom = false;
+
+ L.DomUtil.removeClass(this._mapPane, 'leaflet-zoom-anim');
+
+ L.Util.requestAnimFrame(function () {
+ this._resetView(this._animateToCenter, this._animateToZoom, true, true);
+
+ if (L.Draggable) {
+ L.Draggable._disabled = false;
+ }
+ }, this);
+ }
+});
+
+
+/*
+ Zoom animation logic for L.TileLayer.
+*/
+
+L.TileLayer.include({
+ _animateZoom: function (e) {
+ if (!this._animating) {
+ this._animating = true;
+ this._prepareBgBuffer();
+ }
+
+ var bg = this._bgBuffer,
+ transform = L.DomUtil.TRANSFORM,
+ initialTransform = e.delta ? L.DomUtil.getTranslateString(e.delta) : bg.style[transform],
+ scaleStr = L.DomUtil.getScaleString(e.scale, e.origin);
+
+ bg.style[transform] = e.backwards ?
+ scaleStr + ' ' + initialTransform :
+ initialTransform + ' ' + scaleStr;
+ },
+
+ _endZoomAnim: function () {
+ var front = this._tileContainer,
+ bg = this._bgBuffer;
+
+ front.style.visibility = '';
+ front.parentNode.appendChild(front); // Bring to fore
+
+ // force reflow
+ L.Util.falseFn(bg.offsetWidth);
+
+ var zoom = this._map.getZoom();
+ if (zoom > this.options.maxZoom || zoom < this.options.minZoom) {
+ this._clearBgBuffer();
+ }
+
+ this._animating = false;
+ },
+
+ _clearBgBuffer: function () {
+ var map = this._map;
+
+ if (map && !map._animatingZoom && !map.touchZoom._zooming) {
+ this._bgBuffer.innerHTML = '';
+ this._bgBuffer.style[L.DomUtil.TRANSFORM] = '';
+ }
+ },
+
+ _prepareBgBuffer: function () {
+
+ var front = this._tileContainer,
+ bg = this._bgBuffer;
+
+ // if foreground layer doesn't have many tiles but bg layer does,
+ // keep the existing bg layer and just zoom it some more
+
+ var bgLoaded = this._getLoadedTilesPercentage(bg),
+ frontLoaded = this._getLoadedTilesPercentage(front);
+
+ if (bg && bgLoaded > 0.5 && frontLoaded < 0.5) {
+
+ front.style.visibility = 'hidden';
+ this._stopLoadingImages(front);
+ return;
+ }
+
+ // prepare the buffer to become the front tile pane
+ bg.style.visibility = 'hidden';
+ bg.style[L.DomUtil.TRANSFORM] = '';
+
+ // switch out the current layer to be the new bg layer (and vice-versa)
+ this._tileContainer = bg;
+ bg = this._bgBuffer = front;
+
+ this._stopLoadingImages(bg);
+
+ //prevent bg buffer from clearing right after zoom
+ clearTimeout(this._clearBgBufferTimer);
+ },
+
+ _getLoadedTilesPercentage: function (container) {
+ var tiles = container.getElementsByTagName('img'),
+ i, len, count = 0;
+
+ for (i = 0, len = tiles.length; i < len; i++) {
+ if (tiles[i].complete) {
+ count++;
+ }
+ }
+ return count / len;
+ },
+
+ // stops loading all tiles in the background layer
+ _stopLoadingImages: function (container) {
+ var tiles = Array.prototype.slice.call(container.getElementsByTagName('img')),
+ i, len, tile;
+
+ for (i = 0, len = tiles.length; i < len; i++) {
+ tile = tiles[i];
+
+ if (!tile.complete) {
+ tile.onload = L.Util.falseFn;
+ tile.onerror = L.Util.falseFn;
+ tile.src = L.Util.emptyImageUrl;
+
+ tile.parentNode.removeChild(tile);
+ }
+ }
+ }
+});
+
+
+/*
+ * Provides L.Map with convenient shortcuts for using browser geolocation features.
+ */
+
+L.Map.include({
+ _defaultLocateOptions: {
+ watch: false,
+ setView: false,
+ maxZoom: Infinity,
+ timeout: 10000,
+ maximumAge: 0,
+ enableHighAccuracy: false
+ },
+
+ locate: function (/*Object*/ options) {
+
+ options = this._locateOptions = L.extend(this._defaultLocateOptions, options);
+
+ if (!navigator.geolocation) {
+ this._handleGeolocationError({
+ code: 0,
+ message: 'Geolocation not supported.'
+ });
+ return this;
+ }
+
+ var onResponse = L.bind(this._handleGeolocationResponse, this),
+ onError = L.bind(this._handleGeolocationError, this);
+
+ if (options.watch) {
+ this._locationWatchId =
+ navigator.geolocation.watchPosition(onResponse, onError, options);
+ } else {
+ navigator.geolocation.getCurrentPosition(onResponse, onError, options);
+ }
+ return this;
+ },
+
+ stopLocate: function () {
+ if (navigator.geolocation) {
+ navigator.geolocation.clearWatch(this._locationWatchId);
+ }
+ if (this._locateOptions) {
+ this._locateOptions.setView = false;
+ }
+ return this;
+ },
+
+ _handleGeolocationError: function (error) {
+ var c = error.code,
+ message = error.message ||
+ (c === 1 ? 'permission denied' :
+ (c === 2 ? 'position unavailable' : 'timeout'));
+
+ if (this._locateOptions.setView && !this._loaded) {
+ this.fitWorld();
+ }
+
+ this.fire('locationerror', {
+ code: c,
+ message: 'Geolocation error: ' + message + '.'
+ });
+ },
+
+ _handleGeolocationResponse: function (pos) {
+ var lat = pos.coords.latitude,
+ lng = pos.coords.longitude,
+ latlng = new L.LatLng(lat, lng),
+
+ latAccuracy = 180 * pos.coords.accuracy / 40075017,
+ lngAccuracy = latAccuracy / Math.cos(L.LatLng.DEG_TO_RAD * lat),
+
+ bounds = L.latLngBounds(
+ [lat - latAccuracy, lng - lngAccuracy],
+ [lat + latAccuracy, lng + lngAccuracy]),
+
+ options = this._locateOptions;
+
+ if (options.setView) {
+ var zoom = Math.min(this.getBoundsZoom(bounds), options.maxZoom);
+ this.setView(latlng, zoom);
+ }
+
+ var data = {
+ latlng: latlng,
+ bounds: bounds,
+ timestamp: pos.timestamp
+ };
+
+ for (var i in pos.coords) {
+ if (typeof pos.coords[i] === 'number') {
+ data[i] = pos.coords[i];
+ }
+ }
+
+ this.fire('locationfound', data);
+ }
+});
+
+
+}(window, document));
\ No newline at end of file
diff --git a/webapp/org.eclipse.sensinact.studio.webapp.indoor/webapp/js/leaflet.js b/webapp/org.eclipse.sensinact.studio.webapp.indoor/webapp/js/leaflet.js
new file mode 100644
index 0000000..ee5ff5a
--- /dev/null
+++ b/webapp/org.eclipse.sensinact.studio.webapp.indoor/webapp/js/leaflet.js
@@ -0,0 +1,9 @@
+/*
+ Leaflet, a JavaScript library for mobile-friendly interactive maps. http://leafletjs.com
+ (c) 2010-2013, Vladimir Agafonkin
+ (c) 2010-2011, CloudMade
+*/
+!function(t,e,i){var n=t.L,o={};o.version="0.7.7","object"==typeof module&&"object"==typeof module.exports?module.exports=o:"function"==typeof define&&define.amd&&define(o),o.noConflict=function(){return t.L=n,this},t.L=o,o.Util={extend:function(t){var e,i,n,o,s=Array.prototype.slice.call(arguments,1);for(i=0,n=s.length;n>i;i++){o=s[i]||{};for(e in o)o.hasOwnProperty(e)&&(t[e]=o[e])}return t},bind:function(t,e){var i=arguments.length>2?Array.prototype.slice.call(arguments,2):null;return function(){return t.apply(e,i||arguments)}},stamp:function(){var t=0,e="_leaflet_id";return function(i){return i[e]=i[e]||++t,i[e]}}(),invokeEach:function(t,e,i){var n,o;if("object"==typeof t){o=Array.prototype.slice.call(arguments,3);for(n in t)e.apply(i,[n,t[n]].concat(o));return!0}return!1},limitExecByInterval:function(t,e,i){var n,o;return function s(){var a=arguments;return n?void(o=!0):(n=!0,setTimeout(function(){n=!1,o&&(s.apply(i,a),o=!1)},e),void t.apply(i,a))}},falseFn:function(){return!1},formatNum:function(t,e){var i=Math.pow(10,e||5);return Math.round(t*i)/i},trim:function(t){return t.trim?t.trim():t.replace(/^\s+|\s+$/g,"")},splitWords:function(t){return o.Util.trim(t).split(/\s+/)},setOptions:function(t,e){return t.options=o.extend({},t.options,e),t.options},getParamString:function(t,e,i){var n=[];for(var o in t)n.push(encodeURIComponent(i?o.toUpperCase():o)+"="+encodeURIComponent(t[o]));return(e&&-1!==e.indexOf("?")?"&":"?")+n.join("&")},template:function(t,e){return t.replace(/\{ *([\w_]+) *\}/g,function(t,n){var o=e[n];if(o===i)throw new Error("No value provided for variable "+t);return"function"==typeof o&&(o=o(e)),o})},isArray:Array.isArray||function(t){return"[object Array]"===Object.prototype.toString.call(t)},emptyImageUrl:"data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs="},function(){function e(e){var i,n,o=["webkit","moz","o","ms"];for(i=0;i<o.length&&!n;i++)n=t[o[i]+e];return n}function i(e){var i=+new Date,o=Math.max(0,16-(i-n));return n=i+o,t.setTimeout(e,o)}var n=0,s=t.requestAnimationFrame||e("RequestAnimationFrame")||i,a=t.cancelAnimationFrame||e("CancelAnimationFrame")||e("CancelRequestAnimationFrame")||function(e){t.clearTimeout(e)};o.Util.requestAnimFrame=function(e,n,a,r){return e=o.bind(e,n),a&&s===i?void e():s.call(t,e,r)},o.Util.cancelAnimFrame=function(e){e&&a.call(t,e)}}(),o.extend=o.Util.extend,o.bind=o.Util.bind,o.stamp=o.Util.stamp,o.setOptions=o.Util.setOptions,o.Class=function(){},o.Class.extend=function(t){var e=function(){this.initialize&&this.initialize.apply(this,arguments),this._initHooks&&this.callInitHooks()},i=function(){};i.prototype=this.prototype;var n=new i;n.constructor=e,e.prototype=n;for(var s in this)this.hasOwnProperty(s)&&"prototype"!==s&&(e[s]=this[s]);t.statics&&(o.extend(e,t.statics),delete t.statics),t.includes&&(o.Util.extend.apply(null,[n].concat(t.includes)),delete t.includes),t.options&&n.options&&(t.options=o.extend({},n.options,t.options)),o.extend(n,t),n._initHooks=[];var a=this;return e.__super__=a.prototype,n.callInitHooks=function(){if(!this._initHooksCalled){a.prototype.callInitHooks&&a.prototype.callInitHooks.call(this),this._initHooksCalled=!0;for(var t=0,e=n._initHooks.length;e>t;t++)n._initHooks[t].call(this)}},e},o.Class.include=function(t){o.extend(this.prototype,t)},o.Class.mergeOptions=function(t){o.extend(this.prototype.options,t)},o.Class.addInitHook=function(t){var e=Array.prototype.slice.call(arguments,1),i="function"==typeof t?t:function(){this[t].apply(this,e)};this.prototype._initHooks=this.prototype._initHooks||[],this.prototype._initHooks.push(i)};var s="_leaflet_events";o.Mixin={},o.Mixin.Events={addEventListener:function(t,e,i){if(o.Util.invokeEach(t,this.addEventListener,this,e,i))return this;var n,a,r,h,l,u,c,d=this[s]=this[s]||{},p=i&&i!==this&&o.stamp(i);for(t=o.Util.splitWords(t),n=0,a=t.length;a>n;n++)r={action:e,context:i||this},h=t[n],p?(l=h+"_idx",u=l+"_len",c=d[l]=d[l]||{},c[p]||(c[p]=[],d[u]=(d[u]||0)+1),c[p].push(r)):(d[h]=d[h]||[],d[h].push(r));return this},hasEventListeners:function(t){var e=this[s];return!!e&&(t in e&&e[t].length>0||t+"_idx"in e&&e[t+"_idx_len"]>0)},removeEventListener:function(t,e,i){if(!this[s])return this;if(!t)return this.clearAllEventListeners();if(o.Util.invokeEach(t,this.removeEventListener,this,e,i))return this;var n,a,r,h,l,u,c,d,p,_=this[s],m=i&&i!==this&&o.stamp(i);for(t=o.Util.splitWords(t),n=0,a=t.length;a>n;n++)if(r=t[n],u=r+"_idx",c=u+"_len",d=_[u],e){if(h=m&&d?d[m]:_[r]){for(l=h.length-1;l>=0;l--)h[l].action!==e||i&&h[l].context!==i||(p=h.splice(l,1),p[0].action=o.Util.falseFn);i&&d&&0===h.length&&(delete d[m],_[c]--)}}else delete _[r],delete _[u],delete _[c];return this},clearAllEventListeners:function(){return delete this[s],this},fireEvent:function(t,e){if(!this.hasEventListeners(t))return this;var i,n,a,r,h,l=o.Util.extend({},e,{type:t,target:this}),u=this[s];if(u[t])for(i=u[t].slice(),n=0,a=i.length;a>n;n++)i[n].action.call(i[n].context,l);r=u[t+"_idx"];for(h in r)if(i=r[h].slice())for(n=0,a=i.length;a>n;n++)i[n].action.call(i[n].context,l);return this},addOneTimeEventListener:function(t,e,i){if(o.Util.invokeEach(t,this.addOneTimeEventListener,this,e,i))return this;var n=o.bind(function(){this.removeEventListener(t,e,i).removeEventListener(t,n,i)},this);return this.addEventListener(t,e,i).addEventListener(t,n,i)}},o.Mixin.Events.on=o.Mixin.Events.addEventListener,o.Mixin.Events.off=o.Mixin.Events.removeEventListener,o.Mixin.Events.once=o.Mixin.Events.addOneTimeEventListener,o.Mixin.Events.fire=o.Mixin.Events.fireEvent,function(){var n="ActiveXObject"in t,s=n&&!e.addEventListener,a=navigator.userAgent.toLowerCase(),r=-1!==a.indexOf("webkit"),h=-1!==a.indexOf("chrome"),l=-1!==a.indexOf("phantom"),u=-1!==a.indexOf("android"),c=-1!==a.search("android [23]"),d=-1!==a.indexOf("gecko"),p=typeof orientation!=i+"",_=!t.PointerEvent&&t.MSPointerEvent,m=t.PointerEvent&&t.navigator.pointerEnabled||_,f="devicePixelRatio"in t&&t.devicePixelRatio>1||"matchMedia"in t&&t.matchMedia("(min-resolution:144dpi)")&&t.matchMedia("(min-resolution:144dpi)").matches,g=e.documentElement,v=n&&"transition"in g.style,y="WebKitCSSMatrix"in t&&"m11"in new t.WebKitCSSMatrix&&!c,P="MozPerspective"in g.style,L="OTransition"in g.style,x=!t.L_DISABLE_3D&&(v||y||P||L)&&!l,w=!t.L_NO_TOUCH&&!l&&(m||"ontouchstart"in t||t.DocumentTouch&&e instanceof t.DocumentTouch);o.Browser={ie:n,ielt9:s,webkit:r,gecko:d&&!r&&!t.opera&&!n,android:u,android23:c,chrome:h,ie3d:v,webkit3d:y,gecko3d:P,opera3d:L,any3d:x,mobile:p,mobileWebkit:p&&r,mobileWebkit3d:p&&y,mobileOpera:p&&t.opera,touch:w,msPointer:_,pointer:m,retina:f}}(),o.Point=function(t,e,i){this.x=i?Math.round(t):t,this.y=i?Math.round(e):e},o.Point.prototype={clone:function(){return new o.Point(this.x,this.y)},add:function(t){return this.clone()._add(o.point(t))},_add:function(t){return this.x+=t.x,this.y+=t.y,this},subtract:function(t){return this.clone()._subtract(o.point(t))},_subtract:function(t){return this.x-=t.x,this.y-=t.y,this},divideBy:function(t){return this.clone()._divideBy(t)},_divideBy:function(t){return this.x/=t,this.y/=t,this},multiplyBy:function(t){return this.clone()._multiplyBy(t)},_multiplyBy:function(t){return this.x*=t,this.y*=t,this},round:function(){return this.clone()._round()},_round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this},floor:function(){return this.clone()._floor()},_floor:function(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this},distanceTo:function(t){t=o.point(t);var e=t.x-this.x,i=t.y-this.y;return Math.sqrt(e*e+i*i)},equals:function(t){return t=o.point(t),t.x===this.x&&t.y===this.y},contains:function(t){return t=o.point(t),Math.abs(t.x)<=Math.abs(this.x)&&Math.abs(t.y)<=Math.abs(this.y)},toString:function(){return"Point("+o.Util.formatNum(this.x)+", "+o.Util.formatNum(this.y)+")"}},o.point=function(t,e,n){return t instanceof o.Point?t:o.Util.isArray(t)?new o.Point(t[0],t[1]):t===i||null===t?t:new o.Point(t,e,n)},o.Bounds=function(t,e){if(t)for(var i=e?[t,e]:t,n=0,o=i.length;o>n;n++)this.extend(i[n])},o.Bounds.prototype={extend:function(t){return t=o.point(t),this.min||this.max?(this.min.x=Math.min(t.x,this.min.x),this.max.x=Math.max(t.x,this.max.x),this.min.y=Math.min(t.y,this.min.y),this.max.y=Math.max(t.y,this.max.y)):(this.min=t.clone(),this.max=t.clone()),this},getCenter:function(t){return new o.Point((this.min.x+this.max.x)/2,(this.min.y+this.max.y)/2,t)},getBottomLeft:function(){return new o.Point(this.min.x,this.max.y)},getTopRight:function(){return new o.Point(this.max.x,this.min.y)},getSize:function(){return this.max.subtract(this.min)},contains:function(t){var e,i;return t="number"==typeof t[0]||t instanceof o.Point?o.point(t):o.bounds(t),t instanceof o.Bounds?(e=t.min,i=t.max):e=i=t,e.x>=this.min.x&&i.x<=this.max.x&&e.y>=this.min.y&&i.y<=this.max.y},intersects:function(t){t=o.bounds(t);var e=this.min,i=this.max,n=t.min,s=t.max,a=s.x>=e.x&&n.x<=i.x,r=s.y>=e.y&&n.y<=i.y;return a&&r},isValid:function(){return!(!this.min||!this.max)}},o.bounds=function(t,e){return!t||t instanceof o.Bounds?t:new o.Bounds(t,e)},o.Transformation=function(t,e,i,n){this._a=t,this._b=e,this._c=i,this._d=n},o.Transformation.prototype={transform:function(t,e){return this._transform(t.clone(),e)},_transform:function(t,e){return e=e||1,t.x=e*(this._a*t.x+this._b),t.y=e*(this._c*t.y+this._d),t},untransform:function(t,e){return e=e||1,new o.Point((t.x/e-this._b)/this._a,(t.y/e-this._d)/this._c)}},o.DomUtil={get:function(t){return"string"==typeof t?e.getElementById(t):t},getStyle:function(t,i){var n=t.style[i];if(!n&&t.currentStyle&&(n=t.currentStyle[i]),(!n||"auto"===n)&&e.defaultView){var o=e.defaultView.getComputedStyle(t,null);n=o?o[i]:null}return"auto"===n?null:n},getViewportOffset:function(t){var i,n=0,s=0,a=t,r=e.body,h=e.documentElement;do{if(n+=a.offsetTop||0,s+=a.offsetLeft||0,n+=parseInt(o.DomUtil.getStyle(a,"borderTopWidth"),10)||0,s+=parseInt(o.DomUtil.getStyle(a,"borderLeftWidth"),10)||0,i=o.DomUtil.getStyle(a,"position"),a.offsetParent===r&&"absolute"===i)break;if("fixed"===i){n+=r.scrollTop||h.scrollTop||0,s+=r.scrollLeft||h.scrollLeft||0;break}if("relative"===i&&!a.offsetLeft){var l=o.DomUtil.getStyle(a,"width"),u=o.DomUtil.getStyle(a,"max-width"),c=a.getBoundingClientRect();("none"!==l||"none"!==u)&&(s+=c.left+a.clientLeft),n+=c.top+(r.scrollTop||h.scrollTop||0);break}a=a.offsetParent}while(a);a=t;do{if(a===r)break;n-=a.scrollTop||0,s-=a.scrollLeft||0,a=a.parentNode}while(a);return new o.Point(s,n)},documentIsLtr:function(){return o.DomUtil._docIsLtrCached||(o.DomUtil._docIsLtrCached=!0,o.DomUtil._docIsLtr="ltr"===o.DomUtil.getStyle(e.body,"direction")),o.DomUtil._docIsLtr},create:function(t,i,n){var o=e.createElement(t);return o.className=i,n&&n.appendChild(o),o},hasClass:function(t,e){if(t.classList!==i)return t.classList.contains(e);var n=o.DomUtil._getClass(t);return n.length>0&&new RegExp("(^|\\s)"+e+"(\\s|$)").test(n)},addClass:function(t,e){if(t.classList!==i)for(var n=o.Util.splitWords(e),s=0,a=n.length;a>s;s++)t.classList.add(n[s]);else if(!o.DomUtil.hasClass(t,e)){var r=o.DomUtil._getClass(t);o.DomUtil._setClass(t,(r?r+" ":"")+e)}},removeClass:function(t,e){t.classList!==i?t.classList.remove(e):o.DomUtil._setClass(t,o.Util.trim((" "+o.DomUtil._getClass(t)+" ").replace(" "+e+" "," ")))},_setClass:function(t,e){t.className.baseVal===i?t.className=e:t.className.baseVal=e},_getClass:function(t){return t.className.baseVal===i?t.className:t.className.baseVal},setOpacity:function(t,e){if("opacity"in t.style)t.style.opacity=e;else if("filter"in t.style){var i=!1,n="DXImageTransform.Microsoft.Alpha";try{i=t.filters.item(n)}catch(o){if(1===e)return}e=Math.round(100*e),i?(i.Enabled=100!==e,i.Opacity=e):t.style.filter+=" progid:"+n+"(opacity="+e+")"}},testProp:function(t){for(var i=e.documentElement.style,n=0;n<t.length;n++)if(t[n]in i)return t[n];return!1},getTranslateString:function(t){var e=o.Browser.webkit3d,i="translate"+(e?"3d":"")+"(",n=(e?",0":"")+")";return i+t.x+"px,"+t.y+"px"+n},getScaleString:function(t,e){var i=o.DomUtil.getTranslateString(e.add(e.multiplyBy(-1*t))),n=" scale("+t+") ";return i+n},setPosition:function(t,e,i){t._leaflet_pos=e,!i&&o.Browser.any3d?t.style[o.DomUtil.TRANSFORM]=o.DomUtil.getTranslateString(e):(t.style.left=e.x+"px",t.style.top=e.y+"px")},getPosition:function(t){return t._leaflet_pos}},o.DomUtil.TRANSFORM=o.DomUtil.testProp(["transform","WebkitTransform","OTransform","MozTransform","msTransform"]),o.DomUtil.TRANSITION=o.DomUtil.testProp(["webkitTransition","transition","OTransition","MozTransition","msTransition"]),o.DomUtil.TRANSITION_END="webkitTransition"===o.DomUtil.TRANSITION||"OTransition"===o.DomUtil.TRANSITION?o.DomUtil.TRANSITION+"End":"transitionend",function(){if("onselectstart"in e)o.extend(o.DomUtil,{disableTextSelection:function(){o.DomEvent.on(t,"selectstart",o.DomEvent.preventDefault)},enableTextSelection:function(){o.DomEvent.off(t,"selectstart",o.DomEvent.preventDefault)}});else{var i=o.DomUtil.testProp(["userSelect","WebkitUserSelect","OUserSelect","MozUserSelect","msUserSelect"]);o.extend(o.DomUtil,{disableTextSelection:function(){if(i){var t=e.documentElement.style;this._userSelect=t[i],t[i]="none"}},enableTextSelection:function(){i&&(e.documentElement.style[i]=this._userSelect,delete this._userSelect)}})}o.extend(o.DomUtil,{disableImageDrag:function(){o.DomEvent.on(t,"dragstart",o.DomEvent.preventDefault)},enableImageDrag:function(){o.DomEvent.off(t,"dragstart",o.DomEvent.preventDefault)}})}(),o.LatLng=function(t,e,n){if(t=parseFloat(t),e=parseFloat(e),isNaN(t)||isNaN(e))throw new Error("Invalid LatLng object: ("+t+", "+e+")");this.lat=t,this.lng=e,n!==i&&(this.alt=parseFloat(n))},o.extend(o.LatLng,{DEG_TO_RAD:Math.PI/180,RAD_TO_DEG:180/Math.PI,MAX_MARGIN:1e-9}),o.LatLng.prototype={equals:function(t){if(!t)return!1;t=o.latLng(t);var e=Math.max(Math.abs(this.lat-t.lat),Math.abs(this.lng-t.lng));return e<=o.LatLng.MAX_MARGIN},toString:function(t){return"LatLng("+o.Util.formatNum(this.lat,t)+", "+o.Util.formatNum(this.lng,t)+")"},distanceTo:function(t){t=o.latLng(t);var e=6378137,i=o.LatLng.DEG_TO_RAD,n=(t.lat-this.lat)*i,s=(t.lng-this.lng)*i,a=this.lat*i,r=t.lat*i,h=Math.sin(n/2),l=Math.sin(s/2),u=h*h+l*l*Math.cos(a)*Math.cos(r);return 2*e*Math.atan2(Math.sqrt(u),Math.sqrt(1-u))},wrap:function(t,e){var i=this.lng;return t=t||-180,e=e||180,i=(i+e)%(e-t)+(t>i||i===e?e:t),new o.LatLng(this.lat,i)}},o.latLng=function(t,e){return t instanceof o.LatLng?t:o.Util.isArray(t)?"number"==typeof t[0]||"string"==typeof t[0]?new o.LatLng(t[0],t[1],t[2]):null:t===i||null===t?t:"object"==typeof t&&"lat"in t?new o.LatLng(t.lat,"lng"in t?t.lng:t.lon):e===i?null:new o.LatLng(t,e)},o.LatLngBounds=function(t,e){if(t)for(var i=e?[t,e]:t,n=0,o=i.length;o>n;n++)this.extend(i[n])},o.LatLngBounds.prototype={extend:function(t){if(!t)return this;var e=o.latLng(t);return t=null!==e?e:o.latLngBounds(t),t instanceof o.LatLng?this._southWest||this._northEast?(this._southWest.lat=Math.min(t.lat,this._southWest.lat),this._southWest.lng=Math.min(t.lng,this._southWest.lng),this._northEast.lat=Math.max(t.lat,this._northEast.lat),this._northEast.lng=Math.max(t.lng,this._northEast.lng)):(this._southWest=new o.LatLng(t.lat,t.lng),this._northEast=new o.LatLng(t.lat,t.lng)):t instanceof o.LatLngBounds&&(this.extend(t._southWest),this.extend(t._northEast)),this},pad:function(t){var e=this._southWest,i=this._northEast,n=Math.abs(e.lat-i.lat)*t,s=Math.abs(e.lng-i.lng)*t;return new o.LatLngBounds(new o.LatLng(e.lat-n,e.lng-s),new o.LatLng(i.lat+n,i.lng+s))},getCenter:function(){return new o.LatLng((this._southWest.lat+this._northEast.lat)/2,(this._southWest.lng+this._northEast.lng)/2)},getSouthWest:function(){return this._southWest},getNorthEast:function(){return this._northEast},getNorthWest:function(){return new o.LatLng(this.getNorth(),this.getWest())},getSouthEast:function(){return new o.LatLng(this.getSouth(),this.getEast())},getWest:function(){return this._southWest.lng},getSouth:function(){return this._southWest.lat},getEast:function(){return this._northEast.lng},getNorth:function(){return this._northEast.lat},contains:function(t){t="number"==typeof t[0]||t instanceof o.LatLng?o.latLng(t):o.latLngBounds(t);var e,i,n=this._southWest,s=this._northEast;return t instanceof o.LatLngBounds?(e=t.getSouthWest(),i=t.getNorthEast()):e=i=t,e.lat>=n.lat&&i.lat<=s.lat&&e.lng>=n.lng&&i.lng<=s.lng},intersects:function(t){t=o.latLngBounds(t);var e=this._southWest,i=this._northEast,n=t.getSouthWest(),s=t.getNorthEast(),a=s.lat>=e.lat&&n.lat<=i.lat,r=s.lng>=e.lng&&n.lng<=i.lng;return a&&r},toBBoxString:function(){return[this.getWest(),this.getSouth(),this.getEast(),this.getNorth()].join(",")},equals:function(t){return t?(t=o.latLngBounds(t),this._southWest.equals(t.getSouthWest())&&this._northEast.equals(t.getNorthEast())):!1},isValid:function(){return!(!this._southWest||!this._northEast)}},o.latLngBounds=function(t,e){return!t||t instanceof o.LatLngBounds?t:new o.LatLngBounds(t,e)},o.Projection={},o.Projection.SphericalMercator={MAX_LATITUDE:85.0511287798,project:function(t){var e=o.LatLng.DEG_TO_RAD,i=this.MAX_LATITUDE,n=Math.max(Math.min(i,t.lat),-i),s=t.lng*e,a=n*e;return a=Math.log(Math.tan(Math.PI/4+a/2)),new o.Point(s,a)},unproject:function(t){var e=o.LatLng.RAD_TO_DEG,i=t.x*e,n=(2*Math.atan(Math.exp(t.y))-Math.PI/2)*e;return new o.LatLng(n,i)}},o.Projection.LonLat={project:function(t){return new o.Point(t.lng,t.lat)},unproject:function(t){return new o.LatLng(t.y,t.x)}},o.CRS={latLngToPoint:function(t,e){var i=this.projection.project(t),n=this.scale(e);return this.transformation._transform(i,n)},pointToLatLng:function(t,e){var i=this.scale(e),n=this.transformation.untransform(t,i);return this.projection.unproject(n)},project:function(t){return this.projection.project(t)},scale:function(t){return 256*Math.pow(2,t)},getSize:function(t){var e=this.scale(t);return o.point(e,e)}},o.CRS.Simple=o.extend({},o.CRS,{projection:o.Projection.LonLat,transformation:new o.Transformation(1,0,-1,0),scale:function(t){return Math.pow(2,t)}}),o.CRS.EPSG3857=o.extend({},o.CRS,{code:"EPSG:3857",projection:o.Projection.SphericalMercator,transformation:new o.Transformation(.5/Math.PI,.5,-.5/Math.PI,.5),project:function(t){var e=this.projection.project(t),i=6378137;return e.multiplyBy(i)}}),o.CRS.EPSG900913=o.extend({},o.CRS.EPSG3857,{code:"EPSG:900913"}),o.CRS.EPSG4326=o.extend({},o.CRS,{code:"EPSG:4326",projection:o.Projection.LonLat,transformation:new o.Transformation(1/360,.5,-1/360,.5)}),o.Map=o.Class.extend({includes:o.Mixin.Events,options:{crs:o.CRS.EPSG3857,fadeAnimation:o.DomUtil.TRANSITION&&!o.Browser.android23,trackResize:!0,markerZoomAnimation:o.DomUtil.TRANSITION&&o.Browser.any3d},initialize:function(t,e){e=o.setOptions(this,e),this._initContainer(t),this._initLayout(),this._onResize=o.bind(this._onResize,this),this._initEvents(),e.maxBounds&&this.setMaxBounds(e.maxBounds),e.center&&e.zoom!==i&&this.setView(o.latLng(e.center),e.zoom,{reset:!0}),this._handlers=[],this._layers={},this._zoomBoundLayers={},this._tileLayersNum=0,this.callInitHooks(),this._addLayers(e.layers)},setView:function(t,e){return e=e===i?this.getZoom():e,this._resetView(o.latLng(t),this._limitZoom(e)),this},setZoom:function(t,e){return this._loaded?this.setView(this.getCenter(),t,{zoom:e}):(this._zoom=this._limitZoom(t),this)},zoomIn:function(t,e){return this.setZoom(this._zoom+(t||1),e)},zoomOut:function(t,e){return this.setZoom(this._zoom-(t||1),e)},setZoomAround:function(t,e,i){var n=this.getZoomScale(e),s=this.getSize().divideBy(2),a=t instanceof o.Point?t:this.latLngToContainerPoint(t),r=a.subtract(s).multiplyBy(1-1/n),h=this.containerPointToLatLng(s.add(r));return this.setView(h,e,{zoom:i})},fitBounds:function(t,e){e=e||{},t=t.getBounds?t.getBounds():o.latLngBounds(t);var i=o.point(e.paddingTopLeft||e.padding||[0,0]),n=o.point(e.paddingBottomRight||e.padding||[0,0]),s=this.getBoundsZoom(t,!1,i.add(n));s=e.maxZoom?Math.min(e.maxZoom,s):s;var a=n.subtract(i).divideBy(2),r=this.project(t.getSouthWest(),s),h=this.project(t.getNorthEast(),s),l=this.unproject(r.add(h).divideBy(2).add(a),s);return this.setView(l,s,e)},fitWorld:function(t){return this.fitBounds([[-90,-180],[90,180]],t)},panTo:function(t,e){return this.setView(t,this._zoom,{pan:e})},panBy:function(t){return this.fire("movestart"),this._rawPanBy(o.point(t)),this.fire("move"),this.fire("moveend")},setMaxBounds:function(t){return t=o.latLngBounds(t),this.options.maxBounds=t,t?(this._loaded&&this._panInsideMaxBounds(),this.on("moveend",this._panInsideMaxBounds,this)):this.off("moveend",this._panInsideMaxBounds,this)},panInsideBounds:function(t,e){var i=this.getCenter(),n=this._limitCenter(i,this._zoom,t);return i.equals(n)?this:this.panTo(n,e)},addLayer:function(t){var e=o.stamp(t);return this._layers[e]?this:(this._layers[e]=t,!t.options||isNaN(t.options.maxZoom)&&isNaN(t.options.minZoom)||(this._zoomBoundLayers[e]=t,this._updateZoomLevels()),this.options.zoomAnimation&&o.TileLayer&&t instanceof o.TileLayer&&(this._tileLayersNum++,this._tileLayersToLoad++,t.on("load",this._onTileLayerLoad,this)),this._loaded&&this._layerAdd(t),this)},removeLayer:function(t){var e=o.stamp(t);return this._layers[e]?(this._loaded&&t.onRemove(this),delete this._layers[e],this._loaded&&this.fire("layerremove",{layer:t}),this._zoomBoundLayers[e]&&(delete this._zoomBoundLayers[e],this._updateZoomLevels()),this.options.zoomAnimation&&o.TileLayer&&t instanceof o.TileLayer&&(this._tileLayersNum--,this._tileLayersToLoad--,t.off("load",this._onTileLayerLoad,this)),this):this},hasLayer:function(t){return t?o.stamp(t)in this._layers:!1},eachLayer:function(t,e){for(var i in this._layers)t.call(e,this._layers[i]);return this},invalidateSize:function(t){if(!this._loaded)return this;t=o.extend({animate:!1,pan:!0},t===!0?{animate:!0}:t);var e=this.getSize();this._sizeChanged=!0,this._initialCenter=null;var i=this.getSize(),n=e.divideBy(2).round(),s=i.divideBy(2).round(),a=n.subtract(s);return a.x||a.y?(t.animate&&t.pan?this.panBy(a):(t.pan&&this._rawPanBy(a),this.fire("move"),t.debounceMoveend?(clearTimeout(this._sizeTimer),this._sizeTimer=setTimeout(o.bind(this.fire,this,"moveend"),200)):this.fire("moveend")),this.fire("resize",{oldSize:e,newSize:i})):this},addHandler:function(t,e){if(!e)return this;var i=this[t]=new e(this);return this._handlers.push(i),this.options[t]&&i.enable(),this},remove:function(){this._loaded&&this.fire("unload"),this._initEvents("off");try{delete this._container._leaflet}catch(t){this._container._leaflet=i}return this._clearPanes(),this._clearControlPos&&this._clearControlPos(),this._clearHandlers(),this},getCenter:function(){return this._checkIfLoaded(),this._initialCenter&&!this._moved()?this._initialCenter:this.layerPointToLatLng(this._getCenterLayerPoint())},getZoom:function(){return this._zoom},getBounds:function(){var t=this.getPixelBounds(),e=this.unproject(t.getBottomLeft()),i=this.unproject(t.getTopRight());return new o.LatLngBounds(e,i)},getMinZoom:function(){return this.options.minZoom===i?this._layersMinZoom===i?0:this._layersMinZoom:this.options.minZoom},getMaxZoom:function(){return this.options.maxZoom===i?this._layersMaxZoom===i?1/0:this._layersMaxZoom:this.options.maxZoom},getBoundsZoom:function(t,e,i){t=o.latLngBounds(t);var n,s=this.getMinZoom()-(e?1:0),a=this.getMaxZoom(),r=this.getSize(),h=t.getNorthWest(),l=t.getSouthEast(),u=!0;i=o.point(i||[0,0]);do s++,n=this.project(l,s).subtract(this.project(h,s)).add(i),u=e?n.x<r.x||n.y<r.y:r.contains(n);while(u&&a>=s);return u&&e?null:e?s:s-1},getSize:function(){return(!this._size||this._sizeChanged)&&(this._size=new o.Point(this._container.clientWidth,this._container.clientHeight),this._sizeChanged=!1),this._size.clone()},getPixelBounds:function(){var t=this._getTopLeftPoint();return new o.Bounds(t,t.add(this.getSize()))},getPixelOrigin:function(){return this._checkIfLoaded(),this._initialTopLeftPoint},getPanes:function(){return this._panes},getContainer:function(){return this._container},getZoomScale:function(t){var e=this.options.crs;return e.scale(t)/e.scale(this._zoom)},getScaleZoom:function(t){return this._zoom+Math.log(t)/Math.LN2},project:function(t,e){return e=e===i?this._zoom:e,this.options.crs.latLngToPoint(o.latLng(t),e)},unproject:function(t,e){return e=e===i?this._zoom:e,this.options.crs.pointToLatLng(o.point(t),e)},layerPointToLatLng:function(t){var e=o.point(t).add(this.getPixelOrigin());return this.unproject(e)},latLngToLayerPoint:function(t){var e=this.project(o.latLng(t))._round();return e._subtract(this.getPixelOrigin())},containerPointToLayerPoint:function(t){return o.point(t).subtract(this._getMapPanePos())},layerPointToContainerPoint:function(t){return o.point(t).add(this._getMapPanePos())},containerPointToLatLng:function(t){var e=this.containerPointToLayerPoint(o.point(t));return this.layerPointToLatLng(e)},latLngToContainerPoint:function(t){return this.layerPointToContainerPoint(this.latLngToLayerPoint(o.latLng(t)))},mouseEventToContainerPoint:function(t){return o.DomEvent.getMousePosition(t,this._container)},mouseEventToLayerPoint:function(t){return this.containerPointToLayerPoint(this.mouseEventToContainerPoint(t))},mouseEventToLatLng:function(t){return this.layerPointToLatLng(this.mouseEventToLayerPoint(t))},_initContainer:function(t){var e=this._container=o.DomUtil.get(t);if(!e)throw new Error("Map container not found.");if(e._leaflet)throw new Error("Map container is already initialized.");e._leaflet=!0},_initLayout:function(){var t=this._container;o.DomUtil.addClass(t,"leaflet-container"+(o.Browser.touch?" leaflet-touch":"")+(o.Browser.retina?" leaflet-retina":"")+(o.Browser.ielt9?" leaflet-oldie":"")+(this.options.fadeAnimation?" leaflet-fade-anim":""));var e=o.DomUtil.getStyle(t,"position");"absolute"!==e&&"relative"!==e&&"fixed"!==e&&(t.style.position="relative"),this._initPanes(),this._initControlPos&&this._initControlPos()},_initPanes:function(){var t=this._panes={};this._mapPane=t.mapPane=this._createPane("leaflet-map-pane",this._container),this._tilePane=t.tilePane=this._createPane("leaflet-tile-pane",this._mapPane),t.objectsPane=this._createPane("leaflet-objects-pane",this._mapPane),t.shadowPane=this._createPane("leaflet-shadow-pane"),t.overlayPane=this._createPane("leaflet-overlay-pane"),t.markerPane=this._createPane("leaflet-marker-pane"),t.popupPane=this._createPane("leaflet-popup-pane");var e=" leaflet-zoom-hide";this.options.markerZoomAnimation||(o.DomUtil.addClass(t.markerPane,e),o.DomUtil.addClass(t.shadowPane,e),o.DomUtil.addClass(t.popupPane,e))},_createPane:function(t,e){return o.DomUtil.create("div",t,e||this._panes.objectsPane)},_clearPanes:function(){this._container.removeChild(this._mapPane)},_addLayers:function(t){t=t?o.Util.isArray(t)?t:[t]:[];for(var e=0,i=t.length;i>e;e++)this.addLayer(t[e])},_resetView:function(t,e,i,n){var s=this._zoom!==e;n||(this.fire("movestart"),s&&this.fire("zoomstart")),this._zoom=e,this._initialCenter=t,this._initialTopLeftPoint=this._getNewTopLeftPoint(t),i?this._initialTopLeftPoint._add(this._getMapPanePos()):o.DomUtil.setPosition(this._mapPane,new o.Point(0,0)),this._tileLayersToLoad=this._tileLayersNum;var a=!this._loaded;this._loaded=!0,this.fire("viewreset",{hard:!i}),a&&(this.fire("load"),this.eachLayer(this._layerAdd,this)),this.fire("move"),(s||n)&&this.fire("zoomend"),this.fire("moveend",{hard:!i})},_rawPanBy:function(t){o.DomUtil.setPosition(this._mapPane,this._getMapPanePos().subtract(t))},_getZoomSpan:function(){return this.getMaxZoom()-this.getMinZoom()},_updateZoomLevels:function(){var t,e=1/0,n=-(1/0),o=this._getZoomSpan();for(t in this._zoomBoundLayers){var s=this._zoomBoundLayers[t];isNaN(s.options.minZoom)||(e=Math.min(e,s.options.minZoom)),isNaN(s.options.maxZoom)||(n=Math.max(n,s.options.maxZoom))}t===i?this._layersMaxZoom=this._layersMinZoom=i:(this._layersMaxZoom=n,this._layersMinZoom=e),o!==this._getZoomSpan()&&this.fire("zoomlevelschange")},_panInsideMaxBounds:function(){this.panInsideBounds(this.options.maxBounds)},_checkIfLoaded:function(){if(!this._loaded)throw new Error("Set map center and zoom first.")},_initEvents:function(e){if(o.DomEvent){e=e||"on",o.DomEvent[e](this._container,"click",this._onMouseClick,this);var i,n,s=["dblclick","mousedown","mouseup","mouseenter","mouseleave","mousemove","contextmenu"];for(i=0,n=s.length;n>i;i++)o.DomEvent[e](this._container,s[i],this._fireMouseEvent,this);this.options.trackResize&&o.DomEvent[e](t,"resize",this._onResize,this)}},_onResize:function(){o.Util.cancelAnimFrame(this._resizeRequest),this._resizeRequest=o.Util.requestAnimFrame(function(){this.invalidateSize({debounceMoveend:!0})},this,!1,this._container)},_onMouseClick:function(t){!this._loaded||!t._simulated&&(this.dragging&&this.dragging.moved()||this.boxZoom&&this.boxZoom.moved())||o.DomEvent._skipped(t)||(this.fire("preclick"),this._fireMouseEvent(t))},_fireMouseEvent:function(t){if(this._loaded&&!o.DomEvent._skipped(t)){var e=t.type;if(e="mouseenter"===e?"mouseover":"mouseleave"===e?"mouseout":e,this.hasEventListeners(e)){"contextmenu"===e&&o.DomEvent.preventDefault(t);var i=this.mouseEventToContainerPoint(t),n=this.containerPointToLayerPoint(i),s=this.layerPointToLatLng(n);this.fire(e,{latlng:s,layerPoint:n,containerPoint:i,originalEvent:t})}}},_onTileLayerLoad:function(){this._tileLayersToLoad--,this._tileLayersNum&&!this._tileLayersToLoad&&this.fire("tilelayersload")},_clearHandlers:function(){for(var t=0,e=this._handlers.length;e>t;t++)this._handlers[t].disable()},whenReady:function(t,e){return this._loaded?t.call(e||this,this):this.on("load",t,e),this},_layerAdd:function(t){t.onAdd(this),this.fire("layeradd",{layer:t})},_getMapPanePos:function(){return o.DomUtil.getPosition(this._mapPane)},_moved:function(){var t=this._getMapPanePos();return t&&!t.equals([0,0])},_getTopLeftPoint:function(){return this.getPixelOrigin().subtract(this._getMapPanePos())},_getNewTopLeftPoint:function(t,e){var i=this.getSize()._divideBy(2);return this.project(t,e)._subtract(i)._round()},_latLngToNewLayerPoint:function(t,e,i){var n=this._getNewTopLeftPoint(i,e).add(this._getMapPanePos());return this.project(t,e)._subtract(n)},_getCenterLayerPoint:function(){return this.containerPointToLayerPoint(this.getSize()._divideBy(2))},_getCenterOffset:function(t){return this.latLngToLayerPoint(t).subtract(this._getCenterLayerPoint())},_limitCenter:function(t,e,i){if(!i)return t;var n=this.project(t,e),s=this.getSize().divideBy(2),a=new o.Bounds(n.subtract(s),n.add(s)),r=this._getBoundsOffset(a,i,e);return this.unproject(n.add(r),e)},_limitOffset:function(t,e){if(!e)return t;var i=this.getPixelBounds(),n=new o.Bounds(i.min.add(t),i.max.add(t));return t.add(this._getBoundsOffset(n,e))},_getBoundsOffset:function(t,e,i){var n=this.project(e.getNorthWest(),i).subtract(t.min),s=this.project(e.getSouthEast(),i).subtract(t.max),a=this._rebound(n.x,-s.x),r=this._rebound(n.y,-s.y);return new o.Point(a,r)},_rebound:function(t,e){return t+e>0?Math.round(t-e)/2:Math.max(0,Math.ceil(t))-Math.max(0,Math.floor(e))},_limitZoom:function(t){var e=this.getMinZoom(),i=this.getMaxZoom();return Math.max(e,Math.min(i,t))}}),o.map=function(t,e){return new o.Map(t,e)},o.Projection.Mercator={MAX_LATITUDE:85.0840591556,R_MINOR:6356752.314245179,R_MAJOR:6378137,project:function(t){var e=o.LatLng.DEG_TO_RAD,i=this.MAX_LATITUDE,n=Math.max(Math.min(i,t.lat),-i),s=this.R_MAJOR,a=this.R_MINOR,r=t.lng*e*s,h=n*e,l=a/s,u=Math.sqrt(1-l*l),c=u*Math.sin(h);c=Math.pow((1-c)/(1+c),.5*u);var d=Math.tan(.5*(.5*Math.PI-h))/c;return h=-s*Math.log(d),new o.Point(r,h)},unproject:function(t){for(var e,i=o.LatLng.RAD_TO_DEG,n=this.R_MAJOR,s=this.R_MINOR,a=t.x*i/n,r=s/n,h=Math.sqrt(1-r*r),l=Math.exp(-t.y/n),u=Math.PI/2-2*Math.atan(l),c=15,d=1e-7,p=c,_=.1;Math.abs(_)>d&&--p>0;)e=h*Math.sin(u),_=Math.PI/2-2*Math.atan(l*Math.pow((1-e)/(1+e),.5*h))-u,u+=_;return new o.LatLng(u*i,a)}},o.CRS.EPSG3395=o.extend({},o.CRS,{code:"EPSG:3395",projection:o.Projection.Mercator,
+transformation:function(){var t=o.Projection.Mercator,e=t.R_MAJOR,i=.5/(Math.PI*e);return new o.Transformation(i,.5,-i,.5)}()}),o.TileLayer=o.Class.extend({includes:o.Mixin.Events,options:{minZoom:0,maxZoom:18,tileSize:256,subdomains:"abc",errorTileUrl:"",attribution:"",zoomOffset:0,opacity:1,unloadInvisibleTiles:o.Browser.mobile,updateWhenIdle:o.Browser.mobile},initialize:function(t,e){e=o.setOptions(this,e),e.detectRetina&&o.Browser.retina&&e.maxZoom>0&&(e.tileSize=Math.floor(e.tileSize/2),e.zoomOffset++,e.minZoom>0&&e.minZoom--,this.options.maxZoom--),e.bounds&&(e.bounds=o.latLngBounds(e.bounds)),this._url=t;var i=this.options.subdomains;"string"==typeof i&&(this.options.subdomains=i.split(""))},onAdd:function(t){this._map=t,this._animated=t._zoomAnimated,this._initContainer(),t.on({viewreset:this._reset,moveend:this._update},this),this._animated&&t.on({zoomanim:this._animateZoom,zoomend:this._endZoomAnim},this),this.options.updateWhenIdle||(this._limitedUpdate=o.Util.limitExecByInterval(this._update,150,this),t.on("move",this._limitedUpdate,this)),this._reset(),this._update()},addTo:function(t){return t.addLayer(this),this},onRemove:function(t){this._container.parentNode.removeChild(this._container),t.off({viewreset:this._reset,moveend:this._update},this),this._animated&&t.off({zoomanim:this._animateZoom,zoomend:this._endZoomAnim},this),this.options.updateWhenIdle||t.off("move",this._limitedUpdate,this),this._container=null,this._map=null},bringToFront:function(){var t=this._map._panes.tilePane;return this._container&&(t.appendChild(this._container),this._setAutoZIndex(t,Math.max)),this},bringToBack:function(){var t=this._map._panes.tilePane;return this._container&&(t.insertBefore(this._container,t.firstChild),this._setAutoZIndex(t,Math.min)),this},getAttribution:function(){return this.options.attribution},getContainer:function(){return this._container},setOpacity:function(t){return this.options.opacity=t,this._map&&this._updateOpacity(),this},setZIndex:function(t){return this.options.zIndex=t,this._updateZIndex(),this},setUrl:function(t,e){return this._url=t,e||this.redraw(),this},redraw:function(){return this._map&&(this._reset({hard:!0}),this._update()),this},_updateZIndex:function(){this._container&&this.options.zIndex!==i&&(this._container.style.zIndex=this.options.zIndex)},_setAutoZIndex:function(t,e){var i,n,o,s=t.children,a=-e(1/0,-(1/0));for(n=0,o=s.length;o>n;n++)s[n]!==this._container&&(i=parseInt(s[n].style.zIndex,10),isNaN(i)||(a=e(a,i)));this.options.zIndex=this._container.style.zIndex=(isFinite(a)?a:0)+e(1,-1)},_updateOpacity:function(){var t,e=this._tiles;if(o.Browser.ielt9)for(t in e)o.DomUtil.setOpacity(e[t],this.options.opacity);else o.DomUtil.setOpacity(this._container,this.options.opacity)},_initContainer:function(){var t=this._map._panes.tilePane;if(!this._container){if(this._container=o.DomUtil.create("div","leaflet-layer"),this._updateZIndex(),this._animated){var e="leaflet-tile-container";this._bgBuffer=o.DomUtil.create("div",e,this._container),this._tileContainer=o.DomUtil.create("div",e,this._container)}else this._tileContainer=this._container;t.appendChild(this._container),this.options.opacity<1&&this._updateOpacity()}},_reset:function(t){for(var e in this._tiles)this.fire("tileunload",{tile:this._tiles[e]});this._tiles={},this._tilesToLoad=0,this.options.reuseTiles&&(this._unusedTiles=[]),this._tileContainer.innerHTML="",this._animated&&t&&t.hard&&this._clearBgBuffer(),this._initContainer()},_getTileSize:function(){var t=this._map,e=t.getZoom()+this.options.zoomOffset,i=this.options.maxNativeZoom,n=this.options.tileSize;return i&&e>i&&(n=Math.round(t.getZoomScale(e)/t.getZoomScale(i)*n)),n},_update:function(){if(this._map){var t=this._map,e=t.getPixelBounds(),i=t.getZoom(),n=this._getTileSize();if(!(i>this.options.maxZoom||i<this.options.minZoom)){var s=o.bounds(e.min.divideBy(n)._floor(),e.max.divideBy(n)._floor());this._addTilesFromCenterOut(s),(this.options.unloadInvisibleTiles||this.options.reuseTiles)&&this._removeOtherTiles(s)}}},_addTilesFromCenterOut:function(t){var i,n,s,a=[],r=t.getCenter();for(i=t.min.y;i<=t.max.y;i++)for(n=t.min.x;n<=t.max.x;n++)s=new o.Point(n,i),this._tileShouldBeLoaded(s)&&a.push(s);var h=a.length;if(0!==h){a.sort(function(t,e){return t.distanceTo(r)-e.distanceTo(r)});var l=e.createDocumentFragment();for(this._tilesToLoad||this.fire("loading"),this._tilesToLoad+=h,n=0;h>n;n++)this._addTile(a[n],l);this._tileContainer.appendChild(l)}},_tileShouldBeLoaded:function(t){if(t.x+":"+t.y in this._tiles)return!1;var e=this.options;if(!e.continuousWorld){var i=this._getWrapTileNum();if(e.noWrap&&(t.x<0||t.x>=i.x)||t.y<0||t.y>=i.y)return!1}if(e.bounds){var n=this._getTileSize(),o=t.multiplyBy(n),s=o.add([n,n]),a=this._map.unproject(o),r=this._map.unproject(s);if(e.continuousWorld||e.noWrap||(a=a.wrap(),r=r.wrap()),!e.bounds.intersects([a,r]))return!1}return!0},_removeOtherTiles:function(t){var e,i,n,o;for(o in this._tiles)e=o.split(":"),i=parseInt(e[0],10),n=parseInt(e[1],10),(i<t.min.x||i>t.max.x||n<t.min.y||n>t.max.y)&&this._removeTile(o)},_removeTile:function(t){var e=this._tiles[t];this.fire("tileunload",{tile:e,url:e.src}),this.options.reuseTiles?(o.DomUtil.removeClass(e,"leaflet-tile-loaded"),this._unusedTiles.push(e)):e.parentNode===this._tileContainer&&this._tileContainer.removeChild(e),o.Browser.android||(e.onload=null,e.src=o.Util.emptyImageUrl),delete this._tiles[t]},_addTile:function(t,e){var i=this._getTilePos(t),n=this._getTile();o.DomUtil.setPosition(n,i,o.Browser.chrome),this._tiles[t.x+":"+t.y]=n,this._loadTile(n,t),n.parentNode!==this._tileContainer&&e.appendChild(n)},_getZoomForUrl:function(){var t=this.options,e=this._map.getZoom();return t.zoomReverse&&(e=t.maxZoom-e),e+=t.zoomOffset,t.maxNativeZoom?Math.min(e,t.maxNativeZoom):e},_getTilePos:function(t){var e=this._map.getPixelOrigin(),i=this._getTileSize();return t.multiplyBy(i).subtract(e)},getTileUrl:function(t){return o.Util.template(this._url,o.extend({s:this._getSubdomain(t),z:t.z,x:t.x,y:t.y},this.options))},_getWrapTileNum:function(){var t=this._map.options.crs,e=t.getSize(this._map.getZoom());return e.divideBy(this._getTileSize())._floor()},_adjustTilePoint:function(t){var e=this._getWrapTileNum();this.options.continuousWorld||this.options.noWrap||(t.x=(t.x%e.x+e.x)%e.x),this.options.tms&&(t.y=e.y-t.y-1),t.z=this._getZoomForUrl()},_getSubdomain:function(t){var e=Math.abs(t.x+t.y)%this.options.subdomains.length;return this.options.subdomains[e]},_getTile:function(){if(this.options.reuseTiles&&this._unusedTiles.length>0){var t=this._unusedTiles.pop();return this._resetTile(t),t}return this._createTile()},_resetTile:function(){},_createTile:function(){var t=o.DomUtil.create("img","leaflet-tile");return t.style.width=t.style.height=this._getTileSize()+"px",t.galleryimg="no",t.onselectstart=t.onmousemove=o.Util.falseFn,o.Browser.ielt9&&this.options.opacity!==i&&o.DomUtil.setOpacity(t,this.options.opacity),o.Browser.mobileWebkit3d&&(t.style.WebkitBackfaceVisibility="hidden"),t},_loadTile:function(t,e){t._layer=this,t.onload=this._tileOnLoad,t.onerror=this._tileOnError,this._adjustTilePoint(e),t.src=this.getTileUrl(e),this.fire("tileloadstart",{tile:t,url:t.src})},_tileLoaded:function(){this._tilesToLoad--,this._animated&&o.DomUtil.addClass(this._tileContainer,"leaflet-zoom-animated"),this._tilesToLoad||(this.fire("load"),this._animated&&(clearTimeout(this._clearBgBufferTimer),this._clearBgBufferTimer=setTimeout(o.bind(this._clearBgBuffer,this),500)))},_tileOnLoad:function(){var t=this._layer;this.src!==o.Util.emptyImageUrl&&(o.DomUtil.addClass(this,"leaflet-tile-loaded"),t.fire("tileload",{tile:this,url:this.src})),t._tileLoaded()},_tileOnError:function(){var t=this._layer;t.fire("tileerror",{tile:this,url:this.src});var e=t.options.errorTileUrl;e&&(this.src=e),t._tileLoaded()}}),o.tileLayer=function(t,e){return new o.TileLayer(t,e)},o.TileLayer.WMS=o.TileLayer.extend({defaultWmsParams:{service:"WMS",request:"GetMap",version:"1.1.1",layers:"",styles:"",format:"image/jpeg",transparent:!1},initialize:function(t,e){this._url=t;var i=o.extend({},this.defaultWmsParams),n=e.tileSize||this.options.tileSize;e.detectRetina&&o.Browser.retina?i.width=i.height=2*n:i.width=i.height=n;for(var s in e)this.options.hasOwnProperty(s)||"crs"===s||(i[s]=e[s]);this.wmsParams=i,o.setOptions(this,e)},onAdd:function(t){this._crs=this.options.crs||t.options.crs,this._wmsVersion=parseFloat(this.wmsParams.version);var e=this._wmsVersion>=1.3?"crs":"srs";this.wmsParams[e]=this._crs.code,o.TileLayer.prototype.onAdd.call(this,t)},getTileUrl:function(t){var e=this._map,i=this.options.tileSize,n=t.multiplyBy(i),s=n.add([i,i]),a=this._crs.project(e.unproject(n,t.z)),r=this._crs.project(e.unproject(s,t.z)),h=this._wmsVersion>=1.3&&this._crs===o.CRS.EPSG4326?[r.y,a.x,a.y,r.x].join(","):[a.x,r.y,r.x,a.y].join(","),l=o.Util.template(this._url,{s:this._getSubdomain(t)});return l+o.Util.getParamString(this.wmsParams,l,!0)+"&BBOX="+h},setParams:function(t,e){return o.extend(this.wmsParams,t),e||this.redraw(),this}}),o.tileLayer.wms=function(t,e){return new o.TileLayer.WMS(t,e)},o.TileLayer.Canvas=o.TileLayer.extend({options:{async:!1},initialize:function(t){o.setOptions(this,t)},redraw:function(){this._map&&(this._reset({hard:!0}),this._update());for(var t in this._tiles)this._redrawTile(this._tiles[t]);return this},_redrawTile:function(t){this.drawTile(t,t._tilePoint,this._map._zoom)},_createTile:function(){var t=o.DomUtil.create("canvas","leaflet-tile");return t.width=t.height=this.options.tileSize,t.onselectstart=t.onmousemove=o.Util.falseFn,t},_loadTile:function(t,e){t._layer=this,t._tilePoint=e,this._redrawTile(t),this.options.async||this.tileDrawn(t)},drawTile:function(){},tileDrawn:function(t){this._tileOnLoad.call(t)}}),o.tileLayer.canvas=function(t){return new o.TileLayer.Canvas(t)},o.ImageOverlay=o.Class.extend({includes:o.Mixin.Events,options:{opacity:1},initialize:function(t,e,i){this._url=t,this._bounds=o.latLngBounds(e),o.setOptions(this,i)},onAdd:function(t){this._map=t,this._image||this._initImage(),t._panes.overlayPane.appendChild(this._image),t.on("viewreset",this._reset,this),t.options.zoomAnimation&&o.Browser.any3d&&t.on("zoomanim",this._animateZoom,this),this._reset()},onRemove:function(t){t.getPanes().overlayPane.removeChild(this._image),t.off("viewreset",this._reset,this),t.options.zoomAnimation&&t.off("zoomanim",this._animateZoom,this)},addTo:function(t){return t.addLayer(this),this},setOpacity:function(t){return this.options.opacity=t,this._updateOpacity(),this},bringToFront:function(){return this._image&&this._map._panes.overlayPane.appendChild(this._image),this},bringToBack:function(){var t=this._map._panes.overlayPane;return this._image&&t.insertBefore(this._image,t.firstChild),this},setUrl:function(t){this._url=t,this._image.src=this._url},getAttribution:function(){return this.options.attribution},_initImage:function(){this._image=o.DomUtil.create("img","leaflet-image-layer"),this._map.options.zoomAnimation&&o.Browser.any3d?o.DomUtil.addClass(this._image,"leaflet-zoom-animated"):o.DomUtil.addClass(this._image,"leaflet-zoom-hide"),this._updateOpacity(),o.extend(this._image,{galleryimg:"no",onselectstart:o.Util.falseFn,onmousemove:o.Util.falseFn,onload:o.bind(this._onImageLoad,this),src:this._url})},_animateZoom:function(t){var e=this._map,i=this._image,n=e.getZoomScale(t.zoom),s=this._bounds.getNorthWest(),a=this._bounds.getSouthEast(),r=e._latLngToNewLayerPoint(s,t.zoom,t.center),h=e._latLngToNewLayerPoint(a,t.zoom,t.center)._subtract(r),l=r._add(h._multiplyBy(.5*(1-1/n)));i.style[o.DomUtil.TRANSFORM]=o.DomUtil.getTranslateString(l)+" scale("+n+") "},_reset:function(){var t=this._image,e=this._map.latLngToLayerPoint(this._bounds.getNorthWest()),i=this._map.latLngToLayerPoint(this._bounds.getSouthEast())._subtract(e);o.DomUtil.setPosition(t,e),t.style.width=i.x+"px",t.style.height=i.y+"px"},_onImageLoad:function(){this.fire("load")},_updateOpacity:function(){o.DomUtil.setOpacity(this._image,this.options.opacity)}}),o.imageOverlay=function(t,e,i){return new o.ImageOverlay(t,e,i)},o.Icon=o.Class.extend({options:{className:""},initialize:function(t){o.setOptions(this,t)},createIcon:function(t){return this._createIcon("icon",t)},createShadow:function(t){return this._createIcon("shadow",t)},_createIcon:function(t,e){var i=this._getIconUrl(t);if(!i){if("icon"===t)throw new Error("iconUrl not set in Icon options (see the docs).");return null}var n;return n=e&&"IMG"===e.tagName?this._createImg(i,e):this._createImg(i),this._setIconStyles(n,t),n},_setIconStyles:function(t,e){var i,n=this.options,s=o.point(n[e+"Size"]);i="shadow"===e?o.point(n.shadowAnchor||n.iconAnchor):o.point(n.iconAnchor),!i&&s&&(i=s.divideBy(2,!0)),t.className="leaflet-marker-"+e+" "+n.className,i&&(t.style.marginLeft=-i.x+"px",t.style.marginTop=-i.y+"px"),s&&(t.style.width=s.x+"px",t.style.height=s.y+"px")},_createImg:function(t,i){return i=i||e.createElement("img"),i.src=t,i},_getIconUrl:function(t){return o.Browser.retina&&this.options[t+"RetinaUrl"]?this.options[t+"RetinaUrl"]:this.options[t+"Url"]}}),o.icon=function(t){return new o.Icon(t)},o.Icon.Default=o.Icon.extend({options:{iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]},_getIconUrl:function(t){var e=t+"Url";if(this.options[e])return this.options[e];o.Browser.retina&&"icon"===t&&(t+="-2x");var i=o.Icon.Default.imagePath;if(!i)throw new Error("Couldn't autodetect L.Icon.Default.imagePath, set it manually.");return i+"/marker-"+t+".png"}}),o.Icon.Default.imagePath=function(){var t,i,n,o,s,a=e.getElementsByTagName("script"),r=/[\/^]leaflet[\-\._]?([\w\-\._]*)\.js\??/;for(t=0,i=a.length;i>t;t++)if(n=a[t].src,o=n.match(r))return s=n.split(r)[0],(s?s+"/":"")+"images"}(),o.Marker=o.Class.extend({includes:o.Mixin.Events,options:{icon:new o.Icon.Default,title:"",alt:"",clickable:!0,draggable:!1,keyboard:!0,zIndexOffset:0,opacity:1,riseOnHover:!1,riseOffset:250},initialize:function(t,e){o.setOptions(this,e),this._latlng=o.latLng(t)},onAdd:function(t){this._map=t,t.on("viewreset",this.update,this),this._initIcon(),this.update(),this.fire("add"),t.options.zoomAnimation&&t.options.markerZoomAnimation&&t.on("zoomanim",this._animateZoom,this)},addTo:function(t){return t.addLayer(this),this},onRemove:function(t){this.dragging&&this.dragging.disable(),this._removeIcon(),this._removeShadow(),this.fire("remove"),t.off({viewreset:this.update,zoomanim:this._animateZoom},this),this._map=null},getLatLng:function(){return this._latlng},setLatLng:function(t){return this._latlng=o.latLng(t),this.update(),this.fire("move",{latlng:this._latlng})},setZIndexOffset:function(t){return this.options.zIndexOffset=t,this.update(),this},setIcon:function(t){return this.options.icon=t,this._map&&(this._initIcon(),this.update()),this._popup&&this.bindPopup(this._popup),this},update:function(){return this._icon&&this._setPos(this._map.latLngToLayerPoint(this._latlng).round()),this},_initIcon:function(){var t=this.options,e=this._map,i=e.options.zoomAnimation&&e.options.markerZoomAnimation,n=i?"leaflet-zoom-animated":"leaflet-zoom-hide",s=t.icon.createIcon(this._icon),a=!1;s!==this._icon&&(this._icon&&this._removeIcon(),a=!0,t.title&&(s.title=t.title),t.alt&&(s.alt=t.alt)),o.DomUtil.addClass(s,n),t.keyboard&&(s.tabIndex="0"),this._icon=s,this._initInteraction(),t.riseOnHover&&o.DomEvent.on(s,"mouseover",this._bringToFront,this).on(s,"mouseout",this._resetZIndex,this);var r=t.icon.createShadow(this._shadow),h=!1;r!==this._shadow&&(this._removeShadow(),h=!0),r&&o.DomUtil.addClass(r,n),this._shadow=r,t.opacity<1&&this._updateOpacity();var l=this._map._panes;a&&l.markerPane.appendChild(this._icon),r&&h&&l.shadowPane.appendChild(this._shadow)},_removeIcon:function(){this.options.riseOnHover&&o.DomEvent.off(this._icon,"mouseover",this._bringToFront).off(this._icon,"mouseout",this._resetZIndex),this._map._panes.markerPane.removeChild(this._icon),this._icon=null},_removeShadow:function(){this._shadow&&this._map._panes.shadowPane.removeChild(this._shadow),this._shadow=null},_setPos:function(t){o.DomUtil.setPosition(this._icon,t),this._shadow&&o.DomUtil.setPosition(this._shadow,t),this._zIndex=t.y+this.options.zIndexOffset,this._resetZIndex()},_updateZIndex:function(t){this._icon.style.zIndex=this._zIndex+t},_animateZoom:function(t){var e=this._map._latLngToNewLayerPoint(this._latlng,t.zoom,t.center).round();this._setPos(e)},_initInteraction:function(){if(this.options.clickable){var t=this._icon,e=["dblclick","mousedown","mouseover","mouseout","contextmenu"];o.DomUtil.addClass(t,"leaflet-clickable"),o.DomEvent.on(t,"click",this._onMouseClick,this),o.DomEvent.on(t,"keypress",this._onKeyPress,this);for(var i=0;i<e.length;i++)o.DomEvent.on(t,e[i],this._fireMouseEvent,this);o.Handler.MarkerDrag&&(this.dragging=new o.Handler.MarkerDrag(this),this.options.draggable&&this.dragging.enable())}},_onMouseClick:function(t){var e=this.dragging&&this.dragging.moved();(this.hasEventListeners(t.type)||e)&&o.DomEvent.stopPropagation(t),e||(this.dragging&&this.dragging._enabled||!this._map.dragging||!this._map.dragging.moved())&&this.fire(t.type,{originalEvent:t,latlng:this._latlng})},_onKeyPress:function(t){13===t.keyCode&&this.fire("click",{originalEvent:t,latlng:this._latlng})},_fireMouseEvent:function(t){this.fire(t.type,{originalEvent:t,latlng:this._latlng}),"contextmenu"===t.type&&this.hasEventListeners(t.type)&&o.DomEvent.preventDefault(t),"mousedown"!==t.type?o.DomEvent.stopPropagation(t):o.DomEvent.preventDefault(t)},setOpacity:function(t){return this.options.opacity=t,this._map&&this._updateOpacity(),this},_updateOpacity:function(){o.DomUtil.setOpacity(this._icon,this.options.opacity),this._shadow&&o.DomUtil.setOpacity(this._shadow,this.options.opacity)},_bringToFront:function(){this._updateZIndex(this.options.riseOffset)},_resetZIndex:function(){this._updateZIndex(0)}}),o.marker=function(t,e){return new o.Marker(t,e)},o.DivIcon=o.Icon.extend({options:{iconSize:[12,12],className:"leaflet-div-icon",html:!1},createIcon:function(t){var i=t&&"DIV"===t.tagName?t:e.createElement("div"),n=this.options;return n.html!==!1?i.innerHTML=n.html:i.innerHTML="",n.bgPos&&(i.style.backgroundPosition=-n.bgPos.x+"px "+-n.bgPos.y+"px"),this._setIconStyles(i,"icon"),i},createShadow:function(){return null}}),o.divIcon=function(t){return new o.DivIcon(t)},o.Map.mergeOptions({closePopupOnClick:!0}),o.Popup=o.Class.extend({includes:o.Mixin.Events,options:{minWidth:50,maxWidth:300,autoPan:!0,closeButton:!0,offset:[0,7],autoPanPadding:[5,5],keepInView:!1,className:"",zoomAnimation:!0},initialize:function(t,e){o.setOptions(this,t),this._source=e,this._animated=o.Browser.any3d&&this.options.zoomAnimation,this._isOpen=!1},onAdd:function(t){this._map=t,this._container||this._initLayout();var e=t.options.fadeAnimation;e&&o.DomUtil.setOpacity(this._container,0),t._panes.popupPane.appendChild(this._container),t.on(this._getEvents(),this),this.update(),e&&o.DomUtil.setOpacity(this._container,1),this.fire("open"),t.fire("popupopen",{popup:this}),this._source&&this._source.fire("popupopen",{popup:this})},addTo:function(t){return t.addLayer(this),this},openOn:function(t){return t.openPopup(this),this},onRemove:function(t){t._panes.popupPane.removeChild(this._container),o.Util.falseFn(this._container.offsetWidth),t.off(this._getEvents(),this),t.options.fadeAnimation&&o.DomUtil.setOpacity(this._container,0),this._map=null,this.fire("close"),t.fire("popupclose",{popup:this}),this._source&&this._source.fire("popupclose",{popup:this})},getLatLng:function(){return this._latlng},setLatLng:function(t){return this._latlng=o.latLng(t),this._map&&(this._updatePosition(),this._adjustPan()),this},getContent:function(){return this._content},setContent:function(t){return this._content=t,this.update(),this},update:function(){this._map&&(this._container.style.visibility="hidden",this._updateContent(),this._updateLayout(),this._updatePosition(),this._container.style.visibility="",this._adjustPan())},_getEvents:function(){var t={viewreset:this._updatePosition};return this._animated&&(t.zoomanim=this._zoomAnimation),("closeOnClick"in this.options?this.options.closeOnClick:this._map.options.closePopupOnClick)&&(t.preclick=this._close),this.options.keepInView&&(t.moveend=this._adjustPan),t},_close:function(){this._map&&this._map.closePopup(this)},_initLayout:function(){var t,e="leaflet-popup",i=e+" "+this.options.className+" leaflet-zoom-"+(this._animated?"animated":"hide"),n=this._container=o.DomUtil.create("div",i);this.options.closeButton&&(t=this._closeButton=o.DomUtil.create("a",e+"-close-button",n),t.href="#close",t.innerHTML="×",o.DomEvent.disableClickPropagation(t),o.DomEvent.on(t,"click",this._onCloseButtonClick,this));var s=this._wrapper=o.DomUtil.create("div",e+"-content-wrapper",n);o.DomEvent.disableClickPropagation(s),this._contentNode=o.DomUtil.create("div",e+"-content",s),o.DomEvent.disableScrollPropagation(this._contentNode),o.DomEvent.on(s,"contextmenu",o.DomEvent.stopPropagation),this._tipContainer=o.DomUtil.create("div",e+"-tip-container",n),this._tip=o.DomUtil.create("div",e+"-tip",this._tipContainer)},_updateContent:function(){if(this._content){if("string"==typeof this._content)this._contentNode.innerHTML=this._content;else{for(;this._contentNode.hasChildNodes();)this._contentNode.removeChild(this._contentNode.firstChild);this._contentNode.appendChild(this._content)}this.fire("contentupdate")}},_updateLayout:function(){var t=this._contentNode,e=t.style;e.width="",e.whiteSpace="nowrap";var i=t.offsetWidth;i=Math.min(i,this.options.maxWidth),i=Math.max(i,this.options.minWidth),e.width=i+1+"px",e.whiteSpace="",e.height="";var n=t.offsetHeight,s=this.options.maxHeight,a="leaflet-popup-scrolled";s&&n>s?(e.height=s+"px",o.DomUtil.addClass(t,a)):o.DomUtil.removeClass(t,a),this._containerWidth=this._container.offsetWidth},_updatePosition:function(){if(this._map){var t=this._map.latLngToLayerPoint(this._latlng),e=this._animated,i=o.point(this.options.offset);e&&o.DomUtil.setPosition(this._container,t),this._containerBottom=-i.y-(e?0:t.y),this._containerLeft=-Math.round(this._containerWidth/2)+i.x+(e?0:t.x),this._container.style.bottom=this._containerBottom+"px",this._container.style.left=this._containerLeft+"px"}},_zoomAnimation:function(t){var e=this._map._latLngToNewLayerPoint(this._latlng,t.zoom,t.center);o.DomUtil.setPosition(this._container,e)},_adjustPan:function(){if(this.options.autoPan){var t=this._map,e=this._container.offsetHeight,i=this._containerWidth,n=new o.Point(this._containerLeft,-e-this._containerBottom);this._animated&&n._add(o.DomUtil.getPosition(this._container));var s=t.layerPointToContainerPoint(n),a=o.point(this.options.autoPanPadding),r=o.point(this.options.autoPanPaddingTopLeft||a),h=o.point(this.options.autoPanPaddingBottomRight||a),l=t.getSize(),u=0,c=0;s.x+i+h.x>l.x&&(u=s.x+i-l.x+h.x),s.x-u-r.x<0&&(u=s.x-r.x),s.y+e+h.y>l.y&&(c=s.y+e-l.y+h.y),s.y-c-r.y<0&&(c=s.y-r.y),(u||c)&&t.fire("autopanstart").panBy([u,c])}},_onCloseButtonClick:function(t){this._close(),o.DomEvent.stop(t)}}),o.popup=function(t,e){return new o.Popup(t,e)},o.Map.include({openPopup:function(t,e,i){if(this.closePopup(),!(t instanceof o.Popup)){var n=t;t=new o.Popup(i).setLatLng(e).setContent(n)}return t._isOpen=!0,this._popup=t,this.addLayer(t)},closePopup:function(t){return t&&t!==this._popup||(t=this._popup,this._popup=null),t&&(this.removeLayer(t),t._isOpen=!1),this}}),o.Marker.include({openPopup:function(){return this._popup&&this._map&&!this._map.hasLayer(this._popup)&&(this._popup.setLatLng(this._latlng),this._map.openPopup(this._popup)),this},closePopup:function(){return this._popup&&this._popup._close(),this},togglePopup:function(){return this._popup&&(this._popup._isOpen?this.closePopup():this.openPopup()),this},bindPopup:function(t,e){var i=o.point(this.options.icon.options.popupAnchor||[0,0]);return i=i.add(o.Popup.prototype.options.offset),e&&e.offset&&(i=i.add(e.offset)),e=o.extend({offset:i},e),this._popupHandlersAdded||(this.on("click",this.togglePopup,this).on("remove",this.closePopup,this).on("move",this._movePopup,this),this._popupHandlersAdded=!0),t instanceof o.Popup?(o.setOptions(t,e),this._popup=t,t._source=this):this._popup=new o.Popup(e,this).setContent(t),this},setPopupContent:function(t){return this._popup&&this._popup.setContent(t),this},unbindPopup:function(){return this._popup&&(this._popup=null,this.off("click",this.togglePopup,this).off("remove",this.closePopup,this).off("move",this._movePopup,this),this._popupHandlersAdded=!1),this},getPopup:function(){return this._popup},_movePopup:function(t){this._popup.setLatLng(t.latlng)}}),o.LayerGroup=o.Class.extend({initialize:function(t){this._layers={};var e,i;if(t)for(e=0,i=t.length;i>e;e++)this.addLayer(t[e])},addLayer:function(t){var e=this.getLayerId(t);return this._layers[e]=t,this._map&&this._map.addLayer(t),this},removeLayer:function(t){var e=t in this._layers?t:this.getLayerId(t);return this._map&&this._layers[e]&&this._map.removeLayer(this._layers[e]),delete this._layers[e],this},hasLayer:function(t){return t?t in this._layers||this.getLayerId(t)in this._layers:!1},clearLayers:function(){return this.eachLayer(this.removeLayer,this),this},invoke:function(t){var e,i,n=Array.prototype.slice.call(arguments,1);for(e in this._layers)i=this._layers[e],i[t]&&i[t].apply(i,n);return this},onAdd:function(t){this._map=t,this.eachLayer(t.addLayer,t)},onRemove:function(t){this.eachLayer(t.removeLayer,t),this._map=null},addTo:function(t){return t.addLayer(this),this},eachLayer:function(t,e){for(var i in this._layers)t.call(e,this._layers[i]);return this},getLayer:function(t){return this._layers[t]},getLayers:function(){var t=[];for(var e in this._layers)t.push(this._layers[e]);return t},setZIndex:function(t){return this.invoke("setZIndex",t)},getLayerId:function(t){return o.stamp(t)}}),o.layerGroup=function(t){return new o.LayerGroup(t)},o.FeatureGroup=o.LayerGroup.extend({includes:o.Mixin.Events,statics:{EVENTS:"click dblclick mouseover mouseout mousemove contextmenu popupopen popupclose"},addLayer:function(t){return this.hasLayer(t)?this:("on"in t&&t.on(o.FeatureGroup.EVENTS,this._propagateEvent,this),o.LayerGroup.prototype.addLayer.call(this,t),this._popupContent&&t.bindPopup&&t.bindPopup(this._popupContent,this._popupOptions),this.fire("layeradd",{layer:t}))},removeLayer:function(t){return this.hasLayer(t)?(t in this._layers&&(t=this._layers[t]),"off"in t&&t.off(o.FeatureGroup.EVENTS,this._propagateEvent,this),o.LayerGroup.prototype.removeLayer.call(this,t),this._popupContent&&this.invoke("unbindPopup"),this.fire("layerremove",{layer:t})):this},bindPopup:function(t,e){return this._popupContent=t,this._popupOptions=e,this.invoke("bindPopup",t,e)},openPopup:function(t){for(var e in this._layers){this._layers[e].openPopup(t);break}return this},setStyle:function(t){return this.invoke("setStyle",t)},bringToFront:function(){return this.invoke("bringToFront")},bringToBack:function(){return this.invoke("bringToBack")},getBounds:function(){var t=new o.LatLngBounds;return this.eachLayer(function(e){t.extend(e instanceof o.Marker?e.getLatLng():e.getBounds())}),t},_propagateEvent:function(t){t=o.extend({layer:t.target,target:this},t),this.fire(t.type,t)}}),o.featureGroup=function(t){return new o.FeatureGroup(t)},o.Path=o.Class.extend({includes:[o.Mixin.Events],statics:{CLIP_PADDING:function(){var e=o.Browser.mobile?1280:2e3,i=(e/Math.max(t.outerWidth,t.outerHeight)-1)/2;return Math.max(0,Math.min(.5,i))}()},options:{stroke:!0,color:"#0033ff",dashArray:null,lineCap:null,lineJoin:null,weight:5,opacity:.5,fill:!1,fillColor:null,fillOpacity:.2,clickable:!0},initialize:function(t){o.setOptions(this,t)},onAdd:function(t){this._map=t,this._container||(this._initElements(),this._initEvents()),this.projectLatlngs(),this._updatePath(),this._container&&this._map._pathRoot.appendChild(this._container),this.fire("add"),t.on({viewreset:this.projectLatlngs,moveend:this._updatePath},this)},addTo:function(t){return t.addLayer(this),this},onRemove:function(t){t._pathRoot.removeChild(this._container),this.fire("remove"),this._map=null,o.Browser.vml&&(this._container=null,this._stroke=null,this._fill=null),t.off({viewreset:this.projectLatlngs,moveend:this._updatePath},this)},projectLatlngs:function(){},setStyle:function(t){return o.setOptions(this,t),this._container&&this._updateStyle(),this},redraw:function(){return this._map&&(this.projectLatlngs(),this._updatePath()),this}}),o.Map.include({_updatePathViewport:function(){var t=o.Path.CLIP_PADDING,e=this.getSize(),i=o.DomUtil.getPosition(this._mapPane),n=i.multiplyBy(-1)._subtract(e.multiplyBy(t)._round()),s=n.add(e.multiplyBy(1+2*t)._round());this._pathViewport=new o.Bounds(n,s)}}),o.Path.SVG_NS="http://www.w3.org/2000/svg",o.Browser.svg=!(!e.createElementNS||!e.createElementNS(o.Path.SVG_NS,"svg").createSVGRect),o.Path=o.Path.extend({statics:{SVG:o.Browser.svg},bringToFront:function(){var t=this._map._pathRoot,e=this._container;return e&&t.lastChild!==e&&t.appendChild(e),this},bringToBack:function(){var t=this._map._pathRoot,e=this._container,i=t.firstChild;return e&&i!==e&&t.insertBefore(e,i),this},getPathString:function(){},_createElement:function(t){return e.createElementNS(o.Path.SVG_NS,t)},_initElements:function(){this._map._initPathRoot(),this._initPath(),this._initStyle()},_initPath:function(){this._container=this._createElement("g"),this._path=this._createElement("path"),this.options.className&&o.DomUtil.addClass(this._path,this.options.className),this._container.appendChild(this._path)},_initStyle:function(){this.options.stroke&&(this._path.setAttribute("stroke-linejoin","round"),this._path.setAttribute("stroke-linecap","round")),this.options.fill&&this._path.setAttribute("fill-rule","evenodd"),this.options.pointerEvents&&this._path.setAttribute("pointer-events",this.options.pointerEvents),this.options.clickable||this.options.pointerEvents||this._path.setAttribute("pointer-events","none"),this._updateStyle()},_updateStyle:function(){this.options.stroke?(this._path.setAttribute("stroke",this.options.color),this._path.setAttribute("stroke-opacity",this.options.opacity),this._path.setAttribute("stroke-width",this.options.weight),this.options.dashArray?this._path.setAttribute("stroke-dasharray",this.options.dashArray):this._path.removeAttribute("stroke-dasharray"),this.options.lineCap&&this._path.setAttribute("stroke-linecap",this.options.lineCap),this.options.lineJoin&&this._path.setAttribute("stroke-linejoin",this.options.lineJoin)):this._path.setAttribute("stroke","none"),this.options.fill?(this._path.setAttribute("fill",this.options.fillColor||this.options.color),this._path.setAttribute("fill-opacity",this.options.fillOpacity)):this._path.setAttribute("fill","none")},_updatePath:function(){var t=this.getPathString();t||(t="M0 0"),this._path.setAttribute("d",t)},_initEvents:function(){if(this.options.clickable){(o.Browser.svg||!o.Browser.vml)&&o.DomUtil.addClass(this._path,"leaflet-clickable"),o.DomEvent.on(this._container,"click",this._onMouseClick,this);for(var t=["dblclick","mousedown","mouseover","mouseout","mousemove","contextmenu"],e=0;e<t.length;e++)o.DomEvent.on(this._container,t[e],this._fireMouseEvent,this)}},_onMouseClick:function(t){this._map.dragging&&this._map.dragging.moved()||this._fireMouseEvent(t)},_fireMouseEvent:function(t){if(this._map&&this.hasEventListeners(t.type)){var e=this._map,i=e.mouseEventToContainerPoint(t),n=e.containerPointToLayerPoint(i),s=e.layerPointToLatLng(n);this.fire(t.type,{latlng:s,layerPoint:n,containerPoint:i,originalEvent:t}),"contextmenu"===t.type&&o.DomEvent.preventDefault(t),"mousemove"!==t.type&&o.DomEvent.stopPropagation(t)}}}),o.Map.include({_initPathRoot:function(){this._pathRoot||(this._pathRoot=o.Path.prototype._createElement("svg"),this._panes.overlayPane.appendChild(this._pathRoot),this.options.zoomAnimation&&o.Browser.any3d?(o.DomUtil.addClass(this._pathRoot,"leaflet-zoom-animated"),
+this.on({zoomanim:this._animatePathZoom,zoomend:this._endPathZoom})):o.DomUtil.addClass(this._pathRoot,"leaflet-zoom-hide"),this.on("moveend",this._updateSvgViewport),this._updateSvgViewport())},_animatePathZoom:function(t){var e=this.getZoomScale(t.zoom),i=this._getCenterOffset(t.center)._multiplyBy(-e)._add(this._pathViewport.min);this._pathRoot.style[o.DomUtil.TRANSFORM]=o.DomUtil.getTranslateString(i)+" scale("+e+") ",this._pathZooming=!0},_endPathZoom:function(){this._pathZooming=!1},_updateSvgViewport:function(){if(!this._pathZooming){this._updatePathViewport();var t=this._pathViewport,e=t.min,i=t.max,n=i.x-e.x,s=i.y-e.y,a=this._pathRoot,r=this._panes.overlayPane;o.Browser.mobileWebkit&&r.removeChild(a),o.DomUtil.setPosition(a,e),a.setAttribute("width",n),a.setAttribute("height",s),a.setAttribute("viewBox",[e.x,e.y,n,s].join(" ")),o.Browser.mobileWebkit&&r.appendChild(a)}}}),o.Path.include({bindPopup:function(t,e){return t instanceof o.Popup?this._popup=t:((!this._popup||e)&&(this._popup=new o.Popup(e,this)),this._popup.setContent(t)),this._popupHandlersAdded||(this.on("click",this._openPopup,this).on("remove",this.closePopup,this),this._popupHandlersAdded=!0),this},unbindPopup:function(){return this._popup&&(this._popup=null,this.off("click",this._openPopup).off("remove",this.closePopup),this._popupHandlersAdded=!1),this},openPopup:function(t){return this._popup&&(t=t||this._latlng||this._latlngs[Math.floor(this._latlngs.length/2)],this._openPopup({latlng:t})),this},closePopup:function(){return this._popup&&this._popup._close(),this},_openPopup:function(t){this._popup.setLatLng(t.latlng),this._map.openPopup(this._popup)}}),o.Browser.vml=!o.Browser.svg&&function(){try{var t=e.createElement("div");t.innerHTML='<v:shape adj="1"/>';var i=t.firstChild;return i.style.behavior="url(#default#VML)",i&&"object"==typeof i.adj}catch(n){return!1}}(),o.Path=o.Browser.svg||!o.Browser.vml?o.Path:o.Path.extend({statics:{VML:!0,CLIP_PADDING:.02},_createElement:function(){try{return e.namespaces.add("lvml","urn:schemas-microsoft-com:vml"),function(t){return e.createElement("<lvml:"+t+' class="lvml">')}}catch(t){return function(t){return e.createElement("<"+t+' xmlns="urn:schemas-microsoft.com:vml" class="lvml">')}}}(),_initPath:function(){var t=this._container=this._createElement("shape");o.DomUtil.addClass(t,"leaflet-vml-shape"+(this.options.className?" "+this.options.className:"")),this.options.clickable&&o.DomUtil.addClass(t,"leaflet-clickable"),t.coordsize="1 1",this._path=this._createElement("path"),t.appendChild(this._path),this._map._pathRoot.appendChild(t)},_initStyle:function(){this._updateStyle()},_updateStyle:function(){var t=this._stroke,e=this._fill,i=this.options,n=this._container;n.stroked=i.stroke,n.filled=i.fill,i.stroke?(t||(t=this._stroke=this._createElement("stroke"),t.endcap="round",n.appendChild(t)),t.weight=i.weight+"px",t.color=i.color,t.opacity=i.opacity,i.dashArray?t.dashStyle=o.Util.isArray(i.dashArray)?i.dashArray.join(" "):i.dashArray.replace(/( *, *)/g," "):t.dashStyle="",i.lineCap&&(t.endcap=i.lineCap.replace("butt","flat")),i.lineJoin&&(t.joinstyle=i.lineJoin)):t&&(n.removeChild(t),this._stroke=null),i.fill?(e||(e=this._fill=this._createElement("fill"),n.appendChild(e)),e.color=i.fillColor||i.color,e.opacity=i.fillOpacity):e&&(n.removeChild(e),this._fill=null)},_updatePath:function(){var t=this._container.style;t.display="none",this._path.v=this.getPathString()+" ",t.display=""}}),o.Map.include(o.Browser.svg||!o.Browser.vml?{}:{_initPathRoot:function(){if(!this._pathRoot){var t=this._pathRoot=e.createElement("div");t.className="leaflet-vml-container",this._panes.overlayPane.appendChild(t),this.on("moveend",this._updatePathViewport),this._updatePathViewport()}}}),o.Browser.canvas=function(){return!!e.createElement("canvas").getContext}(),o.Path=o.Path.SVG&&!t.L_PREFER_CANVAS||!o.Browser.canvas?o.Path:o.Path.extend({statics:{CANVAS:!0,SVG:!1},redraw:function(){return this._map&&(this.projectLatlngs(),this._requestUpdate()),this},setStyle:function(t){return o.setOptions(this,t),this._map&&(this._updateStyle(),this._requestUpdate()),this},onRemove:function(t){t.off("viewreset",this.projectLatlngs,this).off("moveend",this._updatePath,this),this.options.clickable&&(this._map.off("click",this._onClick,this),this._map.off("mousemove",this._onMouseMove,this)),this._requestUpdate(),this.fire("remove"),this._map=null},_requestUpdate:function(){this._map&&!o.Path._updateRequest&&(o.Path._updateRequest=o.Util.requestAnimFrame(this._fireMapMoveEnd,this._map))},_fireMapMoveEnd:function(){o.Path._updateRequest=null,this.fire("moveend")},_initElements:function(){this._map._initPathRoot(),this._ctx=this._map._canvasCtx},_updateStyle:function(){var t=this.options;t.stroke&&(this._ctx.lineWidth=t.weight,this._ctx.strokeStyle=t.color),t.fill&&(this._ctx.fillStyle=t.fillColor||t.color),t.lineCap&&(this._ctx.lineCap=t.lineCap),t.lineJoin&&(this._ctx.lineJoin=t.lineJoin)},_drawPath:function(){var t,e,i,n,s,a;for(this._ctx.beginPath(),t=0,i=this._parts.length;i>t;t++){for(e=0,n=this._parts[t].length;n>e;e++)s=this._parts[t][e],a=(0===e?"move":"line")+"To",this._ctx[a](s.x,s.y);this instanceof o.Polygon&&this._ctx.closePath()}},_checkIfEmpty:function(){return!this._parts.length},_updatePath:function(){if(!this._checkIfEmpty()){var t=this._ctx,e=this.options;this._drawPath(),t.save(),this._updateStyle(),e.fill&&(t.globalAlpha=e.fillOpacity,t.fill(e.fillRule||"evenodd")),e.stroke&&(t.globalAlpha=e.opacity,t.stroke()),t.restore()}},_initEvents:function(){this.options.clickable&&(this._map.on("mousemove",this._onMouseMove,this),this._map.on("click dblclick contextmenu",this._fireMouseEvent,this))},_fireMouseEvent:function(t){this._containsPoint(t.layerPoint)&&this.fire(t.type,t)},_onMouseMove:function(t){this._map&&!this._map._animatingZoom&&(this._containsPoint(t.layerPoint)?(this._ctx.canvas.style.cursor="pointer",this._mouseInside=!0,this.fire("mouseover",t)):this._mouseInside&&(this._ctx.canvas.style.cursor="",this._mouseInside=!1,this.fire("mouseout",t)))}}),o.Map.include(o.Path.SVG&&!t.L_PREFER_CANVAS||!o.Browser.canvas?{}:{_initPathRoot:function(){var t,i=this._pathRoot;i||(i=this._pathRoot=e.createElement("canvas"),i.style.position="absolute",t=this._canvasCtx=i.getContext("2d"),t.lineCap="round",t.lineJoin="round",this._panes.overlayPane.appendChild(i),this.options.zoomAnimation&&(this._pathRoot.className="leaflet-zoom-animated",this.on("zoomanim",this._animatePathZoom),this.on("zoomend",this._endPathZoom)),this.on("moveend",this._updateCanvasViewport),this._updateCanvasViewport())},_updateCanvasViewport:function(){if(!this._pathZooming){this._updatePathViewport();var t=this._pathViewport,e=t.min,i=t.max.subtract(e),n=this._pathRoot;o.DomUtil.setPosition(n,e),n.width=i.x,n.height=i.y,n.getContext("2d").translate(-e.x,-e.y)}}}),o.LineUtil={simplify:function(t,e){if(!e||!t.length)return t.slice();var i=e*e;return t=this._reducePoints(t,i),t=this._simplifyDP(t,i)},pointToSegmentDistance:function(t,e,i){return Math.sqrt(this._sqClosestPointOnSegment(t,e,i,!0))},closestPointOnSegment:function(t,e,i){return this._sqClosestPointOnSegment(t,e,i)},_simplifyDP:function(t,e){var n=t.length,o=typeof Uint8Array!=i+""?Uint8Array:Array,s=new o(n);s[0]=s[n-1]=1,this._simplifyDPStep(t,s,e,0,n-1);var a,r=[];for(a=0;n>a;a++)s[a]&&r.push(t[a]);return r},_simplifyDPStep:function(t,e,i,n,o){var s,a,r,h=0;for(a=n+1;o-1>=a;a++)r=this._sqClosestPointOnSegment(t[a],t[n],t[o],!0),r>h&&(s=a,h=r);h>i&&(e[s]=1,this._simplifyDPStep(t,e,i,n,s),this._simplifyDPStep(t,e,i,s,o))},_reducePoints:function(t,e){for(var i=[t[0]],n=1,o=0,s=t.length;s>n;n++)this._sqDist(t[n],t[o])>e&&(i.push(t[n]),o=n);return s-1>o&&i.push(t[s-1]),i},clipSegment:function(t,e,i,n){var o,s,a,r=n?this._lastCode:this._getBitCode(t,i),h=this._getBitCode(e,i);for(this._lastCode=h;;){if(!(r|h))return[t,e];if(r&h)return!1;o=r||h,s=this._getEdgeIntersection(t,e,o,i),a=this._getBitCode(s,i),o===r?(t=s,r=a):(e=s,h=a)}},_getEdgeIntersection:function(t,e,i,n){var s=e.x-t.x,a=e.y-t.y,r=n.min,h=n.max;return 8&i?new o.Point(t.x+s*(h.y-t.y)/a,h.y):4&i?new o.Point(t.x+s*(r.y-t.y)/a,r.y):2&i?new o.Point(h.x,t.y+a*(h.x-t.x)/s):1&i?new o.Point(r.x,t.y+a*(r.x-t.x)/s):void 0},_getBitCode:function(t,e){var i=0;return t.x<e.min.x?i|=1:t.x>e.max.x&&(i|=2),t.y<e.min.y?i|=4:t.y>e.max.y&&(i|=8),i},_sqDist:function(t,e){var i=e.x-t.x,n=e.y-t.y;return i*i+n*n},_sqClosestPointOnSegment:function(t,e,i,n){var s,a=e.x,r=e.y,h=i.x-a,l=i.y-r,u=h*h+l*l;return u>0&&(s=((t.x-a)*h+(t.y-r)*l)/u,s>1?(a=i.x,r=i.y):s>0&&(a+=h*s,r+=l*s)),h=t.x-a,l=t.y-r,n?h*h+l*l:new o.Point(a,r)}},o.Polyline=o.Path.extend({initialize:function(t,e){o.Path.prototype.initialize.call(this,e),this._latlngs=this._convertLatLngs(t)},options:{smoothFactor:1,noClip:!1},projectLatlngs:function(){this._originalPoints=[];for(var t=0,e=this._latlngs.length;e>t;t++)this._originalPoints[t]=this._map.latLngToLayerPoint(this._latlngs[t])},getPathString:function(){for(var t=0,e=this._parts.length,i="";e>t;t++)i+=this._getPathPartStr(this._parts[t]);return i},getLatLngs:function(){return this._latlngs},setLatLngs:function(t){return this._latlngs=this._convertLatLngs(t),this.redraw()},addLatLng:function(t){return this._latlngs.push(o.latLng(t)),this.redraw()},spliceLatLngs:function(){var t=[].splice.apply(this._latlngs,arguments);return this._convertLatLngs(this._latlngs,!0),this.redraw(),t},closestLayerPoint:function(t){for(var e,i,n=1/0,s=this._parts,a=null,r=0,h=s.length;h>r;r++)for(var l=s[r],u=1,c=l.length;c>u;u++){e=l[u-1],i=l[u];var d=o.LineUtil._sqClosestPointOnSegment(t,e,i,!0);n>d&&(n=d,a=o.LineUtil._sqClosestPointOnSegment(t,e,i))}return a&&(a.distance=Math.sqrt(n)),a},getBounds:function(){return new o.LatLngBounds(this.getLatLngs())},_convertLatLngs:function(t,e){var i,n,s=e?t:[];for(i=0,n=t.length;n>i;i++){if(o.Util.isArray(t[i])&&"number"!=typeof t[i][0])return;s[i]=o.latLng(t[i])}return s},_initEvents:function(){o.Path.prototype._initEvents.call(this)},_getPathPartStr:function(t){for(var e,i=o.Path.VML,n=0,s=t.length,a="";s>n;n++)e=t[n],i&&e._round(),a+=(n?"L":"M")+e.x+" "+e.y;return a},_clipPoints:function(){var t,e,i,n=this._originalPoints,s=n.length;if(this.options.noClip)return void(this._parts=[n]);this._parts=[];var a=this._parts,r=this._map._pathViewport,h=o.LineUtil;for(t=0,e=0;s-1>t;t++)i=h.clipSegment(n[t],n[t+1],r,t),i&&(a[e]=a[e]||[],a[e].push(i[0]),(i[1]!==n[t+1]||t===s-2)&&(a[e].push(i[1]),e++))},_simplifyPoints:function(){for(var t=this._parts,e=o.LineUtil,i=0,n=t.length;n>i;i++)t[i]=e.simplify(t[i],this.options.smoothFactor)},_updatePath:function(){this._map&&(this._clipPoints(),this._simplifyPoints(),o.Path.prototype._updatePath.call(this))}}),o.polyline=function(t,e){return new o.Polyline(t,e)},o.PolyUtil={},o.PolyUtil.clipPolygon=function(t,e){var i,n,s,a,r,h,l,u,c,d=[1,4,2,8],p=o.LineUtil;for(n=0,l=t.length;l>n;n++)t[n]._code=p._getBitCode(t[n],e);for(a=0;4>a;a++){for(u=d[a],i=[],n=0,l=t.length,s=l-1;l>n;s=n++)r=t[n],h=t[s],r._code&u?h._code&u||(c=p._getEdgeIntersection(h,r,u,e),c._code=p._getBitCode(c,e),i.push(c)):(h._code&u&&(c=p._getEdgeIntersection(h,r,u,e),c._code=p._getBitCode(c,e),i.push(c)),i.push(r));t=i}return t},o.Polygon=o.Polyline.extend({options:{fill:!0},initialize:function(t,e){o.Polyline.prototype.initialize.call(this,t,e),this._initWithHoles(t)},_initWithHoles:function(t){var e,i,n;if(t&&o.Util.isArray(t[0])&&"number"!=typeof t[0][0])for(this._latlngs=this._convertLatLngs(t[0]),this._holes=t.slice(1),e=0,i=this._holes.length;i>e;e++)n=this._holes[e]=this._convertLatLngs(this._holes[e]),n[0].equals(n[n.length-1])&&n.pop();t=this._latlngs,t.length>=2&&t[0].equals(t[t.length-1])&&t.pop()},projectLatlngs:function(){if(o.Polyline.prototype.projectLatlngs.call(this),this._holePoints=[],this._holes){var t,e,i,n;for(t=0,i=this._holes.length;i>t;t++)for(this._holePoints[t]=[],e=0,n=this._holes[t].length;n>e;e++)this._holePoints[t][e]=this._map.latLngToLayerPoint(this._holes[t][e])}},setLatLngs:function(t){return t&&o.Util.isArray(t[0])&&"number"!=typeof t[0][0]?(this._initWithHoles(t),this.redraw()):o.Polyline.prototype.setLatLngs.call(this,t)},_clipPoints:function(){var t=this._originalPoints,e=[];if(this._parts=[t].concat(this._holePoints),!this.options.noClip){for(var i=0,n=this._parts.length;n>i;i++){var s=o.PolyUtil.clipPolygon(this._parts[i],this._map._pathViewport);s.length&&e.push(s)}this._parts=e}},_getPathPartStr:function(t){var e=o.Polyline.prototype._getPathPartStr.call(this,t);return e+(o.Browser.svg?"z":"x")}}),o.polygon=function(t,e){return new o.Polygon(t,e)},function(){function t(t){return o.FeatureGroup.extend({initialize:function(t,e){this._layers={},this._options=e,this.setLatLngs(t)},setLatLngs:function(e){var i=0,n=e.length;for(this.eachLayer(function(t){n>i?t.setLatLngs(e[i++]):this.removeLayer(t)},this);n>i;)this.addLayer(new t(e[i++],this._options));return this},getLatLngs:function(){var t=[];return this.eachLayer(function(e){t.push(e.getLatLngs())}),t}})}o.MultiPolyline=t(o.Polyline),o.MultiPolygon=t(o.Polygon),o.multiPolyline=function(t,e){return new o.MultiPolyline(t,e)},o.multiPolygon=function(t,e){return new o.MultiPolygon(t,e)}}(),o.Rectangle=o.Polygon.extend({initialize:function(t,e){o.Polygon.prototype.initialize.call(this,this._boundsToLatLngs(t),e)},setBounds:function(t){this.setLatLngs(this._boundsToLatLngs(t))},_boundsToLatLngs:function(t){return t=o.latLngBounds(t),[t.getSouthWest(),t.getNorthWest(),t.getNorthEast(),t.getSouthEast()]}}),o.rectangle=function(t,e){return new o.Rectangle(t,e)},o.Circle=o.Path.extend({initialize:function(t,e,i){o.Path.prototype.initialize.call(this,i),this._latlng=o.latLng(t),this._mRadius=e},options:{fill:!0},setLatLng:function(t){return this._latlng=o.latLng(t),this.redraw()},setRadius:function(t){return this._mRadius=t,this.redraw()},projectLatlngs:function(){var t=this._getLngRadius(),e=this._latlng,i=this._map.latLngToLayerPoint([e.lat,e.lng-t]);this._point=this._map.latLngToLayerPoint(e),this._radius=Math.max(this._point.x-i.x,1)},getBounds:function(){var t=this._getLngRadius(),e=this._mRadius/40075017*360,i=this._latlng;return new o.LatLngBounds([i.lat-e,i.lng-t],[i.lat+e,i.lng+t])},getLatLng:function(){return this._latlng},getPathString:function(){var t=this._point,e=this._radius;return this._checkIfEmpty()?"":o.Browser.svg?"M"+t.x+","+(t.y-e)+"A"+e+","+e+",0,1,1,"+(t.x-.1)+","+(t.y-e)+" z":(t._round(),e=Math.round(e),"AL "+t.x+","+t.y+" "+e+","+e+" 0,23592600")},getRadius:function(){return this._mRadius},_getLatRadius:function(){return this._mRadius/40075017*360},_getLngRadius:function(){return this._getLatRadius()/Math.cos(o.LatLng.DEG_TO_RAD*this._latlng.lat)},_checkIfEmpty:function(){if(!this._map)return!1;var t=this._map._pathViewport,e=this._radius,i=this._point;return i.x-e>t.max.x||i.y-e>t.max.y||i.x+e<t.min.x||i.y+e<t.min.y}}),o.circle=function(t,e,i){return new o.Circle(t,e,i)},o.CircleMarker=o.Circle.extend({options:{radius:10,weight:2},initialize:function(t,e){o.Circle.prototype.initialize.call(this,t,null,e),this._radius=this.options.radius},projectLatlngs:function(){this._point=this._map.latLngToLayerPoint(this._latlng)},_updateStyle:function(){o.Circle.prototype._updateStyle.call(this),this.setRadius(this.options.radius)},setLatLng:function(t){return o.Circle.prototype.setLatLng.call(this,t),this._popup&&this._popup._isOpen&&this._popup.setLatLng(t),this},setRadius:function(t){return this.options.radius=this._radius=t,this.redraw()},getRadius:function(){return this._radius}}),o.circleMarker=function(t,e){return new o.CircleMarker(t,e)},o.Polyline.include(o.Path.CANVAS?{_containsPoint:function(t,e){var i,n,s,a,r,h,l,u=this.options.weight/2;for(o.Browser.touch&&(u+=10),i=0,a=this._parts.length;a>i;i++)for(l=this._parts[i],n=0,r=l.length,s=r-1;r>n;s=n++)if((e||0!==n)&&(h=o.LineUtil.pointToSegmentDistance(t,l[s],l[n]),u>=h))return!0;return!1}}:{}),o.Polygon.include(o.Path.CANVAS?{_containsPoint:function(t){var e,i,n,s,a,r,h,l,u=!1;if(o.Polyline.prototype._containsPoint.call(this,t,!0))return!0;for(s=0,h=this._parts.length;h>s;s++)for(e=this._parts[s],a=0,l=e.length,r=l-1;l>a;r=a++)i=e[a],n=e[r],i.y>t.y!=n.y>t.y&&t.x<(n.x-i.x)*(t.y-i.y)/(n.y-i.y)+i.x&&(u=!u);return u}}:{}),o.Circle.include(o.Path.CANVAS?{_drawPath:function(){var t=this._point;this._ctx.beginPath(),this._ctx.arc(t.x,t.y,this._radius,0,2*Math.PI,!1)},_containsPoint:function(t){var e=this._point,i=this.options.stroke?this.options.weight/2:0;return t.distanceTo(e)<=this._radius+i}}:{}),o.CircleMarker.include(o.Path.CANVAS?{_updateStyle:function(){o.Path.prototype._updateStyle.call(this)}}:{}),o.GeoJSON=o.FeatureGroup.extend({initialize:function(t,e){o.setOptions(this,e),this._layers={},t&&this.addData(t)},addData:function(t){var e,i,n,s=o.Util.isArray(t)?t:t.features;if(s){for(e=0,i=s.length;i>e;e++)n=s[e],(n.geometries||n.geometry||n.features||n.coordinates)&&this.addData(s[e]);return this}var a=this.options;if(!a.filter||a.filter(t)){var r=o.GeoJSON.geometryToLayer(t,a.pointToLayer,a.coordsToLatLng,a);return r.feature=o.GeoJSON.asFeature(t),r.defaultOptions=r.options,this.resetStyle(r),a.onEachFeature&&a.onEachFeature(t,r),this.addLayer(r)}},resetStyle:function(t){var e=this.options.style;e&&(o.Util.extend(t.options,t.defaultOptions),this._setLayerStyle(t,e))},setStyle:function(t){this.eachLayer(function(e){this._setLayerStyle(e,t)},this)},_setLayerStyle:function(t,e){"function"==typeof e&&(e=e(t.feature)),t.setStyle&&t.setStyle(e)}}),o.extend(o.GeoJSON,{geometryToLayer:function(t,e,i,n){var s,a,r,h,l="Feature"===t.type?t.geometry:t,u=l.coordinates,c=[];switch(i=i||this.coordsToLatLng,l.type){case"Point":return s=i(u),e?e(t,s):new o.Marker(s);case"MultiPoint":for(r=0,h=u.length;h>r;r++)s=i(u[r]),c.push(e?e(t,s):new o.Marker(s));return new o.FeatureGroup(c);case"LineString":return a=this.coordsToLatLngs(u,0,i),new o.Polyline(a,n);case"Polygon":if(2===u.length&&!u[1].length)throw new Error("Invalid GeoJSON object.");return a=this.coordsToLatLngs(u,1,i),new o.Polygon(a,n);case"MultiLineString":return a=this.coordsToLatLngs(u,1,i),new o.MultiPolyline(a,n);case"MultiPolygon":return a=this.coordsToLatLngs(u,2,i),new o.MultiPolygon(a,n);case"GeometryCollection":for(r=0,h=l.geometries.length;h>r;r++)c.push(this.geometryToLayer({geometry:l.geometries[r],type:"Feature",properties:t.properties},e,i,n));return new o.FeatureGroup(c);default:throw new Error("Invalid GeoJSON object.")}},coordsToLatLng:function(t){return new o.LatLng(t[1],t[0],t[2])},coordsToLatLngs:function(t,e,i){var n,o,s,a=[];for(o=0,s=t.length;s>o;o++)n=e?this.coordsToLatLngs(t[o],e-1,i):(i||this.coordsToLatLng)(t[o]),a.push(n);return a},latLngToCoords:function(t){var e=[t.lng,t.lat];return t.alt!==i&&e.push(t.alt),e},latLngsToCoords:function(t){for(var e=[],i=0,n=t.length;n>i;i++)e.push(o.GeoJSON.latLngToCoords(t[i]));return e},getFeature:function(t,e){return t.feature?o.extend({},t.feature,{geometry:e}):o.GeoJSON.asFeature(e)},asFeature:function(t){return"Feature"===t.type?t:{type:"Feature",properties:{},geometry:t}}});var a={toGeoJSON:function(){return o.GeoJSON.getFeature(this,{type:"Point",coordinates:o.GeoJSON.latLngToCoords(this.getLatLng())})}};o.Marker.include(a),o.Circle.include(a),o.CircleMarker.include(a),o.Polyline.include({toGeoJSON:function(){return o.GeoJSON.getFeature(this,{type:"LineString",coordinates:o.GeoJSON.latLngsToCoords(this.getLatLngs())})}}),o.Polygon.include({toGeoJSON:function(){var t,e,i,n=[o.GeoJSON.latLngsToCoords(this.getLatLngs())];if(n[0].push(n[0][0]),this._holes)for(t=0,e=this._holes.length;e>t;t++)i=o.GeoJSON.latLngsToCoords(this._holes[t]),i.push(i[0]),n.push(i);return o.GeoJSON.getFeature(this,{type:"Polygon",coordinates:n})}}),function(){function t(t){return function(){var e=[];return this.eachLayer(function(t){e.push(t.toGeoJSON().geometry.coordinates)}),o.GeoJSON.getFeature(this,{type:t,coordinates:e})}}o.MultiPolyline.include({toGeoJSON:t("MultiLineString")}),o.MultiPolygon.include({toGeoJSON:t("MultiPolygon")}),o.LayerGroup.include({toGeoJSON:function(){var e,i=this.feature&&this.feature.geometry,n=[];if(i&&"MultiPoint"===i.type)return t("MultiPoint").call(this);var s=i&&"GeometryCollection"===i.type;return this.eachLayer(function(t){t.toGeoJSON&&(e=t.toGeoJSON(),n.push(s?e.geometry:o.GeoJSON.asFeature(e)))}),s?o.GeoJSON.getFeature(this,{geometries:n,type:"GeometryCollection"}):{type:"FeatureCollection",features:n}}})}(),o.geoJson=function(t,e){return new o.GeoJSON(t,e)},o.DomEvent={addListener:function(t,e,i,n){var s,a,r,h=o.stamp(i),l="_leaflet_"+e+h;return t[l]?this:(s=function(e){return i.call(n||t,e||o.DomEvent._getEvent())},o.Browser.pointer&&0===e.indexOf("touch")?this.addPointerListener(t,e,s,h):(o.Browser.touch&&"dblclick"===e&&this.addDoubleTapListener&&this.addDoubleTapListener(t,s,h),"addEventListener"in t?"mousewheel"===e?(t.addEventListener("DOMMouseScroll",s,!1),t.addEventListener(e,s,!1)):"mouseenter"===e||"mouseleave"===e?(a=s,r="mouseenter"===e?"mouseover":"mouseout",s=function(e){return o.DomEvent._checkMouse(t,e)?a(e):void 0},t.addEventListener(r,s,!1)):"click"===e&&o.Browser.android?(a=s,s=function(t){return o.DomEvent._filterClick(t,a)},t.addEventListener(e,s,!1)):t.addEventListener(e,s,!1):"attachEvent"in t&&t.attachEvent("on"+e,s),t[l]=s,this))},removeListener:function(t,e,i){var n=o.stamp(i),s="_leaflet_"+e+n,a=t[s];return a?(o.Browser.pointer&&0===e.indexOf("touch")?this.removePointerListener(t,e,n):o.Browser.touch&&"dblclick"===e&&this.removeDoubleTapListener?this.removeDoubleTapListener(t,n):"removeEventListener"in t?"mousewheel"===e?(t.removeEventListener("DOMMouseScroll",a,!1),t.removeEventListener(e,a,!1)):"mouseenter"===e||"mouseleave"===e?t.removeEventListener("mouseenter"===e?"mouseover":"mouseout",a,!1):t.removeEventListener(e,a,!1):"detachEvent"in t&&t.detachEvent("on"+e,a),t[s]=null,this):this},stopPropagation:function(t){return t.stopPropagation?t.stopPropagation():t.cancelBubble=!0,o.DomEvent._skipped(t),this},disableScrollPropagation:function(t){var e=o.DomEvent.stopPropagation;return o.DomEvent.on(t,"mousewheel",e).on(t,"MozMousePixelScroll",e)},disableClickPropagation:function(t){for(var e=o.DomEvent.stopPropagation,i=o.Draggable.START.length-1;i>=0;i--)o.DomEvent.on(t,o.Draggable.START[i],e);return o.DomEvent.on(t,"click",o.DomEvent._fakeStop).on(t,"dblclick",e)},preventDefault:function(t){return t.preventDefault?t.preventDefault():t.returnValue=!1,this},stop:function(t){return o.DomEvent.preventDefault(t).stopPropagation(t)},getMousePosition:function(t,e){if(!e)return new o.Point(t.clientX,t.clientY);var i=e.getBoundingClientRect();return new o.Point(t.clientX-i.left-e.clientLeft,t.clientY-i.top-e.clientTop)},getWheelDelta:function(t){var e=0;return t.wheelDelta&&(e=t.wheelDelta/120),t.detail&&(e=-t.detail/3),e},_skipEvents:{},_fakeStop:function(t){o.DomEvent._skipEvents[t.type]=!0},_skipped:function(t){var e=this._skipEvents[t.type];return this._skipEvents[t.type]=!1,e},_checkMouse:function(t,e){var i=e.relatedTarget;if(!i)return!0;try{for(;i&&i!==t;)i=i.parentNode}catch(n){return!1}return i!==t},_getEvent:function(){var e=t.event;if(!e)for(var i=arguments.callee.caller;i&&(e=i.arguments[0],!e||t.Event!==e.constructor);)i=i.caller;return e},_filterClick:function(t,e){var i=t.timeStamp||t.originalEvent.timeStamp,n=o.DomEvent._lastClick&&i-o.DomEvent._lastClick;return n&&n>100&&500>n||t.target._simulatedClick&&!t._simulated?void o.DomEvent.stop(t):(o.DomEvent._lastClick=i,e(t))}},o.DomEvent.on=o.DomEvent.addListener,o.DomEvent.off=o.DomEvent.removeListener,o.Draggable=o.Class.extend({includes:o.Mixin.Events,statics:{START:o.Browser.touch?["touchstart","mousedown"]:["mousedown"],END:{mousedown:"mouseup",touchstart:"touchend",pointerdown:"touchend",MSPointerDown:"touchend"},MOVE:{mousedown:"mousemove",touchstart:"touchmove",pointerdown:"touchmove",MSPointerDown:"touchmove"}},initialize:function(t,e){this._element=t,this._dragStartTarget=e||t},enable:function(){if(!this._enabled){for(var t=o.Draggable.START.length-1;t>=0;t--)o.DomEvent.on(this._dragStartTarget,o.Draggable.START[t],this._onDown,this);this._enabled=!0}},disable:function(){if(this._enabled){for(var t=o.Draggable.START.length-1;t>=0;t--)o.DomEvent.off(this._dragStartTarget,o.Draggable.START[t],this._onDown,this);this._enabled=!1,this._moved=!1}},_onDown:function(t){if(this._moved=!1,!t.shiftKey&&(1===t.which||1===t.button||t.touches)&&(o.DomEvent.stopPropagation(t),!o.Draggable._disabled&&(o.DomUtil.disableImageDrag(),o.DomUtil.disableTextSelection(),!this._moving))){var i=t.touches?t.touches[0]:t;this._startPoint=new o.Point(i.clientX,i.clientY),this._startPos=this._newPos=o.DomUtil.getPosition(this._element),o.DomEvent.on(e,o.Draggable.MOVE[t.type],this._onMove,this).on(e,o.Draggable.END[t.type],this._onUp,this)}},_onMove:function(t){if(t.touches&&t.touches.length>1)return void(this._moved=!0);var i=t.touches&&1===t.touches.length?t.touches[0]:t,n=new o.Point(i.clientX,i.clientY),s=n.subtract(this._startPoint);(s.x||s.y)&&(o.Browser.touch&&Math.abs(s.x)+Math.abs(s.y)<3||(o.DomEvent.preventDefault(t),this._moved||(this.fire("dragstart"),this._moved=!0,this._startPos=o.DomUtil.getPosition(this._element).subtract(s),o.DomUtil.addClass(e.body,"leaflet-dragging"),this._lastTarget=t.target||t.srcElement,o.DomUtil.addClass(this._lastTarget,"leaflet-drag-target")),this._newPos=this._startPos.add(s),this._moving=!0,o.Util.cancelAnimFrame(this._animRequest),this._animRequest=o.Util.requestAnimFrame(this._updatePosition,this,!0,this._dragStartTarget)))},_updatePosition:function(){this.fire("predrag"),o.DomUtil.setPosition(this._element,this._newPos),this.fire("drag")},_onUp:function(){o.DomUtil.removeClass(e.body,"leaflet-dragging"),this._lastTarget&&(o.DomUtil.removeClass(this._lastTarget,"leaflet-drag-target"),this._lastTarget=null);for(var t in o.Draggable.MOVE)o.DomEvent.off(e,o.Draggable.MOVE[t],this._onMove).off(e,o.Draggable.END[t],this._onUp);o.DomUtil.enableImageDrag(),o.DomUtil.enableTextSelection(),this._moved&&this._moving&&(o.Util.cancelAnimFrame(this._animRequest),this.fire("dragend",{distance:this._newPos.distanceTo(this._startPos)})),this._moving=!1}}),o.Handler=o.Class.extend({initialize:function(t){this._map=t},enable:function(){this._enabled||(this._enabled=!0,this.addHooks())},disable:function(){this._enabled&&(this._enabled=!1,this.removeHooks())},enabled:function(){return!!this._enabled}}),o.Map.mergeOptions({dragging:!0,inertia:!o.Browser.android23,inertiaDeceleration:3400,inertiaMaxSpeed:1/0,inertiaThreshold:o.Browser.touch?32:18,easeLinearity:.25,worldCopyJump:!1}),o.Map.Drag=o.Handler.extend({addHooks:function(){if(!this._draggable){var t=this._map;this._draggable=new o.Draggable(t._mapPane,t._container),this._draggable.on({dragstart:this._onDragStart,drag:this._onDrag,dragend:this._onDragEnd},this),t.options.worldCopyJump&&(this._draggable.on("predrag",this._onPreDrag,this),t.on("viewreset",this._onViewReset,this),t.whenReady(this._onViewReset,this))}this._draggable.enable()},removeHooks:function(){this._draggable.disable()},moved:function(){return this._draggable&&this._draggable._moved},_onDragStart:function(){var t=this._map;t._panAnim&&t._panAnim.stop(),t.fire("movestart").fire("dragstart"),t.options.inertia&&(this._positions=[],this._times=[])},_onDrag:function(){if(this._map.options.inertia){var t=this._lastTime=+new Date,e=this._lastPos=this._draggable._newPos;this._positions.push(e),this._times.push(t),t-this._times[0]>200&&(this._positions.shift(),this._times.shift())}this._map.fire("move").fire("drag")},_onViewReset:function(){var t=this._map.getSize()._divideBy(2),e=this._map.latLngToLayerPoint([0,0]);this._initialWorldOffset=e.subtract(t).x,this._worldWidth=this._map.project([0,180]).x},_onPreDrag:function(){var t=this._worldWidth,e=Math.round(t/2),i=this._initialWorldOffset,n=this._draggable._newPos.x,o=(n-e+i)%t+e-i,s=(n+e+i)%t-e-i,a=Math.abs(o+i)<Math.abs(s+i)?o:s;this._draggable._newPos.x=a},_onDragEnd:function(t){var e=this._map,i=e.options,n=+new Date-this._lastTime,s=!i.inertia||n>i.inertiaThreshold||!this._positions[0];if(e.fire("dragend",t),s)e.fire("moveend");else{var a=this._lastPos.subtract(this._positions[0]),r=(this._lastTime+n-this._times[0])/1e3,h=i.easeLinearity,l=a.multiplyBy(h/r),u=l.distanceTo([0,0]),c=Math.min(i.inertiaMaxSpeed,u),d=l.multiplyBy(c/u),p=c/(i.inertiaDeceleration*h),_=d.multiplyBy(-p/2).round();_.x&&_.y?(_=e._limitOffset(_,e.options.maxBounds),o.Util.requestAnimFrame(function(){e.panBy(_,{duration:p,easeLinearity:h,noMoveStart:!0})})):e.fire("moveend")}}}),o.Map.addInitHook("addHandler","dragging",o.Map.Drag),o.Map.mergeOptions({doubleClickZoom:!0}),o.Map.DoubleClickZoom=o.Handler.extend({addHooks:function(){this._map.on("dblclick",this._onDoubleClick,this)},removeHooks:function(){this._map.off("dblclick",this._onDoubleClick,this)},_onDoubleClick:function(t){var e=this._map,i=e.getZoom()+(t.originalEvent.shiftKey?-1:1);"center"===e.options.doubleClickZoom?e.setZoom(i):e.setZoomAround(t.containerPoint,i)}}),o.Map.addInitHook("addHandler","doubleClickZoom",o.Map.DoubleClickZoom),o.Map.mergeOptions({scrollWheelZoom:!0}),o.Map.ScrollWheelZoom=o.Handler.extend({addHooks:function(){o.DomEvent.on(this._map._container,"mousewheel",this._onWheelScroll,this),o.DomEvent.on(this._map._container,"MozMousePixelScroll",o.DomEvent.preventDefault),this._delta=0},removeHooks:function(){o.DomEvent.off(this._map._container,"mousewheel",this._onWheelScroll),o.DomEvent.off(this._map._container,"MozMousePixelScroll",o.DomEvent.preventDefault)},_onWheelScroll:function(t){var e=o.DomEvent.getWheelDelta(t);this._delta+=e,this._lastMousePos=this._map.mouseEventToContainerPoint(t),this._startTime||(this._startTime=+new Date);var i=Math.max(40-(+new Date-this._startTime),0);clearTimeout(this._timer),this._timer=setTimeout(o.bind(this._performZoom,this),i),o.DomEvent.preventDefault(t),o.DomEvent.stopPropagation(t)},_performZoom:function(){var t=this._map,e=this._delta,i=t.getZoom();e=e>0?Math.ceil(e):Math.floor(e),e=Math.max(Math.min(e,4),-4),e=t._limitZoom(i+e)-i,this._delta=0,this._startTime=null,e&&("center"===t.options.scrollWheelZoom?t.setZoom(i+e):t.setZoomAround(this._lastMousePos,i+e))}}),o.Map.addInitHook("addHandler","scrollWheelZoom",o.Map.ScrollWheelZoom),o.extend(o.DomEvent,{_touchstart:o.Browser.msPointer?"MSPointerDown":o.Browser.pointer?"pointerdown":"touchstart",_touchend:o.Browser.msPointer?"MSPointerUp":o.Browser.pointer?"pointerup":"touchend",addDoubleTapListener:function(t,i,n){function s(t){var e;if(o.Browser.pointer?(_.push(t.pointerId),e=_.length):e=t.touches.length,!(e>1)){var i=Date.now(),n=i-(r||i);h=t.touches?t.touches[0]:t,l=n>0&&u>=n,r=i}}function a(t){if(o.Browser.pointer){var e=_.indexOf(t.pointerId);if(-1===e)return;_.splice(e,1)}if(l){if(o.Browser.pointer){var n,s={};for(var a in h)n=h[a],"function"==typeof n?s[a]=n.bind(h):s[a]=n;h=s}h.type="dblclick",i(h),r=null}}var r,h,l=!1,u=250,c="_leaflet_",d=this._touchstart,p=this._touchend,_=[];t[c+d+n]=s,t[c+p+n]=a;var m=o.Browser.pointer?e.documentElement:t;return t.addEventListener(d,s,!1),m.addEventListener(p,a,!1),o.Browser.pointer&&m.addEventListener(o.DomEvent.POINTER_CANCEL,a,!1),this},removeDoubleTapListener:function(t,i){var n="_leaflet_";return t.removeEventListener(this._touchstart,t[n+this._touchstart+i],!1),(o.Browser.pointer?e.documentElement:t).removeEventListener(this._touchend,t[n+this._touchend+i],!1),o.Browser.pointer&&e.documentElement.removeEventListener(o.DomEvent.POINTER_CANCEL,t[n+this._touchend+i],!1),this}}),o.extend(o.DomEvent,{POINTER_DOWN:o.Browser.msPointer?"MSPointerDown":"pointerdown",POINTER_MOVE:o.Browser.msPointer?"MSPointerMove":"pointermove",POINTER_UP:o.Browser.msPointer?"MSPointerUp":"pointerup",POINTER_CANCEL:o.Browser.msPointer?"MSPointerCancel":"pointercancel",_pointers:[],_pointerDocumentListener:!1,addPointerListener:function(t,e,i,n){switch(e){case"touchstart":return this.addPointerListenerStart(t,e,i,n);
+case"touchend":return this.addPointerListenerEnd(t,e,i,n);case"touchmove":return this.addPointerListenerMove(t,e,i,n);default:throw"Unknown touch event type"}},addPointerListenerStart:function(t,i,n,s){var a="_leaflet_",r=this._pointers,h=function(t){"mouse"!==t.pointerType&&t.pointerType!==t.MSPOINTER_TYPE_MOUSE&&o.DomEvent.preventDefault(t);for(var e=!1,i=0;i<r.length;i++)if(r[i].pointerId===t.pointerId){e=!0;break}e||r.push(t),t.touches=r.slice(),t.changedTouches=[t],n(t)};if(t[a+"touchstart"+s]=h,t.addEventListener(this.POINTER_DOWN,h,!1),!this._pointerDocumentListener){var l=function(t){for(var e=0;e<r.length;e++)if(r[e].pointerId===t.pointerId){r.splice(e,1);break}};e.documentElement.addEventListener(this.POINTER_UP,l,!1),e.documentElement.addEventListener(this.POINTER_CANCEL,l,!1),this._pointerDocumentListener=!0}return this},addPointerListenerMove:function(t,e,i,n){function o(t){if(t.pointerType!==t.MSPOINTER_TYPE_MOUSE&&"mouse"!==t.pointerType||0!==t.buttons){for(var e=0;e<a.length;e++)if(a[e].pointerId===t.pointerId){a[e]=t;break}t.touches=a.slice(),t.changedTouches=[t],i(t)}}var s="_leaflet_",a=this._pointers;return t[s+"touchmove"+n]=o,t.addEventListener(this.POINTER_MOVE,o,!1),this},addPointerListenerEnd:function(t,e,i,n){var o="_leaflet_",s=this._pointers,a=function(t){for(var e=0;e<s.length;e++)if(s[e].pointerId===t.pointerId){s.splice(e,1);break}t.touches=s.slice(),t.changedTouches=[t],i(t)};return t[o+"touchend"+n]=a,t.addEventListener(this.POINTER_UP,a,!1),t.addEventListener(this.POINTER_CANCEL,a,!1),this},removePointerListener:function(t,e,i){var n="_leaflet_",o=t[n+e+i];switch(e){case"touchstart":t.removeEventListener(this.POINTER_DOWN,o,!1);break;case"touchmove":t.removeEventListener(this.POINTER_MOVE,o,!1);break;case"touchend":t.removeEventListener(this.POINTER_UP,o,!1),t.removeEventListener(this.POINTER_CANCEL,o,!1)}return this}}),o.Map.mergeOptions({touchZoom:o.Browser.touch&&!o.Browser.android23,bounceAtZoomLimits:!0}),o.Map.TouchZoom=o.Handler.extend({addHooks:function(){o.DomEvent.on(this._map._container,"touchstart",this._onTouchStart,this)},removeHooks:function(){o.DomEvent.off(this._map._container,"touchstart",this._onTouchStart,this)},_onTouchStart:function(t){var i=this._map;if(t.touches&&2===t.touches.length&&!i._animatingZoom&&!this._zooming){var n=i.mouseEventToLayerPoint(t.touches[0]),s=i.mouseEventToLayerPoint(t.touches[1]),a=i._getCenterLayerPoint();this._startCenter=n.add(s)._divideBy(2),this._startDist=n.distanceTo(s),this._moved=!1,this._zooming=!0,this._centerOffset=a.subtract(this._startCenter),i._panAnim&&i._panAnim.stop(),o.DomEvent.on(e,"touchmove",this._onTouchMove,this).on(e,"touchend",this._onTouchEnd,this),o.DomEvent.preventDefault(t)}},_onTouchMove:function(t){var e=this._map;if(t.touches&&2===t.touches.length&&this._zooming){var i=e.mouseEventToLayerPoint(t.touches[0]),n=e.mouseEventToLayerPoint(t.touches[1]);this._scale=i.distanceTo(n)/this._startDist,this._delta=i._add(n)._divideBy(2)._subtract(this._startCenter),1!==this._scale&&(e.options.bounceAtZoomLimits||!(e.getZoom()===e.getMinZoom()&&this._scale<1||e.getZoom()===e.getMaxZoom()&&this._scale>1))&&(this._moved||(o.DomUtil.addClass(e._mapPane,"leaflet-touching"),e.fire("movestart").fire("zoomstart"),this._moved=!0),o.Util.cancelAnimFrame(this._animRequest),this._animRequest=o.Util.requestAnimFrame(this._updateOnMove,this,!0,this._map._container),o.DomEvent.preventDefault(t))}},_updateOnMove:function(){var t=this._map,e=this._getScaleOrigin(),i=t.layerPointToLatLng(e),n=t.getScaleZoom(this._scale);t._animateZoom(i,n,this._startCenter,this._scale,this._delta,!1,!0)},_onTouchEnd:function(){if(!this._moved||!this._zooming)return void(this._zooming=!1);var t=this._map;this._zooming=!1,o.DomUtil.removeClass(t._mapPane,"leaflet-touching"),o.Util.cancelAnimFrame(this._animRequest),o.DomEvent.off(e,"touchmove",this._onTouchMove).off(e,"touchend",this._onTouchEnd);var i=this._getScaleOrigin(),n=t.layerPointToLatLng(i),s=t.getZoom(),a=t.getScaleZoom(this._scale)-s,r=a>0?Math.ceil(a):Math.floor(a),h=t._limitZoom(s+r),l=t.getZoomScale(h)/this._scale;t._animateZoom(n,h,i,l)},_getScaleOrigin:function(){var t=this._centerOffset.subtract(this._delta).divideBy(this._scale);return this._startCenter.add(t)}}),o.Map.addInitHook("addHandler","touchZoom",o.Map.TouchZoom),o.Map.mergeOptions({tap:!0,tapTolerance:15}),o.Map.Tap=o.Handler.extend({addHooks:function(){o.DomEvent.on(this._map._container,"touchstart",this._onDown,this)},removeHooks:function(){o.DomEvent.off(this._map._container,"touchstart",this._onDown,this)},_onDown:function(t){if(t.touches){if(o.DomEvent.preventDefault(t),this._fireClick=!0,t.touches.length>1)return this._fireClick=!1,void clearTimeout(this._holdTimeout);var i=t.touches[0],n=i.target;this._startPos=this._newPos=new o.Point(i.clientX,i.clientY),n.tagName&&"a"===n.tagName.toLowerCase()&&o.DomUtil.addClass(n,"leaflet-active"),this._holdTimeout=setTimeout(o.bind(function(){this._isTapValid()&&(this._fireClick=!1,this._onUp(),this._simulateEvent("contextmenu",i))},this),1e3),o.DomEvent.on(e,"touchmove",this._onMove,this).on(e,"touchend",this._onUp,this)}},_onUp:function(t){if(clearTimeout(this._holdTimeout),o.DomEvent.off(e,"touchmove",this._onMove,this).off(e,"touchend",this._onUp,this),this._fireClick&&t&&t.changedTouches){var i=t.changedTouches[0],n=i.target;n&&n.tagName&&"a"===n.tagName.toLowerCase()&&o.DomUtil.removeClass(n,"leaflet-active"),this._isTapValid()&&this._simulateEvent("click",i)}},_isTapValid:function(){return this._newPos.distanceTo(this._startPos)<=this._map.options.tapTolerance},_onMove:function(t){var e=t.touches[0];this._newPos=new o.Point(e.clientX,e.clientY)},_simulateEvent:function(i,n){var o=e.createEvent("MouseEvents");o._simulated=!0,n.target._simulatedClick=!0,o.initMouseEvent(i,!0,!0,t,1,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null),n.target.dispatchEvent(o)}}),o.Browser.touch&&!o.Browser.pointer&&o.Map.addInitHook("addHandler","tap",o.Map.Tap),o.Map.mergeOptions({boxZoom:!0}),o.Map.BoxZoom=o.Handler.extend({initialize:function(t){this._map=t,this._container=t._container,this._pane=t._panes.overlayPane,this._moved=!1},addHooks:function(){o.DomEvent.on(this._container,"mousedown",this._onMouseDown,this)},removeHooks:function(){o.DomEvent.off(this._container,"mousedown",this._onMouseDown),this._moved=!1},moved:function(){return this._moved},_onMouseDown:function(t){return this._moved=!1,!t.shiftKey||1!==t.which&&1!==t.button?!1:(o.DomUtil.disableTextSelection(),o.DomUtil.disableImageDrag(),this._startLayerPoint=this._map.mouseEventToLayerPoint(t),void o.DomEvent.on(e,"mousemove",this._onMouseMove,this).on(e,"mouseup",this._onMouseUp,this).on(e,"keydown",this._onKeyDown,this))},_onMouseMove:function(t){this._moved||(this._box=o.DomUtil.create("div","leaflet-zoom-box",this._pane),o.DomUtil.setPosition(this._box,this._startLayerPoint),this._container.style.cursor="crosshair",this._map.fire("boxzoomstart"));var e=this._startLayerPoint,i=this._box,n=this._map.mouseEventToLayerPoint(t),s=n.subtract(e),a=new o.Point(Math.min(n.x,e.x),Math.min(n.y,e.y));o.DomUtil.setPosition(i,a),this._moved=!0,i.style.width=Math.max(0,Math.abs(s.x)-4)+"px",i.style.height=Math.max(0,Math.abs(s.y)-4)+"px"},_finish:function(){this._moved&&(this._pane.removeChild(this._box),this._container.style.cursor=""),o.DomUtil.enableTextSelection(),o.DomUtil.enableImageDrag(),o.DomEvent.off(e,"mousemove",this._onMouseMove).off(e,"mouseup",this._onMouseUp).off(e,"keydown",this._onKeyDown)},_onMouseUp:function(t){this._finish();var e=this._map,i=e.mouseEventToLayerPoint(t);if(!this._startLayerPoint.equals(i)){var n=new o.LatLngBounds(e.layerPointToLatLng(this._startLayerPoint),e.layerPointToLatLng(i));e.fitBounds(n),e.fire("boxzoomend",{boxZoomBounds:n})}},_onKeyDown:function(t){27===t.keyCode&&this._finish()}}),o.Map.addInitHook("addHandler","boxZoom",o.Map.BoxZoom),o.Map.mergeOptions({keyboard:!0,keyboardPanOffset:80,keyboardZoomOffset:1}),o.Map.Keyboard=o.Handler.extend({keyCodes:{left:[37],right:[39],down:[40],up:[38],zoomIn:[187,107,61,171],zoomOut:[189,109,173]},initialize:function(t){this._map=t,this._setPanOffset(t.options.keyboardPanOffset),this._setZoomOffset(t.options.keyboardZoomOffset)},addHooks:function(){var t=this._map._container;-1===t.tabIndex&&(t.tabIndex="0"),o.DomEvent.on(t,"focus",this._onFocus,this).on(t,"blur",this._onBlur,this).on(t,"mousedown",this._onMouseDown,this),this._map.on("focus",this._addHooks,this).on("blur",this._removeHooks,this)},removeHooks:function(){this._removeHooks();var t=this._map._container;o.DomEvent.off(t,"focus",this._onFocus,this).off(t,"blur",this._onBlur,this).off(t,"mousedown",this._onMouseDown,this),this._map.off("focus",this._addHooks,this).off("blur",this._removeHooks,this)},_onMouseDown:function(){if(!this._focused){var i=e.body,n=e.documentElement,o=i.scrollTop||n.scrollTop,s=i.scrollLeft||n.scrollLeft;this._map._container.focus(),t.scrollTo(s,o)}},_onFocus:function(){this._focused=!0,this._map.fire("focus")},_onBlur:function(){this._focused=!1,this._map.fire("blur")},_setPanOffset:function(t){var e,i,n=this._panKeys={},o=this.keyCodes;for(e=0,i=o.left.length;i>e;e++)n[o.left[e]]=[-1*t,0];for(e=0,i=o.right.length;i>e;e++)n[o.right[e]]=[t,0];for(e=0,i=o.down.length;i>e;e++)n[o.down[e]]=[0,t];for(e=0,i=o.up.length;i>e;e++)n[o.up[e]]=[0,-1*t]},_setZoomOffset:function(t){var e,i,n=this._zoomKeys={},o=this.keyCodes;for(e=0,i=o.zoomIn.length;i>e;e++)n[o.zoomIn[e]]=t;for(e=0,i=o.zoomOut.length;i>e;e++)n[o.zoomOut[e]]=-t},_addHooks:function(){o.DomEvent.on(e,"keydown",this._onKeyDown,this)},_removeHooks:function(){o.DomEvent.off(e,"keydown",this._onKeyDown,this)},_onKeyDown:function(t){var e=t.keyCode,i=this._map;if(e in this._panKeys){if(i._panAnim&&i._panAnim._inProgress)return;i.panBy(this._panKeys[e]),i.options.maxBounds&&i.panInsideBounds(i.options.maxBounds)}else{if(!(e in this._zoomKeys))return;i.setZoom(i.getZoom()+this._zoomKeys[e])}o.DomEvent.stop(t)}}),o.Map.addInitHook("addHandler","keyboard",o.Map.Keyboard),o.Handler.MarkerDrag=o.Handler.extend({initialize:function(t){this._marker=t},addHooks:function(){var t=this._marker._icon;this._draggable||(this._draggable=new o.Draggable(t,t)),this._draggable.on("dragstart",this._onDragStart,this).on("drag",this._onDrag,this).on("dragend",this._onDragEnd,this),this._draggable.enable(),o.DomUtil.addClass(this._marker._icon,"leaflet-marker-draggable")},removeHooks:function(){this._draggable.off("dragstart",this._onDragStart,this).off("drag",this._onDrag,this).off("dragend",this._onDragEnd,this),this._draggable.disable(),o.DomUtil.removeClass(this._marker._icon,"leaflet-marker-draggable")},moved:function(){return this._draggable&&this._draggable._moved},_onDragStart:function(){this._marker.closePopup().fire("movestart").fire("dragstart")},_onDrag:function(){var t=this._marker,e=t._shadow,i=o.DomUtil.getPosition(t._icon),n=t._map.layerPointToLatLng(i);e&&o.DomUtil.setPosition(e,i),t._latlng=n,t.fire("move",{latlng:n}).fire("drag")},_onDragEnd:function(t){this._marker.fire("moveend").fire("dragend",t)}}),o.Control=o.Class.extend({options:{position:"topright"},initialize:function(t){o.setOptions(this,t)},getPosition:function(){return this.options.position},setPosition:function(t){var e=this._map;return e&&e.removeControl(this),this.options.position=t,e&&e.addControl(this),this},getContainer:function(){return this._container},addTo:function(t){this._map=t;var e=this._container=this.onAdd(t),i=this.getPosition(),n=t._controlCorners[i];return o.DomUtil.addClass(e,"leaflet-control"),-1!==i.indexOf("bottom")?n.insertBefore(e,n.firstChild):n.appendChild(e),this},removeFrom:function(t){var e=this.getPosition(),i=t._controlCorners[e];return i.removeChild(this._container),this._map=null,this.onRemove&&this.onRemove(t),this},_refocusOnMap:function(){this._map&&this._map.getContainer().focus()}}),o.control=function(t){return new o.Control(t)},o.Map.include({addControl:function(t){return t.addTo(this),this},removeControl:function(t){return t.removeFrom(this),this},_initControlPos:function(){function t(t,s){var a=i+t+" "+i+s;e[t+s]=o.DomUtil.create("div",a,n)}var e=this._controlCorners={},i="leaflet-",n=this._controlContainer=o.DomUtil.create("div",i+"control-container",this._container);t("top","left"),t("top","right"),t("bottom","left"),t("bottom","right")},_clearControlPos:function(){this._container.removeChild(this._controlContainer)}}),o.Control.Zoom=o.Control.extend({options:{position:"topleft",zoomInText:"+",zoomInTitle:"Zoom in",zoomOutText:"-",zoomOutTitle:"Zoom out"},onAdd:function(t){var e="leaflet-control-zoom",i=o.DomUtil.create("div",e+" leaflet-bar");return this._map=t,this._zoomInButton=this._createButton(this.options.zoomInText,this.options.zoomInTitle,e+"-in",i,this._zoomIn,this),this._zoomOutButton=this._createButton(this.options.zoomOutText,this.options.zoomOutTitle,e+"-out",i,this._zoomOut,this),this._updateDisabled(),t.on("zoomend zoomlevelschange",this._updateDisabled,this),i},onRemove:function(t){t.off("zoomend zoomlevelschange",this._updateDisabled,this)},_zoomIn:function(t){this._map.zoomIn(t.shiftKey?3:1)},_zoomOut:function(t){this._map.zoomOut(t.shiftKey?3:1)},_createButton:function(t,e,i,n,s,a){var r=o.DomUtil.create("a",i,n);r.innerHTML=t,r.href="#",r.title=e;var h=o.DomEvent.stopPropagation;return o.DomEvent.on(r,"click",h).on(r,"mousedown",h).on(r,"dblclick",h).on(r,"click",o.DomEvent.preventDefault).on(r,"click",s,a).on(r,"click",this._refocusOnMap,a),r},_updateDisabled:function(){var t=this._map,e="leaflet-disabled";o.DomUtil.removeClass(this._zoomInButton,e),o.DomUtil.removeClass(this._zoomOutButton,e),t._zoom===t.getMinZoom()&&o.DomUtil.addClass(this._zoomOutButton,e),t._zoom===t.getMaxZoom()&&o.DomUtil.addClass(this._zoomInButton,e)}}),o.Map.mergeOptions({zoomControl:!0}),o.Map.addInitHook(function(){this.options.zoomControl&&(this.zoomControl=new o.Control.Zoom,this.addControl(this.zoomControl))}),o.control.zoom=function(t){return new o.Control.Zoom(t)},o.Control.Attribution=o.Control.extend({options:{position:"bottomright",prefix:'<a href="http://leafletjs.com" title="A JS library for interactive maps">Leaflet</a>'},initialize:function(t){o.setOptions(this,t),this._attributions={}},onAdd:function(t){this._container=o.DomUtil.create("div","leaflet-control-attribution"),o.DomEvent.disableClickPropagation(this._container);for(var e in t._layers)t._layers[e].getAttribution&&this.addAttribution(t._layers[e].getAttribution());return t.on("layeradd",this._onLayerAdd,this).on("layerremove",this._onLayerRemove,this),this._update(),this._container},onRemove:function(t){t.off("layeradd",this._onLayerAdd).off("layerremove",this._onLayerRemove)},setPrefix:function(t){return this.options.prefix=t,this._update(),this},addAttribution:function(t){return t?(this._attributions[t]||(this._attributions[t]=0),this._attributions[t]++,this._update(),this):void 0},removeAttribution:function(t){return t?(this._attributions[t]&&(this._attributions[t]--,this._update()),this):void 0},_update:function(){if(this._map){var t=[];for(var e in this._attributions)this._attributions[e]&&t.push(e);var i=[];this.options.prefix&&i.push(this.options.prefix),t.length&&i.push(t.join(", ")),this._container.innerHTML=i.join(" | ")}},_onLayerAdd:function(t){t.layer.getAttribution&&this.addAttribution(t.layer.getAttribution())},_onLayerRemove:function(t){t.layer.getAttribution&&this.removeAttribution(t.layer.getAttribution())}}),o.Map.mergeOptions({attributionControl:!0}),o.Map.addInitHook(function(){this.options.attributionControl&&(this.attributionControl=(new o.Control.Attribution).addTo(this))}),o.control.attribution=function(t){return new o.Control.Attribution(t)},o.Control.Scale=o.Control.extend({options:{position:"bottomleft",maxWidth:100,metric:!0,imperial:!0,updateWhenIdle:!1},onAdd:function(t){this._map=t;var e="leaflet-control-scale",i=o.DomUtil.create("div",e),n=this.options;return this._addScales(n,e,i),t.on(n.updateWhenIdle?"moveend":"move",this._update,this),t.whenReady(this._update,this),i},onRemove:function(t){t.off(this.options.updateWhenIdle?"moveend":"move",this._update,this)},_addScales:function(t,e,i){t.metric&&(this._mScale=o.DomUtil.create("div",e+"-line",i)),t.imperial&&(this._iScale=o.DomUtil.create("div",e+"-line",i))},_update:function(){var t=this._map.getBounds(),e=t.getCenter().lat,i=6378137*Math.PI*Math.cos(e*Math.PI/180),n=i*(t.getNorthEast().lng-t.getSouthWest().lng)/180,o=this._map.getSize(),s=this.options,a=0;o.x>0&&(a=n*(s.maxWidth/o.x)),this._updateScales(s,a)},_updateScales:function(t,e){t.metric&&e&&this._updateMetric(e),t.imperial&&e&&this._updateImperial(e)},_updateMetric:function(t){var e=this._getRoundNum(t);this._mScale.style.width=this._getScaleWidth(e/t)+"px",this._mScale.innerHTML=1e3>e?e+" m":e/1e3+" km"},_updateImperial:function(t){var e,i,n,o=3.2808399*t,s=this._iScale;o>5280?(e=o/5280,i=this._getRoundNum(e),s.style.width=this._getScaleWidth(i/e)+"px",s.innerHTML=i+" mi"):(n=this._getRoundNum(o),s.style.width=this._getScaleWidth(n/o)+"px",s.innerHTML=n+" ft")},_getScaleWidth:function(t){return Math.round(this.options.maxWidth*t)-10},_getRoundNum:function(t){var e=Math.pow(10,(Math.floor(t)+"").length-1),i=t/e;return i=i>=10?10:i>=5?5:i>=3?3:i>=2?2:1,e*i}}),o.control.scale=function(t){return new o.Control.Scale(t)},o.Control.Layers=o.Control.extend({options:{collapsed:!0,position:"topright",autoZIndex:!0},initialize:function(t,e,i){o.setOptions(this,i),this._layers={},this._lastZIndex=0,this._handlingClick=!1;for(var n in t)this._addLayer(t[n],n);for(n in e)this._addLayer(e[n],n,!0)},onAdd:function(t){return this._initLayout(),this._update(),t.on("layeradd",this._onLayerChange,this).on("layerremove",this._onLayerChange,this),this._container},onRemove:function(t){t.off("layeradd",this._onLayerChange,this).off("layerremove",this._onLayerChange,this)},addBaseLayer:function(t,e){return this._addLayer(t,e),this._update(),this},addOverlay:function(t,e){return this._addLayer(t,e,!0),this._update(),this},removeLayer:function(t){var e=o.stamp(t);return delete this._layers[e],this._update(),this},_initLayout:function(){var t="leaflet-control-layers",e=this._container=o.DomUtil.create("div",t);e.setAttribute("aria-haspopup",!0),o.Browser.touch?o.DomEvent.on(e,"click",o.DomEvent.stopPropagation):o.DomEvent.disableClickPropagation(e).disableScrollPropagation(e);var i=this._form=o.DomUtil.create("form",t+"-list");if(this.options.collapsed){o.Browser.android||o.DomEvent.on(e,"mouseover",this._expand,this).on(e,"mouseout",this._collapse,this);var n=this._layersLink=o.DomUtil.create("a",t+"-toggle",e);n.href="#",n.title="Layers",o.Browser.touch?o.DomEvent.on(n,"click",o.DomEvent.stop).on(n,"click",this._expand,this):o.DomEvent.on(n,"focus",this._expand,this),o.DomEvent.on(i,"click",function(){setTimeout(o.bind(this._onInputClick,this),0)},this),this._map.on("click",this._collapse,this)}else this._expand();this._baseLayersList=o.DomUtil.create("div",t+"-base",i),this._separator=o.DomUtil.create("div",t+"-separator",i),this._overlaysList=o.DomUtil.create("div",t+"-overlays",i),e.appendChild(i)},_addLayer:function(t,e,i){var n=o.stamp(t);this._layers[n]={layer:t,name:e,overlay:i},this.options.autoZIndex&&t.setZIndex&&(this._lastZIndex++,t.setZIndex(this._lastZIndex))},_update:function(){if(this._container){this._baseLayersList.innerHTML="",this._overlaysList.innerHTML="";var t,e,i=!1,n=!1;for(t in this._layers)e=this._layers[t],this._addItem(e),n=n||e.overlay,i=i||!e.overlay;this._separator.style.display=n&&i?"":"none"}},_onLayerChange:function(t){var e=this._layers[o.stamp(t.layer)];if(e){this._handlingClick||this._update();var i=e.overlay?"layeradd"===t.type?"overlayadd":"overlayremove":"layeradd"===t.type?"baselayerchange":null;i&&this._map.fire(i,e)}},_createRadioElement:function(t,i){var n='<input type="radio" class="leaflet-control-layers-selector" name="'+t+'"';i&&(n+=' checked="checked"'),n+="/>";var o=e.createElement("div");return o.innerHTML=n,o.firstChild},_addItem:function(t){var i,n=e.createElement("label"),s=this._map.hasLayer(t.layer);t.overlay?(i=e.createElement("input"),i.type="checkbox",i.className="leaflet-control-layers-selector",i.defaultChecked=s):i=this._createRadioElement("leaflet-base-layers",s),i.layerId=o.stamp(t.layer),o.DomEvent.on(i,"click",this._onInputClick,this);var a=e.createElement("span");a.innerHTML=" "+t.name,n.appendChild(i),n.appendChild(a);var r=t.overlay?this._overlaysList:this._baseLayersList;return r.appendChild(n),n},_onInputClick:function(){var t,e,i,n=this._form.getElementsByTagName("input"),o=n.length;for(this._handlingClick=!0,t=0;o>t;t++)e=n[t],i=this._layers[e.layerId],e.checked&&!this._map.hasLayer(i.layer)?this._map.addLayer(i.layer):!e.checked&&this._map.hasLayer(i.layer)&&this._map.removeLayer(i.layer);this._handlingClick=!1,this._refocusOnMap()},_expand:function(){o.DomUtil.addClass(this._container,"leaflet-control-layers-expanded")},_collapse:function(){this._container.className=this._container.className.replace(" leaflet-control-layers-expanded","")}}),o.control.layers=function(t,e,i){return new o.Control.Layers(t,e,i)},o.PosAnimation=o.Class.extend({includes:o.Mixin.Events,run:function(t,e,i,n){this.stop(),this._el=t,this._inProgress=!0,this._newPos=e,this.fire("start"),t.style[o.DomUtil.TRANSITION]="all "+(i||.25)+"s cubic-bezier(0,0,"+(n||.5)+",1)",o.DomEvent.on(t,o.DomUtil.TRANSITION_END,this._onTransitionEnd,this),o.DomUtil.setPosition(t,e),o.Util.falseFn(t.offsetWidth),this._stepTimer=setInterval(o.bind(this._onStep,this),50)},stop:function(){this._inProgress&&(o.DomUtil.setPosition(this._el,this._getPos()),this._onTransitionEnd(),o.Util.falseFn(this._el.offsetWidth))},_onStep:function(){var t=this._getPos();return t?(this._el._leaflet_pos=t,void this.fire("step")):void this._onTransitionEnd()},_transformRe:/([-+]?(?:\d*\.)?\d+)\D*, ([-+]?(?:\d*\.)?\d+)\D*\)/,_getPos:function(){var e,i,n,s=this._el,a=t.getComputedStyle(s);if(o.Browser.any3d){if(n=a[o.DomUtil.TRANSFORM].match(this._transformRe),!n)return;e=parseFloat(n[1]),i=parseFloat(n[2])}else e=parseFloat(a.left),i=parseFloat(a.top);return new o.Point(e,i,!0)},_onTransitionEnd:function(){o.DomEvent.off(this._el,o.DomUtil.TRANSITION_END,this._onTransitionEnd,this),this._inProgress&&(this._inProgress=!1,this._el.style[o.DomUtil.TRANSITION]="",this._el._leaflet_pos=this._newPos,clearInterval(this._stepTimer),this.fire("step").fire("end"))}}),o.Map.include({setView:function(t,e,n){if(e=e===i?this._zoom:this._limitZoom(e),t=this._limitCenter(o.latLng(t),e,this.options.maxBounds),n=n||{},this._panAnim&&this._panAnim.stop(),this._loaded&&!n.reset&&n!==!0){n.animate!==i&&(n.zoom=o.extend({animate:n.animate},n.zoom),n.pan=o.extend({animate:n.animate},n.pan));var s=this._zoom!==e?this._tryAnimatedZoom&&this._tryAnimatedZoom(t,e,n.zoom):this._tryAnimatedPan(t,n.pan);if(s)return clearTimeout(this._sizeTimer),this}return this._resetView(t,e),this},panBy:function(t,e){if(t=o.point(t).round(),e=e||{},!t.x&&!t.y)return this;if(this._panAnim||(this._panAnim=new o.PosAnimation,this._panAnim.on({step:this._onPanTransitionStep,end:this._onPanTransitionEnd},this)),e.noMoveStart||this.fire("movestart"),e.animate!==!1){o.DomUtil.addClass(this._mapPane,"leaflet-pan-anim");var i=this._getMapPanePos().subtract(t);this._panAnim.run(this._mapPane,i,e.duration||.25,e.easeLinearity)}else this._rawPanBy(t),this.fire("move").fire("moveend");return this},_onPanTransitionStep:function(){this.fire("move")},_onPanTransitionEnd:function(){o.DomUtil.removeClass(this._mapPane,"leaflet-pan-anim"),this.fire("moveend")},_tryAnimatedPan:function(t,e){var i=this._getCenterOffset(t)._floor();return(e&&e.animate)===!0||this.getSize().contains(i)?(this.panBy(i,e),!0):!1}}),o.PosAnimation=o.DomUtil.TRANSITION?o.PosAnimation:o.PosAnimation.extend({run:function(t,e,i,n){this.stop(),this._el=t,this._inProgress=!0,this._duration=i||.25,this._easeOutPower=1/Math.max(n||.5,.2),this._startPos=o.DomUtil.getPosition(t),this._offset=e.subtract(this._startPos),this._startTime=+new Date,this.fire("start"),this._animate()},stop:function(){this._inProgress&&(this._step(),this._complete())},_animate:function(){this._animId=o.Util.requestAnimFrame(this._animate,this),this._step()},_step:function(){var t=+new Date-this._startTime,e=1e3*this._duration;e>t?this._runFrame(this._easeOut(t/e)):(this._runFrame(1),this._complete())},_runFrame:function(t){var e=this._startPos.add(this._offset.multiplyBy(t));o.DomUtil.setPosition(this._el,e),this.fire("step")},_complete:function(){o.Util.cancelAnimFrame(this._animId),this._inProgress=!1,this.fire("end")},_easeOut:function(t){return 1-Math.pow(1-t,this._easeOutPower)}}),o.Map.mergeOptions({zoomAnimation:!0,zoomAnimationThreshold:4}),o.DomUtil.TRANSITION&&o.Map.addInitHook(function(){this._zoomAnimated=this.options.zoomAnimation&&o.DomUtil.TRANSITION&&o.Browser.any3d&&!o.Browser.android23&&!o.Browser.mobileOpera,this._zoomAnimated&&o.DomEvent.on(this._mapPane,o.DomUtil.TRANSITION_END,this._catchTransitionEnd,this)}),o.Map.include(o.DomUtil.TRANSITION?{_catchTransitionEnd:function(t){this._animatingZoom&&t.propertyName.indexOf("transform")>=0&&this._onZoomTransitionEnd()},_nothingToAnimate:function(){return!this._container.getElementsByClassName("leaflet-zoom-animated").length},_tryAnimatedZoom:function(t,e,i){if(this._animatingZoom)return!0;if(i=i||{},!this._zoomAnimated||i.animate===!1||this._nothingToAnimate()||Math.abs(e-this._zoom)>this.options.zoomAnimationThreshold)return!1;var n=this.getZoomScale(e),o=this._getCenterOffset(t)._divideBy(1-1/n),s=this._getCenterLayerPoint()._add(o);return i.animate===!0||this.getSize().contains(o)?(this.fire("movestart").fire("zoomstart"),this._animateZoom(t,e,s,n,null,!0),!0):!1},_animateZoom:function(t,e,i,n,s,a,r){r||(this._animatingZoom=!0),o.DomUtil.addClass(this._mapPane,"leaflet-zoom-anim"),this._animateToCenter=t,this._animateToZoom=e,o.Draggable&&(o.Draggable._disabled=!0),o.Util.requestAnimFrame(function(){this.fire("zoomanim",{center:t,zoom:e,origin:i,scale:n,delta:s,backwards:a}),setTimeout(o.bind(this._onZoomTransitionEnd,this),250)},this)},_onZoomTransitionEnd:function(){this._animatingZoom&&(this._animatingZoom=!1,o.DomUtil.removeClass(this._mapPane,"leaflet-zoom-anim"),o.Util.requestAnimFrame(function(){this._resetView(this._animateToCenter,this._animateToZoom,!0,!0),o.Draggable&&(o.Draggable._disabled=!1)},this))}}:{}),o.TileLayer.include({_animateZoom:function(t){this._animating||(this._animating=!0,this._prepareBgBuffer());var e=this._bgBuffer,i=o.DomUtil.TRANSFORM,n=t.delta?o.DomUtil.getTranslateString(t.delta):e.style[i],s=o.DomUtil.getScaleString(t.scale,t.origin);e.style[i]=t.backwards?s+" "+n:n+" "+s},_endZoomAnim:function(){var t=this._tileContainer,e=this._bgBuffer;t.style.visibility="",t.parentNode.appendChild(t),o.Util.falseFn(e.offsetWidth);var i=this._map.getZoom();(i>this.options.maxZoom||i<this.options.minZoom)&&this._clearBgBuffer(),this._animating=!1},_clearBgBuffer:function(){var t=this._map;!t||t._animatingZoom||t.touchZoom._zooming||(this._bgBuffer.innerHTML="",this._bgBuffer.style[o.DomUtil.TRANSFORM]="")},_prepareBgBuffer:function(){var t=this._tileContainer,e=this._bgBuffer,i=this._getLoadedTilesPercentage(e),n=this._getLoadedTilesPercentage(t);return e&&i>.5&&.5>n?(t.style.visibility="hidden",void this._stopLoadingImages(t)):(e.style.visibility="hidden",e.style[o.DomUtil.TRANSFORM]="",this._tileContainer=e,e=this._bgBuffer=t,this._stopLoadingImages(e),void clearTimeout(this._clearBgBufferTimer))},_getLoadedTilesPercentage:function(t){var e,i,n=t.getElementsByTagName("img"),o=0;for(e=0,i=n.length;i>e;e++)n[e].complete&&o++;return o/i},_stopLoadingImages:function(t){var e,i,n,s=Array.prototype.slice.call(t.getElementsByTagName("img"));for(e=0,i=s.length;i>e;e++)n=s[e],n.complete||(n.onload=o.Util.falseFn,n.onerror=o.Util.falseFn,n.src=o.Util.emptyImageUrl,n.parentNode.removeChild(n))}}),o.Map.include({_defaultLocateOptions:{watch:!1,setView:!1,maxZoom:1/0,timeout:1e4,maximumAge:0,enableHighAccuracy:!1},locate:function(t){if(t=this._locateOptions=o.extend(this._defaultLocateOptions,t),!navigator.geolocation)return this._handleGeolocationError({code:0,message:"Geolocation not supported."}),this;var e=o.bind(this._handleGeolocationResponse,this),i=o.bind(this._handleGeolocationError,this);return t.watch?this._locationWatchId=navigator.geolocation.watchPosition(e,i,t):navigator.geolocation.getCurrentPosition(e,i,t),this},stopLocate:function(){return navigator.geolocation&&navigator.geolocation.clearWatch(this._locationWatchId),this._locateOptions&&(this._locateOptions.setView=!1),this},_handleGeolocationError:function(t){var e=t.code,i=t.message||(1===e?"permission denied":2===e?"position unavailable":"timeout");this._locateOptions.setView&&!this._loaded&&this.fitWorld(),this.fire("locationerror",{code:e,message:"Geolocation error: "+i+"."})},_handleGeolocationResponse:function(t){var e=t.coords.latitude,i=t.coords.longitude,n=new o.LatLng(e,i),s=180*t.coords.accuracy/40075017,a=s/Math.cos(o.LatLng.DEG_TO_RAD*e),r=o.latLngBounds([e-s,i-a],[e+s,i+a]),h=this._locateOptions;if(h.setView){var l=Math.min(this.getBoundsZoom(r),h.maxZoom);this.setView(n,l)}var u={latlng:n,bounds:r,timestamp:t.timestamp};for(var c in t.coords)"number"==typeof t.coords[c]&&(u[c]=t.coords[c]);this.fire("locationfound",u)}})}(window,document);
\ No newline at end of file
diff --git a/webapp/org.eclipse.sensinact.studio.webapp.outdoor/META-INF/MANIFEST.MF b/webapp/org.eclipse.sensinact.studio.webapp.outdoor/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..8066b7a
--- /dev/null
+++ b/webapp/org.eclipse.sensinact.studio.webapp.outdoor/META-INF/MANIFEST.MF
@@ -0,0 +1,15 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Outdoor WebApp
+Bundle-SymbolicName: org.eclipse.sensinact.studio.webapp.outdoor;singleton:=true
+Bundle-Version: 1.0.0.qualifier
+Bundle-Activator: org.eclipse.sensinact.studio.webapp.outdoor.Activator
+Bundle-Vendor: CEA-LETI
+Require-Bundle: org.eclipse.core.runtime,
+ org.restlet,
+ org.eclipse.sensinact.studio.http,
+ org.eclipse.ui.workbench,
+ org.apache.log4j
+Bundle-RequiredExecutionEnvironment: JavaSE-1.7
+Export-Package: org.eclipse.sensinact.studio.webapp.outdoor
+Import-Package: org.apache.log4j
diff --git a/webapp/org.eclipse.sensinact.studio.webapp.outdoor/about.html b/webapp/org.eclipse.sensinact.studio.webapp.outdoor/about.html
new file mode 100644
index 0000000..3b39f88
--- /dev/null
+++ b/webapp/org.eclipse.sensinact.studio.webapp.outdoor/about.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"><head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 5, 2006</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+
+</body></html>
\ No newline at end of file
diff --git a/webapp/org.eclipse.sensinact.studio.webapp.outdoor/build.properties b/webapp/org.eclipse.sensinact.studio.webapp.outdoor/build.properties
new file mode 100644
index 0000000..c5b3bf8
--- /dev/null
+++ b/webapp/org.eclipse.sensinact.studio.webapp.outdoor/build.properties
@@ -0,0 +1,20 @@
+#
+# Copyright (c) 2017 CEA.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+# CEA - initial API and implementation and/or initial documentation
+#
+
+source.. = src/
+bin.includes = .,\
+ .project,\
+ webapp/,\
+ .classpath,\
+ build.properties,\
+ META-INF/,\
+ .settings/,\
+ plugin.xml
diff --git a/webapp/org.eclipse.sensinact.studio.webapp.outdoor/plugin.xml b/webapp/org.eclipse.sensinact.studio.webapp.outdoor/plugin.xml
new file mode 100644
index 0000000..f22663e
--- /dev/null
+++ b/webapp/org.eclipse.sensinact.studio.webapp.outdoor/plugin.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Copyright (c) 2017 CEA.
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+
+ Contributors:
+ CEA - initial API and implementation and/or initial documentation
+
+-->
+<?eclipse version="3.4"?>
+<plugin>
+ <extension
+ point="org.eclipse.ui.startup">
+ <startup
+ class="org.eclipse.sensinact.studio.webapp.outdoor.Startup">
+ </startup>
+ </extension>
+
+</plugin>
diff --git a/webapp/org.eclipse.sensinact.studio.webapp.outdoor/src/org/eclipse/sensinact/studio/webapp/outdoor/Activator.java b/webapp/org.eclipse.sensinact.studio.webapp.outdoor/src/org/eclipse/sensinact/studio/webapp/outdoor/Activator.java
new file mode 100644
index 0000000..e9cdc69
--- /dev/null
+++ b/webapp/org.eclipse.sensinact.studio.webapp.outdoor/src/org/eclipse/sensinact/studio/webapp/outdoor/Activator.java
@@ -0,0 +1,50 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.webapp.outdoor;
+
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class Activator implements BundleActivator {
+
+ // The plug-in ID
+ public static final String PLUGIN_ID = "org.eclipse.sensinact.studio.webapp.outdoor"; //$NON-NLS-1$
+
+ // The shared instance
+ private static Activator plugin;
+
+ /**
+ * The constructor
+ */
+ public Activator() {
+ }
+
+ public void start(BundleContext context) throws Exception {
+ plugin = this;
+ }
+
+ public void stop(BundleContext context) throws Exception {
+ plugin = null;
+ }
+
+ /**
+ * Returns the shared instance
+ *
+ * @return the shared instance
+ */
+ public static Activator getDefault() {
+ return plugin;
+ }
+
+}
diff --git a/webapp/org.eclipse.sensinact.studio.webapp.outdoor/src/org/eclipse/sensinact/studio/webapp/outdoor/Startup.java b/webapp/org.eclipse.sensinact.studio.webapp.outdoor/src/org/eclipse/sensinact/studio/webapp/outdoor/Startup.java
new file mode 100644
index 0000000..2f724af
--- /dev/null
+++ b/webapp/org.eclipse.sensinact.studio.webapp.outdoor/src/org/eclipse/sensinact/studio/webapp/outdoor/Startup.java
@@ -0,0 +1,32 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.webapp.outdoor;
+
+import org.eclipse.sensinact.studio.http.server.RouteUtil;
+import org.eclipse.sensinact.studio.webapp.outdoor.content.OutdoorInit;
+import org.eclipse.sensinact.studio.webapp.outdoor.content.OutdoorResources;
+import org.eclipse.ui.IStartup;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class Startup implements IStartup {
+
+ public static final String INIT_PATH = "/webapp/outdoor/init";
+ public static final String STATIC_PATH = "/webapp/outdoor/static";
+ public static final String BUNDLE_PATHS[] = { INIT_PATH, STATIC_PATH };
+
+ @Override
+ public void earlyStartup() {
+ RouteUtil.attachRoute(INIT_PATH, OutdoorInit.class);
+ RouteUtil.attachRoute(STATIC_PATH, new OutdoorResources());
+ }
+}
diff --git a/webapp/org.eclipse.sensinact.studio.webapp.outdoor/src/org/eclipse/sensinact/studio/webapp/outdoor/content/OutdoorInit.java b/webapp/org.eclipse.sensinact.studio.webapp.outdoor/src/org/eclipse/sensinact/studio/webapp/outdoor/content/OutdoorInit.java
new file mode 100644
index 0000000..009f24b
--- /dev/null
+++ b/webapp/org.eclipse.sensinact.studio.webapp.outdoor/src/org/eclipse/sensinact/studio/webapp/outdoor/content/OutdoorInit.java
@@ -0,0 +1,66 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.webapp.outdoor.content;
+
+import org.eclipse.sensinact.studio.http.server.SensinactServerResource;
+import org.restlet.resource.Get;
+
+/**
+ * @author Etienne Gandrille
+ */
+public class OutdoorInit extends SensinactServerResource {
+
+ /** Location displayed when studio starts */
+ private static final LOCATION DEFAULT_LOCATION = LOCATION.CEA_GRENOBLE;
+
+ @Get
+ public String getValue(String params) {
+ return getDefaultLocation();
+ }
+
+ public static String getDefaultLocation() {
+ return DEFAULT_LOCATION.toJSON();
+ }
+
+ public enum LOCATION
+ {
+ SANTANDER("43.464304", "-3.810365", "13"),
+ CEA_GRENOBLE("45.19954840972916", "5.702977180480957", "15"),
+ MURCIA("37.98682789766166", "-1.1273860931396484", "13"),
+ PALERMO("38.16270754361624","13.309797048568726","13");
+
+ private final String lat;
+ private final String lng;
+ private final String zoom;
+
+ private LOCATION(String lat, String lng, String zoom) {
+ this.lat = lat;
+ this.lng = lng;
+ this.zoom = zoom;
+ }
+
+ public String toJSON() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("{");
+ buildJSONAttribute(sb, "lat", lat);
+ sb.append(",");
+ buildJSONAttribute(sb, "lng", lng);
+ sb.append(",");
+ buildJSONAttribute(sb, "zoom", zoom);
+ sb.append("}");
+ return sb.toString();
+ }
+
+ private void buildJSONAttribute(StringBuilder sb, String key, String val) {
+ sb.append("\"").append(key).append("\"").append(":").append("\"").append(val).append("\"");
+ }
+ }
+}
diff --git a/webapp/org.eclipse.sensinact.studio.webapp.outdoor/src/org/eclipse/sensinact/studio/webapp/outdoor/content/OutdoorResources.java b/webapp/org.eclipse.sensinact.studio.webapp.outdoor/src/org/eclipse/sensinact/studio/webapp/outdoor/content/OutdoorResources.java
new file mode 100644
index 0000000..3863718
--- /dev/null
+++ b/webapp/org.eclipse.sensinact.studio.webapp.outdoor/src/org/eclipse/sensinact/studio/webapp/outdoor/content/OutdoorResources.java
@@ -0,0 +1,28 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.webapp.outdoor.content;
+
+import org.restlet.Application;
+import org.restlet.Restlet;
+import org.restlet.data.Reference;
+import org.restlet.resource.Directory;
+
+/**
+ * @author Nicolas Hili
+ * @since Nov 19, 2014
+ */
+public class OutdoorResources extends Application {
+ @Override
+ public Restlet createInboundRoot() {
+ Directory dir = new Directory(getContext(), new Reference(getClass().getClassLoader().getResource("/webapp")));
+ return dir;
+ }
+}
\ No newline at end of file
diff --git a/webapp/org.eclipse.sensinact.studio.webapp.outdoor/webapp/WEB-INF/web.xml b/webapp/org.eclipse.sensinact.studio.webapp.outdoor/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000..01f6f06
--- /dev/null
+++ b/webapp/org.eclipse.sensinact.studio.webapp.outdoor/webapp/WEB-INF/web.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Copyright (c) 2017 CEA.
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+
+ Contributors:
+ CEA - initial API and implementation and/or initial documentation
+
+-->
+<web-app>
+ <welcome-file-list>
+ <welcome-file>outdoor.html</welcome-file>
+ </welcome-file-list>
+</web-app>
\ No newline at end of file
diff --git a/webapp/org.eclipse.sensinact.studio.webapp.outdoor/webapp/css/custom.css b/webapp/org.eclipse.sensinact.studio.webapp.outdoor/webapp/css/custom.css
new file mode 100644
index 0000000..89b6533
--- /dev/null
+++ b/webapp/org.eclipse.sensinact.studio.webapp.outdoor/webapp/css/custom.css
@@ -0,0 +1,48 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+html, body, #map {
+ height:100%;
+ margin:0px;
+ padding:0px;
+}
+
+#notif {
+ position: absolute;
+ bottom: 1em;
+ right: 1em;
+ padding: 1em;
+ background-color: #759D66;
+ border-radius: 10px;
+ min-width: 150px;
+ color: white;
+ text-align: center;
+ visibility: hidden;
+}
+
+#image {
+ position: absolute;
+ top:0em;
+ right:0em;
+ background-color: grey;
+ width: 100%;
+ height: 100%;
+ visibility: hidden;
+ text-align: center;
+}
+
+#image a img {
+ max-width:100%;
+ max-height: 100%;
+}
+
+a {
+ text-decoration: none;
+}
diff --git a/webapp/org.eclipse.sensinact.studio.webapp.outdoor/webapp/css/leaflet.css b/webapp/org.eclipse.sensinact.studio.webapp.outdoor/webapp/css/leaflet.css
new file mode 100644
index 0000000..c161c31
--- /dev/null
+++ b/webapp/org.eclipse.sensinact.studio.webapp.outdoor/webapp/css/leaflet.css
@@ -0,0 +1,479 @@
+/* required styles */
+
+.leaflet-map-pane,
+.leaflet-tile,
+.leaflet-marker-icon,
+.leaflet-marker-shadow,
+.leaflet-tile-pane,
+.leaflet-tile-container,
+.leaflet-overlay-pane,
+.leaflet-shadow-pane,
+.leaflet-marker-pane,
+.leaflet-popup-pane,
+.leaflet-overlay-pane svg,
+.leaflet-zoom-box,
+.leaflet-image-layer,
+.leaflet-layer {
+ position: absolute;
+ left: 0;
+ top: 0;
+ }
+.leaflet-container {
+ overflow: hidden;
+ -ms-touch-action: none;
+ touch-action: none;
+ }
+.leaflet-tile,
+.leaflet-marker-icon,
+.leaflet-marker-shadow {
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ user-select: none;
+ -webkit-user-drag: none;
+ }
+.leaflet-marker-icon,
+.leaflet-marker-shadow {
+ display: block;
+ }
+/* map is broken in FF if you have max-width: 100% on tiles */
+.leaflet-container img {
+ max-width: none !important;
+ }
+/* stupid Android 2 doesn't understand "max-width: none" properly */
+.leaflet-container img.leaflet-image-layer {
+ max-width: 15000px !important;
+ }
+.leaflet-tile {
+ filter: inherit;
+ visibility: hidden;
+ }
+.leaflet-tile-loaded {
+ visibility: inherit;
+ }
+.leaflet-zoom-box {
+ width: 0;
+ height: 0;
+ }
+/* workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=888319 */
+.leaflet-overlay-pane svg {
+ -moz-user-select: none;
+ }
+
+.leaflet-tile-pane { z-index: 2; }
+.leaflet-objects-pane { z-index: 3; }
+.leaflet-overlay-pane { z-index: 4; }
+.leaflet-shadow-pane { z-index: 5; }
+.leaflet-marker-pane { z-index: 6; }
+.leaflet-popup-pane { z-index: 7; }
+
+.leaflet-vml-shape {
+ width: 1px;
+ height: 1px;
+ }
+.lvml {
+ behavior: url(#default#VML);
+ display: inline-block;
+ position: absolute;
+ }
+
+
+/* control positioning */
+
+.leaflet-control {
+ position: relative;
+ z-index: 7;
+ pointer-events: auto;
+ }
+.leaflet-top,
+.leaflet-bottom {
+ position: absolute;
+ z-index: 1000;
+ pointer-events: none;
+ }
+.leaflet-top {
+ top: 0;
+ }
+.leaflet-right {
+ right: 0;
+ }
+.leaflet-bottom {
+ bottom: 0;
+ }
+.leaflet-left {
+ left: 0;
+ }
+.leaflet-control {
+ float: left;
+ clear: both;
+ }
+.leaflet-right .leaflet-control {
+ float: right;
+ }
+.leaflet-top .leaflet-control {
+ margin-top: 10px;
+ }
+.leaflet-bottom .leaflet-control {
+ margin-bottom: 10px;
+ }
+.leaflet-left .leaflet-control {
+ margin-left: 10px;
+ }
+.leaflet-right .leaflet-control {
+ margin-right: 10px;
+ }
+
+
+/* zoom and fade animations */
+
+.leaflet-fade-anim .leaflet-tile,
+.leaflet-fade-anim .leaflet-popup {
+ opacity: 0;
+ -webkit-transition: opacity 0.2s linear;
+ -moz-transition: opacity 0.2s linear;
+ -o-transition: opacity 0.2s linear;
+ transition: opacity 0.2s linear;
+ }
+.leaflet-fade-anim .leaflet-tile-loaded,
+.leaflet-fade-anim .leaflet-map-pane .leaflet-popup {
+ opacity: 1;
+ }
+
+.leaflet-zoom-anim .leaflet-zoom-animated {
+ -webkit-transition: -webkit-transform 0.25s cubic-bezier(0,0,0.25,1);
+ -moz-transition: -moz-transform 0.25s cubic-bezier(0,0,0.25,1);
+ -o-transition: -o-transform 0.25s cubic-bezier(0,0,0.25,1);
+ transition: transform 0.25s cubic-bezier(0,0,0.25,1);
+ }
+.leaflet-zoom-anim .leaflet-tile,
+.leaflet-pan-anim .leaflet-tile,
+.leaflet-touching .leaflet-zoom-animated {
+ -webkit-transition: none;
+ -moz-transition: none;
+ -o-transition: none;
+ transition: none;
+ }
+
+.leaflet-zoom-anim .leaflet-zoom-hide {
+ visibility: hidden;
+ }
+
+
+/* cursors */
+
+.leaflet-clickable {
+ cursor: pointer;
+ }
+.leaflet-container {
+ cursor: -webkit-grab;
+ cursor: -moz-grab;
+ }
+.leaflet-popup-pane,
+.leaflet-control {
+ cursor: auto;
+ }
+.leaflet-dragging .leaflet-container,
+.leaflet-dragging .leaflet-clickable {
+ cursor: move;
+ cursor: -webkit-grabbing;
+ cursor: -moz-grabbing;
+ }
+
+
+/* visual tweaks */
+
+.leaflet-container {
+ background: #ddd;
+ outline: 0;
+ }
+.leaflet-container a {
+ color: #0078A8;
+ }
+.leaflet-container a.leaflet-active {
+ outline: 2px solid orange;
+ }
+.leaflet-zoom-box {
+ border: 2px dotted #38f;
+ background: rgba(255,255,255,0.5);
+ }
+
+
+/* general typography */
+.leaflet-container {
+ font: 12px/1.5 "Helvetica Neue", Arial, Helvetica, sans-serif;
+ }
+
+
+/* general toolbar styles */
+
+.leaflet-bar {
+ box-shadow: 0 1px 5px rgba(0,0,0,0.65);
+ border-radius: 4px;
+ }
+.leaflet-bar a,
+.leaflet-bar a:hover {
+ background-color: #fff;
+ border-bottom: 1px solid #ccc;
+ width: 26px;
+ height: 26px;
+ line-height: 26px;
+ display: block;
+ text-align: center;
+ text-decoration: none;
+ color: black;
+ }
+.leaflet-bar a,
+.leaflet-control-layers-toggle {
+ background-position: 50% 50%;
+ background-repeat: no-repeat;
+ display: block;
+ }
+.leaflet-bar a:hover {
+ background-color: #f4f4f4;
+ }
+.leaflet-bar a:first-child {
+ border-top-left-radius: 4px;
+ border-top-right-radius: 4px;
+ }
+.leaflet-bar a:last-child {
+ border-bottom-left-radius: 4px;
+ border-bottom-right-radius: 4px;
+ border-bottom: none;
+ }
+.leaflet-bar a.leaflet-disabled {
+ cursor: default;
+ background-color: #f4f4f4;
+ color: #bbb;
+ }
+
+.leaflet-touch .leaflet-bar a {
+ width: 30px;
+ height: 30px;
+ line-height: 30px;
+ }
+
+
+/* zoom control */
+
+.leaflet-control-zoom-in,
+.leaflet-control-zoom-out {
+ font: bold 18px 'Lucida Console', Monaco, monospace;
+ text-indent: 1px;
+ }
+.leaflet-control-zoom-out {
+ font-size: 20px;
+ }
+
+.leaflet-touch .leaflet-control-zoom-in {
+ font-size: 22px;
+ }
+.leaflet-touch .leaflet-control-zoom-out {
+ font-size: 24px;
+ }
+
+
+/* layers control */
+
+.leaflet-control-layers {
+ box-shadow: 0 1px 5px rgba(0,0,0,0.4);
+ background: #fff;
+ border-radius: 5px;
+ }
+.leaflet-control-layers-toggle {
+ background-image: url(images/layers.png);
+ width: 36px;
+ height: 36px;
+ }
+.leaflet-retina .leaflet-control-layers-toggle {
+ background-image: url(images/layers-2x.png);
+ background-size: 26px 26px;
+ }
+.leaflet-touch .leaflet-control-layers-toggle {
+ width: 44px;
+ height: 44px;
+ }
+.leaflet-control-layers .leaflet-control-layers-list,
+.leaflet-control-layers-expanded .leaflet-control-layers-toggle {
+ display: none;
+ }
+.leaflet-control-layers-expanded .leaflet-control-layers-list {
+ display: block;
+ position: relative;
+ }
+.leaflet-control-layers-expanded {
+ padding: 6px 10px 6px 6px;
+ color: #333;
+ background: #fff;
+ }
+.leaflet-control-layers-selector {
+ margin-top: 2px;
+ position: relative;
+ top: 1px;
+ }
+.leaflet-control-layers label {
+ display: block;
+ }
+.leaflet-control-layers-separator {
+ height: 0;
+ border-top: 1px solid #ddd;
+ margin: 5px -10px 5px -6px;
+ }
+
+
+/* attribution and scale controls */
+
+.leaflet-container .leaflet-control-attribution {
+ background: #fff;
+ background: rgba(255, 255, 255, 0.7);
+ margin: 0;
+ }
+.leaflet-control-attribution,
+.leaflet-control-scale-line {
+ padding: 0 5px;
+ color: #333;
+ }
+.leaflet-control-attribution a {
+ text-decoration: none;
+ }
+.leaflet-control-attribution a:hover {
+ text-decoration: underline;
+ }
+.leaflet-container .leaflet-control-attribution,
+.leaflet-container .leaflet-control-scale {
+ font-size: 11px;
+ }
+.leaflet-left .leaflet-control-scale {
+ margin-left: 5px;
+ }
+.leaflet-bottom .leaflet-control-scale {
+ margin-bottom: 5px;
+ }
+.leaflet-control-scale-line {
+ border: 2px solid #777;
+ border-top: none;
+ line-height: 1.1;
+ padding: 2px 5px 1px;
+ font-size: 11px;
+ white-space: nowrap;
+ overflow: hidden;
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+
+ background: #fff;
+ background: rgba(255, 255, 255, 0.5);
+ }
+.leaflet-control-scale-line:not(:first-child) {
+ border-top: 2px solid #777;
+ border-bottom: none;
+ margin-top: -2px;
+ }
+.leaflet-control-scale-line:not(:first-child):not(:last-child) {
+ border-bottom: 2px solid #777;
+ }
+
+.leaflet-touch .leaflet-control-attribution,
+.leaflet-touch .leaflet-control-layers,
+.leaflet-touch .leaflet-bar {
+ box-shadow: none;
+ }
+.leaflet-touch .leaflet-control-layers,
+.leaflet-touch .leaflet-bar {
+ border: 2px solid rgba(0,0,0,0.2);
+ background-clip: padding-box;
+ }
+
+
+/* popup */
+
+.leaflet-popup {
+ position: absolute;
+ text-align: center;
+ }
+.leaflet-popup-content-wrapper {
+ padding: 1px;
+ text-align: left;
+ border-radius: 12px;
+ }
+.leaflet-popup-content {
+ margin: 13px 19px;
+ line-height: 1.4;
+ }
+.leaflet-popup-content p {
+ margin: 18px 0;
+ }
+.leaflet-popup-tip-container {
+ margin: 0 auto;
+ width: 40px;
+ height: 20px;
+ position: relative;
+ overflow: hidden;
+ }
+.leaflet-popup-tip {
+ width: 17px;
+ height: 17px;
+ padding: 1px;
+
+ margin: -10px auto 0;
+
+ -webkit-transform: rotate(45deg);
+ -moz-transform: rotate(45deg);
+ -ms-transform: rotate(45deg);
+ -o-transform: rotate(45deg);
+ transform: rotate(45deg);
+ }
+.leaflet-popup-content-wrapper,
+.leaflet-popup-tip {
+ background: white;
+
+ box-shadow: 0 3px 14px rgba(0,0,0,0.4);
+ }
+.leaflet-container a.leaflet-popup-close-button {
+ position: absolute;
+ top: 0;
+ right: 0;
+ padding: 4px 4px 0 0;
+ text-align: center;
+ width: 18px;
+ height: 14px;
+ font: 16px/14px Tahoma, Verdana, sans-serif;
+ color: #c3c3c3;
+ text-decoration: none;
+ font-weight: bold;
+ background: transparent;
+ }
+.leaflet-container a.leaflet-popup-close-button:hover {
+ color: #999;
+ }
+.leaflet-popup-scrolled {
+ overflow: auto;
+ border-bottom: 1px solid #ddd;
+ border-top: 1px solid #ddd;
+ }
+
+.leaflet-oldie .leaflet-popup-content-wrapper {
+ zoom: 1;
+ }
+.leaflet-oldie .leaflet-popup-tip {
+ width: 24px;
+ margin: 0 auto;
+
+ -ms-filter: "progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)";
+ filter: progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678);
+ }
+.leaflet-oldie .leaflet-popup-tip-container {
+ margin-top: -1px;
+ }
+
+.leaflet-oldie .leaflet-control-zoom,
+.leaflet-oldie .leaflet-control-layers,
+.leaflet-oldie .leaflet-popup-content-wrapper,
+.leaflet-oldie .leaflet-popup-tip {
+ border: 1px solid #999;
+ }
+
+
+/* div icon */
+
+.leaflet-div-icon {
+ background: #fff;
+ border: 1px solid #666;
+ }
diff --git a/webapp/org.eclipse.sensinact.studio.webapp.outdoor/webapp/images/cea4022etage2.png b/webapp/org.eclipse.sensinact.studio.webapp.outdoor/webapp/images/cea4022etage2.png
new file mode 100644
index 0000000..9b5c69b
--- /dev/null
+++ b/webapp/org.eclipse.sensinact.studio.webapp.outdoor/webapp/images/cea4022etage2.png
Binary files differ
diff --git a/webapp/org.eclipse.sensinact.studio.webapp.outdoor/webapp/images/ceaptl.png b/webapp/org.eclipse.sensinact.studio.webapp.outdoor/webapp/images/ceaptl.png
new file mode 100644
index 0000000..21c049e
--- /dev/null
+++ b/webapp/org.eclipse.sensinact.studio.webapp.outdoor/webapp/images/ceaptl.png
Binary files differ
diff --git a/webapp/org.eclipse.sensinact.studio.webapp.outdoor/webapp/js/custom.js b/webapp/org.eclipse.sensinact.studio.webapp.outdoor/webapp/js/custom.js
new file mode 100644
index 0000000..c981cc9
--- /dev/null
+++ b/webapp/org.eclipse.sensinact.studio.webapp.outdoor/webapp/js/custom.js
@@ -0,0 +1,155 @@
+/*
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+
+var init = eval('(' + synchronusGET("/webapp/outdoor/init") + ')');
+
+
+var map = L.map('map',{maxZoom:23}).setView([init.lat, init.lng], init.zoom);
+L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
+ maxZoom: 23,attribution: '© <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
+}).addTo(map);
+
+imageBounds4022 = [[45.19317,5.70630],[45.19350,5.70675]];
+imageBoundsPTL = [[45.19591,5.70564],[45.19555,5.70617]];
+var bat4022=L.imageOverlay('/webapp/outdoor/static/images/cea4022etage2.png', imageBounds4022);
+var batPTL=L.imageOverlay('/webapp/outdoor/static/images/ceaptl.png', imageBoundsPTL);
+bat4022.addTo(map);
+bat4022.setOpacity(0.0);
+batPTL.addTo(map);
+batPTL.setOpacity(0.0);
+map.on('zoomend', function(e) {
+ console.log(e.target._zoom);
+ if(e.target._zoom >= 20) {
+ bat4022.setOpacity(0.5);
+ batPTL.setOpacity(0.5);
+ }else {
+ bat4022.setOpacity(0.0);
+ batPTL.setOpacity(0.0);
+ }
+});
+
+var markers = [];
+
+
+function synchronusGET(url){
+ return $.ajax({
+ type: "GET",
+ url: url,
+ cache: false,
+ async: false
+ }).responseText;
+}
+
+function computeCoordinates(x, y) {
+ var point = L.point(x, y);
+ var latlng = map.containerPointToLatLng(point);
+ var lat = latlng.lat;
+ var lng = latlng.lng;
+ var latlngArray = new Array();
+ latlngArray[0] = lat;
+ latlngArray[1] = lng;
+ return latlngArray;
+}
+
+function updateDeviceLocation(lat, lng, deviceName) {
+
+ var markerCache = markers[deviceName];
+
+ if (markerCache === undefined){
+ var content = "<p><b>" + deviceName + "</b></p><p> please wait during information refresh...</p>";
+ var marker = L.marker([lat, lng], {draggable:true,title:deviceName}).bindPopup(content,{maxWidth:600}).addTo(map);
+ marker.on('dragend', markerDrag);
+ marker.on('click',function(e) {updatePopupAtInit(e,deviceName);} );
+ markers[deviceName] = marker;
+ }else {
+ markerCache.setLatLng([lat, lng]);
+ markerCache.update();
+ }
+ return Boolean("true");
+}
+
+function deleteMarker(deviceName) {
+ var marker = markers[deviceName];
+ if (marker != undefined) {
+ map.removeLayer(marker);
+ markers[deviceName] = undefined;
+ }
+ return Boolean("true");
+}
+
+function markerDrag(e) {
+ var text = e.target._popup._content;
+ var latlng = e.target._latlng;
+ var deviceName = e.target.options.title;
+
+ var marker = markers[deviceName];
+
+ $.ajax
+ ({
+ contentType : 'application/json',
+ type: "POST",
+ url: "/webapp/updatelocation/" + deviceName,
+ async: false,
+ data: JSON.stringify({"lat": latlng.lat, "lng": latlng.lng })
+ });
+}
+
+function updatePopupAtInit(e, deviceName) {
+ updatePopup(markers[deviceName].getPopup(), deviceName);
+}
+
+function updatePopupOnClick(deviceName) {
+ var popup = markers[deviceName].getPopup();
+ updatePopup(popup, deviceName);
+}
+
+function updatePopup(popup, deviceName) {
+ $.get("/webapp/deviceinfo/" + deviceName, function(data) {
+ popup.setContent(data);
+ popup.update();
+ });
+}
+
+function updatePopupOnClick(deviceName, serviceName) {
+ $.get("/webapp/deviceinfo/" + deviceName + "/" + serviceName, function(data) {
+ markers[deviceName].closePopup();
+ markers[deviceName].setPopupContent(data);
+ markers[deviceName].getPopup().update();
+ markers[deviceName].openPopup();
+ });
+}
+
+function performAction(gatewayName, deviceName, serviceName, resourceName) {
+ $.get("/webapp/performAction/" + gatewayName + "/" + deviceName + "/" + serviceName + "/" + resourceName, function(data) {
+ var result = JSON.parse(data);
+ var title = result.title
+ var message = result.message;
+ var status = result.status;
+
+ if (status != "SUCCESS") {
+ var msg = '[' + status + ']' + ' ' + title + '\n\n' + message;
+ alert(msg);
+ } else {
+ document.getElementById("notif").style.visibility = "visible";
+ window.setTimeout(function() {document.getElementById("notif").style.visibility = "hidden";}, 1000);
+ }
+ });
+}
+
+function showImage(imageUrl) {
+ var content = '<a href="#" onclick="closeImage();"><img src="' + imageUrl + '" /></a>';
+ document.getElementById("image").innerHTML = content;
+ document.getElementById("image").style.visibility = "visible";
+}
+
+function closeImage(imageUrl) {
+ document.getElementById("image").style.visibility = "hidden";
+}
diff --git a/webapp/org.eclipse.sensinact.studio.webapp.outdoor/webapp/js/images/layers-2x.png b/webapp/org.eclipse.sensinact.studio.webapp.outdoor/webapp/js/images/layers-2x.png
new file mode 100644
index 0000000..a2cf7f9
--- /dev/null
+++ b/webapp/org.eclipse.sensinact.studio.webapp.outdoor/webapp/js/images/layers-2x.png
Binary files differ
diff --git a/webapp/org.eclipse.sensinact.studio.webapp.outdoor/webapp/js/images/layers.png b/webapp/org.eclipse.sensinact.studio.webapp.outdoor/webapp/js/images/layers.png
new file mode 100644
index 0000000..bca0a0e
--- /dev/null
+++ b/webapp/org.eclipse.sensinact.studio.webapp.outdoor/webapp/js/images/layers.png
Binary files differ
diff --git a/webapp/org.eclipse.sensinact.studio.webapp.outdoor/webapp/js/images/marker-icon-2x.png b/webapp/org.eclipse.sensinact.studio.webapp.outdoor/webapp/js/images/marker-icon-2x.png
new file mode 100644
index 0000000..0015b64
--- /dev/null
+++ b/webapp/org.eclipse.sensinact.studio.webapp.outdoor/webapp/js/images/marker-icon-2x.png
Binary files differ
diff --git a/webapp/org.eclipse.sensinact.studio.webapp.outdoor/webapp/js/images/marker-icon.png b/webapp/org.eclipse.sensinact.studio.webapp.outdoor/webapp/js/images/marker-icon.png
new file mode 100644
index 0000000..e2e9f75
--- /dev/null
+++ b/webapp/org.eclipse.sensinact.studio.webapp.outdoor/webapp/js/images/marker-icon.png
Binary files differ
diff --git a/webapp/org.eclipse.sensinact.studio.webapp.outdoor/webapp/js/images/marker-shadow.png b/webapp/org.eclipse.sensinact.studio.webapp.outdoor/webapp/js/images/marker-shadow.png
new file mode 100644
index 0000000..d1e773c
--- /dev/null
+++ b/webapp/org.eclipse.sensinact.studio.webapp.outdoor/webapp/js/images/marker-shadow.png
Binary files differ
diff --git a/webapp/org.eclipse.sensinact.studio.webapp.outdoor/webapp/js/jquery-2.2.0.min.js b/webapp/org.eclipse.sensinact.studio.webapp.outdoor/webapp/js/jquery-2.2.0.min.js
new file mode 100644
index 0000000..06ac263
--- /dev/null
+++ b/webapp/org.eclipse.sensinact.studio.webapp.outdoor/webapp/js/jquery-2.2.0.min.js
@@ -0,0 +1,4 @@
+/*! jQuery v2.2.0 | (c) jQuery Foundation | jquery.org/license */
+!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=a.document,e=c.slice,f=c.concat,g=c.push,h=c.indexOf,i={},j=i.toString,k=i.hasOwnProperty,l={},m="2.2.0",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return e.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:e.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a){return n.each(this,a)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(e.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:g,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(n.isPlainObject(d)||(e=n.isArray(d)))?(e?(e=!1,f=c&&n.isArray(c)?c:[]):f=c&&n.isPlainObject(c)?c:{},g[b]=n.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){var b=a&&a.toString();return!n.isArray(a)&&b-parseFloat(b)+1>=0},isPlainObject:function(a){return"object"!==n.type(a)||a.nodeType||n.isWindow(a)?!1:a.constructor&&!k.call(a.constructor.prototype,"isPrototypeOf")?!1:!0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?i[j.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=n.trim(a),a&&(1===a.indexOf("use strict")?(b=d.createElement("script"),b.text=a,d.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(s(a)){for(c=a.length;c>d;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):g.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:h.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,g=0,h=[];if(s(a))for(d=a.length;d>g;g++)e=b(a[g],g,c),null!=e&&h.push(e);else for(g in a)e=b(a[g],g,c),null!=e&&h.push(e);return f.apply([],h)},guid:1,proxy:function(a,b){var c,d,f;return"string"==typeof b&&(c=a[b],b=a,a=c),n.isFunction(a)?(d=e.call(arguments,2),f=function(){return a.apply(b||this,d.concat(e.call(arguments)))},f.guid=a.guid=a.guid||n.guid++,f):void 0},now:Date.now,support:l}),"function"==typeof Symbol&&(n.fn[Symbol.iterator]=c[Symbol.iterator]),n.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){i["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=!!a&&"length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ga(),z=ga(),A=ga(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+M+"))|)"+L+"*\\]",O=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+N+")*)|.*)\\)|)",P=new RegExp(L+"+","g"),Q=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),R=new RegExp("^"+L+"*,"+L+"*"),S=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),T=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),U=new RegExp(O),V=new RegExp("^"+M+"$"),W={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M+"|[*])"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},X=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,$=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,_=/[+~]/,aa=/'|\\/g,ba=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),ca=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},da=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(ea){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fa(a,b,d,e){var f,h,j,k,l,o,r,s,w=b&&b.ownerDocument,x=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==x&&9!==x&&11!==x)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==x&&(o=$.exec(a)))if(f=o[1]){if(9===x){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(w&&(j=w.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(o[2])return H.apply(d,b.getElementsByTagName(a)),d;if((f=o[3])&&c.getElementsByClassName&&b.getElementsByClassName)return H.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==x)w=b,s=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(aa,"\\$&"):b.setAttribute("id",k=u),r=g(a),h=r.length,l=V.test(k)?"#"+k:"[id='"+k+"']";while(h--)r[h]=l+" "+qa(r[h]);s=r.join(","),w=_.test(a)&&oa(b.parentNode)||b}if(s)try{return H.apply(d,w.querySelectorAll(s)),d}catch(y){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(Q,"$1"),b,d,e)}function ga(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ha(a){return a[u]=!0,a}function ia(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ja(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function ka(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function la(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function na(a){return ha(function(b){return b=+b,ha(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function oa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=fa.support={},f=fa.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fa.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ia(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ia(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Z.test(n.getElementsByClassName),c.getById=ia(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return"undefined"!=typeof b.getElementsByClassName&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=Z.test(n.querySelectorAll))&&(ia(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\r\\' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ia(function(a){var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Z.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ia(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",O)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Z.test(o.compareDocumentPosition),t=b||Z.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return ka(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?ka(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},fa.matches=function(a,b){return fa(a,null,null,b)},fa.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(T,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fa(b,n,null,[a]).length>0},fa.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fa.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fa.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fa.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fa.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fa.selectors={cacheLength:50,createPseudo:ha,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ba,ca),a[3]=(a[3]||a[4]||a[5]||"").replace(ba,ca),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fa.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fa.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return W.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&U.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ba,ca).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fa.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(P," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fa.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ha(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ha(function(a){var b=[],c=[],d=h(a.replace(Q,"$1"));return d[u]?ha(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ha(function(a){return function(b){return fa(a,b).length>0}}),contains:ha(function(a){return a=a.replace(ba,ca),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ha(function(a){return V.test(a||"")||fa.error("unsupported lang: "+a),a=a.replace(ba,ca).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Y.test(a.nodeName)},input:function(a){return X.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:na(function(){return[0]}),last:na(function(a,b){return[b-1]}),eq:na(function(a,b,c){return[0>c?c+b:c]}),even:na(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:na(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:na(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:na(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=la(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=ma(b);function pa(){}pa.prototype=d.filters=d.pseudos,d.setFilters=new pa,g=fa.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){(!c||(e=R.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=S.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(Q," ")}),h=h.slice(c.length));for(g in d.filter)!(e=W[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?fa.error(a):z(a,i).slice(0)};function qa(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function ra(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j,k=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(j=b[u]||(b[u]={}),i=j[b.uniqueID]||(j[b.uniqueID]={}),(h=i[d])&&h[0]===w&&h[1]===f)return k[2]=h[2];if(i[d]=k,k[2]=a(b,c,g))return!0}}}function sa(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ta(a,b,c){for(var d=0,e=b.length;e>d;d++)fa(a,b[d],c);return c}function ua(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function va(a,b,c,d,e,f){return d&&!d[u]&&(d=va(d)),e&&!e[u]&&(e=va(e,f)),ha(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ta(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ua(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ua(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ua(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function wa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ra(function(a){return a===b},h,!0),l=ra(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[ra(sa(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return va(i>1&&sa(m),i>1&&qa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(Q,"$1"),c,e>i&&wa(a.slice(i,e)),f>e&&wa(a=a.slice(e)),f>e&&qa(a))}m.push(c)}return sa(m)}function xa(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=F.call(i));u=ua(u)}H.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&fa.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ha(f):f}return h=fa.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xa(e,d)),f.selector=a}return f},i=fa.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ba,ca),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=W.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ba,ca),_.test(j[0].type)&&oa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qa(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||_.test(a)&&oa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ia(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ia(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ja("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ia(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ja("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ia(function(a){return null==a.getAttribute("disabled")})||ja(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fa}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.uniqueSort=n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},v=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},w=n.expr.match.needsContext,x=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,y=/^.[^:#\[\.,]*$/;function z(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(y.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return h.call(b,a)>-1!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;c>b;b++)if(n.contains(e[b],this))return!0}));for(b=0;c>b;b++)n.find(a,e[b],d);return d=this.pushStack(c>1?n.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(z(this,a||[],!1))},not:function(a){return this.pushStack(z(this,a||[],!0))},is:function(a){return!!z(this,"string"==typeof a&&w.test(a)?n(a):a||[],!1).length}});var A,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=n.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||A,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:B.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),x.test(e[1])&&n.isPlainObject(b))for(e in b)n.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&f.parentNode&&(this.length=1,this[0]=f),this.context=d,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?void 0!==c.ready?c.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};C.prototype=n.fn,A=n(d);var D=/^(?:parents|prev(?:Until|All))/,E={children:!0,contents:!0,next:!0,prev:!0};n.fn.extend({has:function(a){var b=n(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(n.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=w.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?h.call(n(a),this[0]):h.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.uniqueSort(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function F(a,b){while((a=a[b])&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return u(a,"parentNode")},parentsUntil:function(a,b,c){return u(a,"parentNode",c)},next:function(a){return F(a,"nextSibling")},prev:function(a){return F(a,"previousSibling")},nextAll:function(a){return u(a,"nextSibling")},prevAll:function(a){return u(a,"previousSibling")},nextUntil:function(a,b,c){return u(a,"nextSibling",c)},prevUntil:function(a,b,c){return u(a,"previousSibling",c)},siblings:function(a){return v((a.parentNode||{}).firstChild,a)},children:function(a){return v(a.firstChild)},contents:function(a){return a.contentDocument||n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(E[a]||n.uniqueSort(e),D.test(a)&&e.reverse()),this.pushStack(e)}});var G=/\S+/g;function H(a){var b={};return n.each(a.match(G)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?H(a):n.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h<f.length)f[h].apply(c[0],c[1])===!1&&a.stopOnFalse&&(h=f.length,c=!1)}a.memory||(c=!1),b=!1,e&&(f=c?[]:"")},j={add:function(){return f&&(c&&!b&&(h=f.length-1,g.push(c)),function d(b){n.each(b,function(b,c){n.isFunction(c)?a.unique&&j.has(c)||f.push(c):c&&c.length&&"string"!==n.type(c)&&d(c)})}(arguments),c&&!b&&i()),this},remove:function(){return n.each(arguments,function(a,b){var c;while((c=n.inArray(b,f,c))>-1)f.splice(c,1),h>=c&&h--}),this},has:function(a){return a?n.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().progress(c.notify).done(c.resolve).fail(c.reject):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=e.call(arguments),d=c.length,f=1!==d||a&&n.isFunction(a.promise)?d:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?e.call(arguments):d,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(d>1)for(i=new Array(d),j=new Array(d),k=new Array(d);d>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().progress(h(b,j,i)).done(h(b,k,c)).fail(g.reject):--f;return f||g.resolveWith(k,c),g.promise()}});var I;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(I.resolveWith(d,[n]),n.fn.triggerHandler&&(n(d).triggerHandler("ready"),n(d).off("ready"))))}});function J(){d.removeEventListener("DOMContentLoaded",J),a.removeEventListener("load",J),n.ready()}n.ready.promise=function(b){return I||(I=n.Deferred(),"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(n.ready):(d.addEventListener("DOMContentLoaded",J),a.addEventListener("load",J))),I.promise(b)},n.ready.promise();var K=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)K(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},L=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function M(){this.expando=n.expando+M.uid++}M.uid=1,M.prototype={register:function(a,b){var c=b||{};return a.nodeType?a[this.expando]=c:Object.defineProperty(a,this.expando,{value:c,writable:!0,configurable:!0}),a[this.expando]},cache:function(a){if(!L(a))return{};var b=a[this.expando];return b||(b={},L(a)&&(a.nodeType?a[this.expando]=b:Object.defineProperty(a,this.expando,{value:b,configurable:!0}))),b},set:function(a,b,c){var d,e=this.cache(a);if("string"==typeof b)e[b]=c;else for(d in b)e[d]=b[d];return e},get:function(a,b){return void 0===b?this.cache(a):a[this.expando]&&a[this.expando][b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,n.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=a[this.expando];if(void 0!==f){if(void 0===b)this.register(a);else{n.isArray(b)?d=b.concat(b.map(n.camelCase)):(e=n.camelCase(b),b in f?d=[b,e]:(d=e,d=d in f?[d]:d.match(G)||[])),c=d.length;while(c--)delete f[d[c]]}(void 0===b||n.isEmptyObject(f))&&(a.nodeType?a[this.expando]=void 0:delete a[this.expando])}},hasData:function(a){var b=a[this.expando];return void 0!==b&&!n.isEmptyObject(b)}};var N=new M,O=new M,P=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Q=/[A-Z]/g;function R(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(Q,"-$&").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:P.test(c)?n.parseJSON(c):c}catch(e){}O.set(a,b,c);
+}else c=void 0;return c}n.extend({hasData:function(a){return O.hasData(a)||N.hasData(a)},data:function(a,b,c){return O.access(a,b,c)},removeData:function(a,b){O.remove(a,b)},_data:function(a,b,c){return N.access(a,b,c)},_removeData:function(a,b){N.remove(a,b)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=O.get(f),1===f.nodeType&&!N.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),R(f,d,e[d])));N.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){O.set(this,a)}):K(this,function(b){var c,d;if(f&&void 0===b){if(c=O.get(f,a)||O.get(f,a.replace(Q,"-$&").toLowerCase()),void 0!==c)return c;if(d=n.camelCase(a),c=O.get(f,d),void 0!==c)return c;if(c=R(f,d,void 0),void 0!==c)return c}else d=n.camelCase(a),this.each(function(){var c=O.get(this,d);O.set(this,d,b),a.indexOf("-")>-1&&void 0!==c&&O.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){O.remove(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=N.get(a,b),c&&(!d||n.isArray(c)?d=N.access(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return N.get(a,c)||N.access(a,c,{empty:n.Callbacks("once memory").add(function(){N.remove(a,[b+"queue",c])})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?n.queue(this[0],a):void 0===b?this:this.each(function(){var c=n.queue(this,a,b);n._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&n.dequeue(this,a)})},dequeue:function(a){return this.each(function(){n.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=n.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=N.get(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var S=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=new RegExp("^(?:([+-])=|)("+S+")([a-z%]*)$","i"),U=["Top","Right","Bottom","Left"],V=function(a,b){return a=b||a,"none"===n.css(a,"display")||!n.contains(a.ownerDocument,a)};function W(a,b,c,d){var e,f=1,g=20,h=d?function(){return d.cur()}:function(){return n.css(a,b,"")},i=h(),j=c&&c[3]||(n.cssNumber[b]?"":"px"),k=(n.cssNumber[b]||"px"!==j&&+i)&&T.exec(n.css(a,b));if(k&&k[3]!==j){j=j||k[3],c=c||[],k=+i||1;do f=f||".5",k/=f,n.style(a,b,k+j);while(f!==(f=h()/i)&&1!==f&&--g)}return c&&(k=+k||+i||0,e=c[1]?k+(c[1]+1)*c[2]:+c[2],d&&(d.unit=j,d.start=k,d.end=e)),e}var X=/^(?:checkbox|radio)$/i,Y=/<([\w:-]+)/,Z=/^$|\/(?:java|ecma)script/i,$={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};$.optgroup=$.option,$.tbody=$.tfoot=$.colgroup=$.caption=$.thead,$.th=$.td;function _(a,b){var c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function aa(a,b){for(var c=0,d=a.length;d>c;c++)N.set(a[c],"globalEval",!b||N.get(b[c],"globalEval"))}var ba=/<|&#?\w+;/;function ca(a,b,c,d,e){for(var f,g,h,i,j,k,l=b.createDocumentFragment(),m=[],o=0,p=a.length;p>o;o++)if(f=a[o],f||0===f)if("object"===n.type(f))n.merge(m,f.nodeType?[f]:f);else if(ba.test(f)){g=g||l.appendChild(b.createElement("div")),h=(Y.exec(f)||["",""])[1].toLowerCase(),i=$[h]||$._default,g.innerHTML=i[1]+n.htmlPrefilter(f)+i[2],k=i[0];while(k--)g=g.lastChild;n.merge(m,g.childNodes),g=l.firstChild,g.textContent=""}else m.push(b.createTextNode(f));l.textContent="",o=0;while(f=m[o++])if(d&&n.inArray(f,d)>-1)e&&e.push(f);else if(j=n.contains(f.ownerDocument,f),g=_(l.appendChild(f),"script"),j&&aa(g),c){k=0;while(f=g[k++])Z.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),l.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="<textarea>x</textarea>",l.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var da=/^key/,ea=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,fa=/^([^.]*)(?:\.(.+)|)/;function ga(){return!0}function ha(){return!1}function ia(){try{return d.activeElement}catch(a){}}function ja(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)ja(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=ha;else if(!e)return this;return 1===f&&(g=e,e=function(a){return n().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=n.guid++)),a.each(function(){n.event.add(this,b,e,d,c)})}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=N.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=n.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return"undefined"!=typeof n&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(G)||[""],j=b.length;while(j--)h=fa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o&&(l=n.event.special[o]||{},o=(e?l.delegateType:l.bindType)||o,l=n.event.special[o]||{},k=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},f),(m=i[o])||(m=i[o]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(o,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),n.event.global[o]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=N.hasData(a)&&N.get(a);if(r&&(i=r.events)){b=(b||"").match(G)||[""],j=b.length;while(j--)if(h=fa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=i[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete i[o])}else for(o in i)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(i)&&N.remove(a,"handle events")}},dispatch:function(a){a=n.event.fix(a);var b,c,d,f,g,h=[],i=e.call(arguments),j=(N.get(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())(!a.rnamespace||a.rnamespace.test(g.namespace))&&(a.handleObj=g,a.data=g.data,d=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==d&&(a.result=d)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&("click"!==a.type||isNaN(a.button)||a.button<1))for(;i!==this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>-1:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},props:"altKey bubbles cancelable ctrlKey currentTarget detail eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,e,f,g=b.button;return null==a.pageX&&null!=b.clientX&&(c=a.target.ownerDocument||d,e=c.documentElement,f=c.body,a.pageX=b.clientX+(e&&e.scrollLeft||f&&f.scrollLeft||0)-(e&&e.clientLeft||f&&f.clientLeft||0),a.pageY=b.clientY+(e&&e.scrollTop||f&&f.scrollTop||0)-(e&&e.clientTop||f&&f.clientTop||0)),a.which||void 0===g||(a.which=1&g?1:2&g?3:4&g?2:0),a}},fix:function(a){if(a[n.expando])return a;var b,c,e,f=a.type,g=a,h=this.fixHooks[f];h||(this.fixHooks[f]=h=ea.test(f)?this.mouseHooks:da.test(f)?this.keyHooks:{}),e=h.props?this.props.concat(h.props):this.props,a=new n.Event(g),b=e.length;while(b--)c=e[b],a[c]=g[c];return a.target||(a.target=d),3===a.target.nodeType&&(a.target=a.target.parentNode),h.filter?h.filter(a,g):a},special:{load:{noBubble:!0},focus:{trigger:function(){return this!==ia()&&this.focus?(this.focus(),!1):void 0},delegateType:"focusin"},blur:{trigger:function(){return this===ia()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return"checkbox"===this.type&&this.click&&n.nodeName(this,"input")?(this.click(),!1):void 0},_default:function(a){return n.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}}},n.removeEvent=function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c)},n.Event=function(a,b){return this instanceof n.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?ga:ha):this.type=a,b&&n.extend(this,b),this.timeStamp=a&&a.timeStamp||n.now(),void(this[n.expando]=!0)):new n.Event(a,b)},n.Event.prototype={constructor:n.Event,isDefaultPrevented:ha,isPropagationStopped:ha,isImmediatePropagationStopped:ha,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=ga,a&&a.preventDefault()},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=ga,a&&a.stopPropagation()},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=ga,a&&a.stopImmediatePropagation(),this.stopPropagation()}},n.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){n.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!n.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),n.fn.extend({on:function(a,b,c,d){return ja(this,a,b,c,d)},one:function(a,b,c,d){return ja(this,a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,n(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||"function"==typeof b)&&(c=b,b=void 0),c===!1&&(c=ha),this.each(function(){n.event.remove(this,a,c,b)})}});var ka=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,la=/<script|<style|<link/i,ma=/checked\s*(?:[^=]|=\s*.checked.)/i,na=/^true\/(.*)/,oa=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function pa(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a:a}function qa(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function ra(a){var b=na.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function sa(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(N.hasData(a)&&(f=N.access(a),g=N.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)n.event.add(b,e,j[e][c])}O.hasData(a)&&(h=O.access(a),i=n.extend({},h),O.set(b,i))}}function ta(a,b){var c=b.nodeName.toLowerCase();"input"===c&&X.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}function ua(a,b,c,d){b=f.apply([],b);var e,g,h,i,j,k,m=0,o=a.length,p=o-1,q=b[0],r=n.isFunction(q);if(r||o>1&&"string"==typeof q&&!l.checkClone&&ma.test(q))return a.each(function(e){var f=a.eq(e);r&&(b[0]=q.call(this,e,f.html())),ua(f,b,c,d)});if(o&&(e=ca(b,a[0].ownerDocument,!1,a,d),g=e.firstChild,1===e.childNodes.length&&(e=g),g||d)){for(h=n.map(_(e,"script"),qa),i=h.length;o>m;m++)j=e,m!==p&&(j=n.clone(j,!0,!0),i&&n.merge(h,_(j,"script"))),c.call(a[m],j,m);if(i)for(k=h[h.length-1].ownerDocument,n.map(h,ra),m=0;i>m;m++)j=h[m],Z.test(j.type||"")&&!N.access(j,"globalEval")&&n.contains(k,j)&&(j.src?n._evalUrl&&n._evalUrl(j.src):n.globalEval(j.textContent.replace(oa,"")))}return a}function va(a,b,c){for(var d,e=b?n.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||n.cleanData(_(d)),d.parentNode&&(c&&n.contains(d.ownerDocument,d)&&aa(_(d,"script")),d.parentNode.removeChild(d));return a}n.extend({htmlPrefilter:function(a){return a.replace(ka,"<$1></$2>")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=n.contains(a.ownerDocument,a);if(!(l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(g=_(h),f=_(a),d=0,e=f.length;e>d;d++)ta(f[d],g[d]);if(b)if(c)for(f=f||_(a),g=g||_(h),d=0,e=f.length;e>d;d++)sa(f[d],g[d]);else sa(a,h);return g=_(h,"script"),g.length>0&&aa(g,!i&&_(a,"script")),h},cleanData:function(a){for(var b,c,d,e=n.event.special,f=0;void 0!==(c=a[f]);f++)if(L(c)){if(b=c[N.expando]){if(b.events)for(d in b.events)e[d]?n.event.remove(c,d):n.removeEvent(c,d,b.handle);c[N.expando]=void 0}c[O.expando]&&(c[O.expando]=void 0)}}}),n.fn.extend({domManip:ua,detach:function(a){return va(this,a,!0)},remove:function(a){return va(this,a)},text:function(a){return K(this,function(a){return void 0===a?n.text(this):this.empty().each(function(){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&(this.textContent=a)})},null,a,arguments.length)},append:function(){return ua(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=pa(this,a);b.appendChild(a)}})},prepend:function(){return ua(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=pa(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return ua(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return ua(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(n.cleanData(_(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return K(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!la.test(a)&&!$[(Y.exec(a)||["",""])[1].toLowerCase()]){a=n.htmlPrefilter(a);try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(_(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return ua(this,arguments,function(b){var c=this.parentNode;n.inArray(this,a)<0&&(n.cleanData(_(this)),c&&c.replaceChild(b,this))},a)}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=[],e=n(a),f=e.length-1,h=0;f>=h;h++)c=h===f?this:this.clone(!0),n(e[h])[b](c),g.apply(d,c.get());return this.pushStack(d)}});var wa,xa={HTML:"block",BODY:"block"};function ya(a,b){var c=n(b.createElement(a)).appendTo(b.body),d=n.css(c[0],"display");return c.detach(),d}function za(a){var b=d,c=xa[a];return c||(c=ya(a,b),"none"!==c&&c||(wa=(wa||n("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=wa[0].contentDocument,b.write(),b.close(),c=ya(a,b),wa.detach()),xa[a]=c),c}var Aa=/^margin/,Ba=new RegExp("^("+S+")(?!px)[a-z%]+$","i"),Ca=function(b){var c=b.ownerDocument.defaultView;return c.opener||(c=a),c.getComputedStyle(b)},Da=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e},Ea=d.documentElement;!function(){var b,c,e,f,g=d.createElement("div"),h=d.createElement("div");if(h.style){h.style.backgroundClip="content-box",h.cloneNode(!0).style.backgroundClip="",l.clearCloneStyle="content-box"===h.style.backgroundClip,g.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",g.appendChild(h);function i(){h.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",h.innerHTML="",Ea.appendChild(g);var d=a.getComputedStyle(h);b="1%"!==d.top,f="2px"===d.marginLeft,c="4px"===d.width,h.style.marginRight="50%",e="4px"===d.marginRight,Ea.removeChild(g)}n.extend(l,{pixelPosition:function(){return i(),b},boxSizingReliable:function(){return null==c&&i(),c},pixelMarginRight:function(){return null==c&&i(),e},reliableMarginLeft:function(){return null==c&&i(),f},reliableMarginRight:function(){var b,c=h.appendChild(d.createElement("div"));return c.style.cssText=h.style.cssText="-webkit-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",c.style.marginRight=c.style.width="0",h.style.width="1px",Ea.appendChild(g),b=!parseFloat(a.getComputedStyle(c).marginRight),Ea.removeChild(g),h.removeChild(c),b}})}}();function Fa(a,b,c){var d,e,f,g,h=a.style;return c=c||Ca(a),c&&(g=c.getPropertyValue(b)||c[b],""!==g||n.contains(a.ownerDocument,a)||(g=n.style(a,b)),!l.pixelMarginRight()&&Ba.test(g)&&Aa.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0!==g?g+"":g}function Ga(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}var Ha=/^(none|table(?!-c[ea]).+)/,Ia={position:"absolute",visibility:"hidden",display:"block"},Ja={letterSpacing:"0",fontWeight:"400"},Ka=["Webkit","O","Moz","ms"],La=d.createElement("div").style;function Ma(a){if(a in La)return a;var b=a[0].toUpperCase()+a.slice(1),c=Ka.length;while(c--)if(a=Ka[c]+b,a in La)return a}function Na(a,b,c){var d=T.exec(b);return d?Math.max(0,d[2]-(c||0))+(d[3]||"px"):b}function Oa(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=n.css(a,c+U[f],!0,e)),d?("content"===c&&(g-=n.css(a,"padding"+U[f],!0,e)),"margin"!==c&&(g-=n.css(a,"border"+U[f]+"Width",!0,e))):(g+=n.css(a,"padding"+U[f],!0,e),"padding"!==c&&(g+=n.css(a,"border"+U[f]+"Width",!0,e)));return g}function Pa(b,c,e){var f=!0,g="width"===c?b.offsetWidth:b.offsetHeight,h=Ca(b),i="border-box"===n.css(b,"boxSizing",!1,h);if(d.msFullscreenElement&&a.top!==a&&b.getClientRects().length&&(g=Math.round(100*b.getBoundingClientRect()[c])),0>=g||null==g){if(g=Fa(b,c,h),(0>g||null==g)&&(g=b.style[c]),Ba.test(g))return g;f=i&&(l.boxSizingReliable()||g===b.style[c]),g=parseFloat(g)||0}return g+Oa(b,c,e||(i?"border":"content"),f,h)+"px"}function Qa(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=N.get(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&V(d)&&(f[g]=N.access(d,"olddisplay",za(d.nodeName)))):(e=V(d),"none"===c&&e||N.set(d,"olddisplay",e?c:n.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}n.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Fa(a,"opacity");return""===c?"1":c}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=n.camelCase(b),i=a.style;return b=n.cssProps[h]||(n.cssProps[h]=Ma(h)||h),g=n.cssHooks[b]||n.cssHooks[h],void 0===c?g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b]:(f=typeof c,"string"===f&&(e=T.exec(c))&&e[1]&&(c=W(a,b,e),f="number"),null!=c&&c===c&&("number"===f&&(c+=e&&e[3]||(n.cssNumber[h]?"":"px")),l.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),g&&"set"in g&&void 0===(c=g.set(a,c,d))||(i[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=n.camelCase(b);return b=n.cssProps[h]||(n.cssProps[h]=Ma(h)||h),g=n.cssHooks[b]||n.cssHooks[h],g&&"get"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=Fa(a,b,d)),"normal"===e&&b in Ja&&(e=Ja[b]),""===c||c?(f=parseFloat(e),c===!0||isFinite(f)?f||0:e):e}}),n.each(["height","width"],function(a,b){n.cssHooks[b]={get:function(a,c,d){return c?Ha.test(n.css(a,"display"))&&0===a.offsetWidth?Da(a,Ia,function(){return Pa(a,b,d)}):Pa(a,b,d):void 0},set:function(a,c,d){var e,f=d&&Ca(a),g=d&&Oa(a,b,d,"border-box"===n.css(a,"boxSizing",!1,f),f);return g&&(e=T.exec(c))&&"px"!==(e[3]||"px")&&(a.style[b]=c,c=n.css(a,b)),Na(a,c,g)}}}),n.cssHooks.marginLeft=Ga(l.reliableMarginLeft,function(a,b){return b?(parseFloat(Fa(a,"marginLeft"))||a.getBoundingClientRect().left-Da(a,{marginLeft:0},function(){return a.getBoundingClientRect().left}))+"px":void 0}),n.cssHooks.marginRight=Ga(l.reliableMarginRight,function(a,b){return b?Da(a,{display:"inline-block"},Fa,[a,"marginRight"]):void 0}),n.each({margin:"",padding:"",border:"Width"},function(a,b){n.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+U[d]+b]=f[d]||f[d-2]||f[0];return e}},Aa.test(a)||(n.cssHooks[a+b].set=Na)}),n.fn.extend({css:function(a,b){return K(this,function(a,b,c){var d,e,f={},g=0;if(n.isArray(b)){for(d=Ca(a),e=b.length;e>g;g++)f[b[g]]=n.css(a,b[g],!1,d);return f}return void 0!==c?n.style(a,b,c):n.css(a,b)},a,b,arguments.length>1)},show:function(){return Qa(this,!0)},hide:function(){return Qa(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){V(this)?n(this).show():n(this).hide()})}});function Ra(a,b,c,d,e){return new Ra.prototype.init(a,b,c,d,e)}n.Tween=Ra,Ra.prototype={constructor:Ra,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||n.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(n.cssNumber[c]?"":"px")},cur:function(){var a=Ra.propHooks[this.prop];return a&&a.get?a.get(this):Ra.propHooks._default.get(this)},run:function(a){var b,c=Ra.propHooks[this.prop];return this.options.duration?this.pos=b=n.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Ra.propHooks._default.set(this),this}},Ra.prototype.init.prototype=Ra.prototype,Ra.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=n.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){n.fx.step[a.prop]?n.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[n.cssProps[a.prop]]&&!n.cssHooks[a.prop]?a.elem[a.prop]=a.now:n.style(a.elem,a.prop,a.now+a.unit)}}},Ra.propHooks.scrollTop=Ra.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},n.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},n.fx=Ra.prototype.init,n.fx.step={};var Sa,Ta,Ua=/^(?:toggle|show|hide)$/,Va=/queueHooks$/;function Wa(){return a.setTimeout(function(){Sa=void 0}),Sa=n.now()}function Xa(a,b){var c,d=0,e={height:a};for(b=b?1:0;4>d;d+=2-b)c=U[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function Ya(a,b,c){for(var d,e=(_a.tweeners[b]||[]).concat(_a.tweeners["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function Za(a,b,c){var d,e,f,g,h,i,j,k,l=this,m={},o=a.style,p=a.nodeType&&V(a),q=N.get(a,"fxshow");c.queue||(h=n._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,l.always(function(){l.always(function(){h.unqueued--,n.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[o.overflow,o.overflowX,o.overflowY],j=n.css(a,"display"),k="none"===j?N.get(a,"olddisplay")||za(a.nodeName):j,"inline"===k&&"none"===n.css(a,"float")&&(o.display="inline-block")),c.overflow&&(o.overflow="hidden",l.always(function(){o.overflow=c.overflow[0],o.overflowX=c.overflow[1],o.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],Ua.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(p?"hide":"show")){if("show"!==e||!q||void 0===q[d])continue;p=!0}m[d]=q&&q[d]||n.style(a,d)}else j=void 0;if(n.isEmptyObject(m))"inline"===("none"===j?za(a.nodeName):j)&&(o.display=j);else{q?"hidden"in q&&(p=q.hidden):q=N.access(a,"fxshow",{}),f&&(q.hidden=!p),p?n(a).show():l.done(function(){n(a).hide()}),l.done(function(){var b;N.remove(a,"fxshow");for(b in m)n.style(a,b,m[b])});for(d in m)g=Ya(p?q[d]:0,d,l),d in q||(q[d]=g.start,p&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function $a(a,b){var c,d,e,f,g;for(c in a)if(d=n.camelCase(c),e=b[d],f=a[c],n.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=n.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function _a(a,b,c){var d,e,f=0,g=_a.prefilters.length,h=n.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=Sa||Wa(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:n.extend({},b),opts:n.extend(!0,{specialEasing:{},easing:n.easing._default},c),originalProperties:b,originalOptions:c,startTime:Sa||Wa(),duration:c.duration,tweens:[],createTween:function(b,c){var d=n.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?(h.notifyWith(a,[j,1,0]),h.resolveWith(a,[j,b])):h.rejectWith(a,[j,b]),this}}),k=j.props;for($a(k,j.opts.specialEasing);g>f;f++)if(d=_a.prefilters[f].call(j,a,k,j.opts))return n.isFunction(d.stop)&&(n._queueHooks(j.elem,j.opts.queue).stop=n.proxy(d.stop,d)),d;return n.map(k,Ya,j),n.isFunction(j.opts.start)&&j.opts.start.call(a,j),n.fx.timer(n.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}n.Animation=n.extend(_a,{tweeners:{"*":[function(a,b){var c=this.createTween(a,b);return W(c.elem,a,T.exec(b),c),c}]},tweener:function(a,b){n.isFunction(a)?(b=a,a=["*"]):a=a.match(G);for(var c,d=0,e=a.length;e>d;d++)c=a[d],_a.tweeners[c]=_a.tweeners[c]||[],_a.tweeners[c].unshift(b)},prefilters:[Za],prefilter:function(a,b){b?_a.prefilters.unshift(a):_a.prefilters.push(a)}}),n.speed=function(a,b,c){var d=a&&"object"==typeof a?n.extend({},a):{complete:c||!c&&b||n.isFunction(a)&&a,duration:a,easing:c&&b||b&&!n.isFunction(b)&&b};return d.duration=n.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in n.fx.speeds?n.fx.speeds[d.duration]:n.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){n.isFunction(d.old)&&d.old.call(this),d.queue&&n.dequeue(this,d.queue)},d},n.fn.extend({fadeTo:function(a,b,c,d){return this.filter(V).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=n.isEmptyObject(a),f=n.speed(b,c,d),g=function(){var b=_a(this,n.extend({},a),f);(e||N.get(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=n.timers,g=N.get(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&Va.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&n.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=N.get(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=n.timers,g=d?d.length:0;for(c.finish=!0,n.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),n.each(["toggle","show","hide"],function(a,b){var c=n.fn[b];n.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(Xa(b,!0),a,d,e)}}),n.each({slideDown:Xa("show"),slideUp:Xa("hide"),slideToggle:Xa("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){n.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),n.timers=[],n.fx.tick=function(){var a,b=0,c=n.timers;for(Sa=n.now();b<c.length;b++)a=c[b],a()||c[b]!==a||c.splice(b--,1);c.length||n.fx.stop(),Sa=void 0},n.fx.timer=function(a){n.timers.push(a),a()?n.fx.start():n.timers.pop()},n.fx.interval=13,n.fx.start=function(){Ta||(Ta=a.setInterval(n.fx.tick,n.fx.interval))},n.fx.stop=function(){a.clearInterval(Ta),Ta=null},n.fx.speeds={slow:600,fast:200,_default:400},n.fn.delay=function(b,c){return b=n.fx?n.fx.speeds[b]||b:b,c=c||"fx",this.queue(c,function(c,d){var e=a.setTimeout(c,b);d.stop=function(){a.clearTimeout(e)}})},function(){var a=d.createElement("input"),b=d.createElement("select"),c=b.appendChild(d.createElement("option"));a.type="checkbox",l.checkOn=""!==a.value,l.optSelected=c.selected,b.disabled=!0,l.optDisabled=!c.disabled,a=d.createElement("input"),a.value="t",a.type="radio",l.radioValue="t"===a.value}();var ab,bb=n.expr.attrHandle;n.fn.extend({attr:function(a,b){return K(this,n.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){n.removeAttr(this,a)})}}),n.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?n.prop(a,b,c):(1===f&&n.isXMLDoc(a)||(b=b.toLowerCase(),e=n.attrHooks[b]||(n.expr.match.bool.test(b)?ab:void 0)),void 0!==c?null===c?void n.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=n.find.attr(a,b),null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!l.radioValue&&"radio"===b&&n.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(G);if(f&&1===a.nodeType)while(c=f[e++])d=n.propFix[c]||c,n.expr.match.bool.test(c)&&(a[d]=!1),a.removeAttribute(c)}}),ab={set:function(a,b,c){return b===!1?n.removeAttr(a,c):a.setAttribute(c,c),c}},n.each(n.expr.match.bool.source.match(/\w+/g),function(a,b){var c=bb[b]||n.find.attr;bb[b]=function(a,b,d){var e,f;return d||(f=bb[b],bb[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,bb[b]=f),e}});var cb=/^(?:input|select|textarea|button)$/i,db=/^(?:a|area)$/i;n.fn.extend({prop:function(a,b){return K(this,n.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[n.propFix[a]||a]})}}),n.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&n.isXMLDoc(a)||(b=n.propFix[b]||b,e=n.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b];
+},propHooks:{tabIndex:{get:function(a){var b=n.find.attr(a,"tabindex");return b?parseInt(b,10):cb.test(a.nodeName)||db.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),l.optSelected||(n.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null}}),n.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){n.propFix[this.toLowerCase()]=this});var eb=/[\t\r\n\f]/g;function fb(a){return a.getAttribute&&a.getAttribute("class")||""}n.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(n.isFunction(a))return this.each(function(b){n(this).addClass(a.call(this,b,fb(this)))});if("string"==typeof a&&a){b=a.match(G)||[];while(c=this[i++])if(e=fb(c),d=1===c.nodeType&&(" "+e+" ").replace(eb," ")){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=n.trim(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(n.isFunction(a))return this.each(function(b){n(this).removeClass(a.call(this,b,fb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(G)||[];while(c=this[i++])if(e=fb(c),d=1===c.nodeType&&(" "+e+" ").replace(eb," ")){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=n.trim(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):n.isFunction(a)?this.each(function(c){n(this).toggleClass(a.call(this,c,fb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=n(this),f=a.match(G)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(void 0===a||"boolean"===c)&&(b=fb(this),b&&N.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":N.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+fb(c)+" ").replace(eb," ").indexOf(b)>-1)return!0;return!1}});var gb=/\r/g;n.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=n.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,n(this).val()):a,null==e?e="":"number"==typeof e?e+="":n.isArray(e)&&(e=n.map(e,function(a){return null==a?"":a+""})),b=n.valHooks[this.type]||n.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=n.valHooks[e.type]||n.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(gb,""):null==c?"":c)}}}),n.extend({valHooks:{option:{get:function(a){return n.trim(a.value)}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],(c.selected||i===e)&&(l.optDisabled?!c.disabled:null===c.getAttribute("disabled"))&&(!c.parentNode.disabled||!n.nodeName(c.parentNode,"optgroup"))){if(b=n(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=n.makeArray(b),g=e.length;while(g--)d=e[g],(d.selected=n.inArray(n.valHooks.option.get(d),f)>-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),n.each(["radio","checkbox"],function(){n.valHooks[this]={set:function(a,b){return n.isArray(b)?a.checked=n.inArray(n(a).val(),b)>-1:void 0}},l.checkOn||(n.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var hb=/^(?:focusinfocus|focusoutblur)$/;n.extend(n.event,{trigger:function(b,c,e,f){var g,h,i,j,l,m,o,p=[e||d],q=k.call(b,"type")?b.type:b,r=k.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!hb.test(q+n.event.triggered)&&(q.indexOf(".")>-1&&(r=q.split("."),q=r.shift(),r.sort()),l=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=r.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:n.makeArray(c,[b]),o=n.event.special[q]||{},f||!o.trigger||o.trigger.apply(e,c)!==!1)){if(!f&&!o.noBubble&&!n.isWindow(e)){for(j=o.delegateType||q,hb.test(j+q)||(h=h.parentNode);h;h=h.parentNode)p.push(h),i=h;i===(e.ownerDocument||d)&&p.push(i.defaultView||i.parentWindow||a)}g=0;while((h=p[g++])&&!b.isPropagationStopped())b.type=g>1?j:o.bindType||q,m=(N.get(h,"events")||{})[b.type]&&N.get(h,"handle"),m&&m.apply(h,c),m=l&&h[l],m&&m.apply&&L(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=q,f||b.isDefaultPrevented()||o._default&&o._default.apply(p.pop(),c)!==!1||!L(e)||l&&n.isFunction(e[q])&&!n.isWindow(e)&&(i=e[l],i&&(e[l]=null),n.event.triggered=q,e[q](),n.event.triggered=void 0,i&&(e[l]=i)),b.result}},simulate:function(a,b,c){var d=n.extend(new n.Event,c,{type:a,isSimulated:!0});n.event.trigger(d,null,b),d.isDefaultPrevented()&&c.preventDefault()}}),n.fn.extend({trigger:function(a,b){return this.each(function(){n.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?n.event.trigger(a,b,c,!0):void 0}}),n.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){n.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),n.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),l.focusin="onfocusin"in a,l.focusin||n.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){n.event.simulate(b,a.target,n.event.fix(a))};n.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=N.access(d,b);e||d.addEventListener(a,c,!0),N.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=N.access(d,b)-1;e?N.access(d,b,e):(d.removeEventListener(a,c,!0),N.remove(d,b))}}});var ib=a.location,jb=n.now(),kb=/\?/;n.parseJSON=function(a){return JSON.parse(a+"")},n.parseXML=function(b){var c;if(!b||"string"!=typeof b)return null;try{c=(new a.DOMParser).parseFromString(b,"text/xml")}catch(d){c=void 0}return(!c||c.getElementsByTagName("parsererror").length)&&n.error("Invalid XML: "+b),c};var lb=/#.*$/,mb=/([?&])_=[^&]*/,nb=/^(.*?):[ \t]*([^\r\n]*)$/gm,ob=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,pb=/^(?:GET|HEAD)$/,qb=/^\/\//,rb={},sb={},tb="*/".concat("*"),ub=d.createElement("a");ub.href=ib.href;function vb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(G)||[];if(n.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function wb(a,b,c,d){var e={},f=a===sb;function g(h){var i;return e[h]=!0,n.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function xb(a,b){var c,d,e=n.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&n.extend(!0,a,d),a}function yb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function zb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}n.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:ib.href,type:"GET",isLocal:ob.test(ib.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":tb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":n.parseJSON,"text xml":n.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?xb(xb(a,n.ajaxSettings),b):xb(n.ajaxSettings,a)},ajaxPrefilter:vb(rb),ajaxTransport:vb(sb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var e,f,g,h,i,j,k,l,m=n.ajaxSetup({},c),o=m.context||m,p=m.context&&(o.nodeType||o.jquery)?n(o):n.event,q=n.Deferred(),r=n.Callbacks("once memory"),s=m.statusCode||{},t={},u={},v=0,w="canceled",x={readyState:0,getResponseHeader:function(a){var b;if(2===v){if(!h){h={};while(b=nb.exec(g))h[b[1].toLowerCase()]=b[2]}b=h[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===v?g:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return v||(a=u[c]=u[c]||a,t[a]=b),this},overrideMimeType:function(a){return v||(m.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>v)for(b in a)s[b]=[s[b],a[b]];else x.always(a[x.status]);return this},abort:function(a){var b=a||w;return e&&e.abort(b),z(0,b),this}};if(q.promise(x).complete=r.add,x.success=x.done,x.error=x.fail,m.url=((b||m.url||ib.href)+"").replace(lb,"").replace(qb,ib.protocol+"//"),m.type=c.method||c.type||m.method||m.type,m.dataTypes=n.trim(m.dataType||"*").toLowerCase().match(G)||[""],null==m.crossDomain){j=d.createElement("a");try{j.href=m.url,j.href=j.href,m.crossDomain=ub.protocol+"//"+ub.host!=j.protocol+"//"+j.host}catch(y){m.crossDomain=!0}}if(m.data&&m.processData&&"string"!=typeof m.data&&(m.data=n.param(m.data,m.traditional)),wb(rb,m,c,x),2===v)return x;k=n.event&&m.global,k&&0===n.active++&&n.event.trigger("ajaxStart"),m.type=m.type.toUpperCase(),m.hasContent=!pb.test(m.type),f=m.url,m.hasContent||(m.data&&(f=m.url+=(kb.test(f)?"&":"?")+m.data,delete m.data),m.cache===!1&&(m.url=mb.test(f)?f.replace(mb,"$1_="+jb++):f+(kb.test(f)?"&":"?")+"_="+jb++)),m.ifModified&&(n.lastModified[f]&&x.setRequestHeader("If-Modified-Since",n.lastModified[f]),n.etag[f]&&x.setRequestHeader("If-None-Match",n.etag[f])),(m.data&&m.hasContent&&m.contentType!==!1||c.contentType)&&x.setRequestHeader("Content-Type",m.contentType),x.setRequestHeader("Accept",m.dataTypes[0]&&m.accepts[m.dataTypes[0]]?m.accepts[m.dataTypes[0]]+("*"!==m.dataTypes[0]?", "+tb+"; q=0.01":""):m.accepts["*"]);for(l in m.headers)x.setRequestHeader(l,m.headers[l]);if(m.beforeSend&&(m.beforeSend.call(o,x,m)===!1||2===v))return x.abort();w="abort";for(l in{success:1,error:1,complete:1})x[l](m[l]);if(e=wb(sb,m,c,x)){if(x.readyState=1,k&&p.trigger("ajaxSend",[x,m]),2===v)return x;m.async&&m.timeout>0&&(i=a.setTimeout(function(){x.abort("timeout")},m.timeout));try{v=1,e.send(t,z)}catch(y){if(!(2>v))throw y;z(-1,y)}}else z(-1,"No Transport");function z(b,c,d,h){var j,l,t,u,w,y=c;2!==v&&(v=2,i&&a.clearTimeout(i),e=void 0,g=h||"",x.readyState=b>0?4:0,j=b>=200&&300>b||304===b,d&&(u=yb(m,x,d)),u=zb(m,u,x,j),j?(m.ifModified&&(w=x.getResponseHeader("Last-Modified"),w&&(n.lastModified[f]=w),w=x.getResponseHeader("etag"),w&&(n.etag[f]=w)),204===b||"HEAD"===m.type?y="nocontent":304===b?y="notmodified":(y=u.state,l=u.data,t=u.error,j=!t)):(t=y,(b||!y)&&(y="error",0>b&&(b=0))),x.status=b,x.statusText=(c||y)+"",j?q.resolveWith(o,[l,y,x]):q.rejectWith(o,[x,y,t]),x.statusCode(s),s=void 0,k&&p.trigger(j?"ajaxSuccess":"ajaxError",[x,m,j?l:t]),r.fireWith(o,[x,y]),k&&(p.trigger("ajaxComplete",[x,m]),--n.active||n.event.trigger("ajaxStop")))}return x},getJSON:function(a,b,c){return n.get(a,b,c,"json")},getScript:function(a,b){return n.get(a,void 0,b,"script")}}),n.each(["get","post"],function(a,b){n[b]=function(a,c,d,e){return n.isFunction(c)&&(e=e||d,d=c,c=void 0),n.ajax(n.extend({url:a,type:b,dataType:e,data:c,success:d},n.isPlainObject(a)&&a))}}),n._evalUrl=function(a){return n.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},n.fn.extend({wrapAll:function(a){var b;return n.isFunction(a)?this.each(function(b){n(this).wrapAll(a.call(this,b))}):(this[0]&&(b=n(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this)},wrapInner:function(a){return n.isFunction(a)?this.each(function(b){n(this).wrapInner(a.call(this,b))}):this.each(function(){var b=n(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=n.isFunction(a);return this.each(function(c){n(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){n.nodeName(this,"body")||n(this).replaceWith(this.childNodes)}).end()}}),n.expr.filters.hidden=function(a){return!n.expr.filters.visible(a)},n.expr.filters.visible=function(a){return a.offsetWidth>0||a.offsetHeight>0||a.getClientRects().length>0};var Ab=/%20/g,Bb=/\[\]$/,Cb=/\r?\n/g,Db=/^(?:submit|button|image|reset|file)$/i,Eb=/^(?:input|select|textarea|keygen)/i;function Fb(a,b,c,d){var e;if(n.isArray(b))n.each(b,function(b,e){c||Bb.test(a)?d(a,e):Fb(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==n.type(b))d(a,b);else for(e in b)Fb(a+"["+e+"]",b[e],c,d)}n.param=function(a,b){var c,d=[],e=function(a,b){b=n.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=n.ajaxSettings&&n.ajaxSettings.traditional),n.isArray(a)||a.jquery&&!n.isPlainObject(a))n.each(a,function(){e(this.name,this.value)});else for(c in a)Fb(c,a[c],b,e);return d.join("&").replace(Ab,"+")},n.fn.extend({serialize:function(){return n.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=n.prop(this,"elements");return a?n.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!n(this).is(":disabled")&&Eb.test(this.nodeName)&&!Db.test(a)&&(this.checked||!X.test(a))}).map(function(a,b){var c=n(this).val();return null==c?null:n.isArray(c)?n.map(c,function(a){return{name:b.name,value:a.replace(Cb,"\r\n")}}):{name:b.name,value:c.replace(Cb,"\r\n")}}).get()}}),n.ajaxSettings.xhr=function(){try{return new a.XMLHttpRequest}catch(b){}};var Gb={0:200,1223:204},Hb=n.ajaxSettings.xhr();l.cors=!!Hb&&"withCredentials"in Hb,l.ajax=Hb=!!Hb,n.ajaxTransport(function(b){var c,d;return l.cors||Hb&&!b.crossDomain?{send:function(e,f){var g,h=b.xhr();if(h.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(g in b.xhrFields)h[g]=b.xhrFields[g];b.mimeType&&h.overrideMimeType&&h.overrideMimeType(b.mimeType),b.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest");for(g in e)h.setRequestHeader(g,e[g]);c=function(a){return function(){c&&(c=d=h.onload=h.onerror=h.onabort=h.onreadystatechange=null,"abort"===a?h.abort():"error"===a?"number"!=typeof h.status?f(0,"error"):f(h.status,h.statusText):f(Gb[h.status]||h.status,h.statusText,"text"!==(h.responseType||"text")||"string"!=typeof h.responseText?{binary:h.response}:{text:h.responseText},h.getAllResponseHeaders()))}},h.onload=c(),d=h.onerror=c("error"),void 0!==h.onabort?h.onabort=d:h.onreadystatechange=function(){4===h.readyState&&a.setTimeout(function(){c&&d()})},c=c("abort");try{h.send(b.hasContent&&b.data||null)}catch(i){if(c)throw i}},abort:function(){c&&c()}}:void 0}),n.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return n.globalEval(a),a}}}),n.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),n.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(e,f){b=n("<script>").prop({charset:a.scriptCharset,src:a.url}).on("load error",c=function(a){b.remove(),c=null,a&&f("error"===a.type?404:200,a.type)}),d.head.appendChild(b[0])},abort:function(){c&&c()}}}});var Ib=[],Jb=/(=)\?(?=&|$)|\?\?/;n.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=Ib.pop()||n.expando+"_"+jb++;return this[a]=!0,a}}),n.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(Jb.test(b.url)?"url":"string"==typeof b.data&&0===(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&Jb.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=n.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(Jb,"$1"+e):b.jsonp!==!1&&(b.url+=(kb.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||n.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){void 0===f?n(a).removeProp(e):a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,Ib.push(e)),g&&n.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),l.createHTMLDocument=function(){var a=d.implementation.createHTMLDocument("").body;return a.innerHTML="<form></form><form></form>",2===a.childNodes.length}(),n.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||(l.createHTMLDocument?d.implementation.createHTMLDocument(""):d);var e=x.exec(a),f=!c&&[];return e?[b.createElement(e[1])]:(e=ca([a],b,f),f&&f.length&&n(f).remove(),n.merge([],e.childNodes))};var Kb=n.fn.load;n.fn.load=function(a,b,c){if("string"!=typeof a&&Kb)return Kb.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>-1&&(d=n.trim(a.slice(h)),a=a.slice(0,h)),n.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&n.ajax({url:a,type:e||"GET",dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?n("<div>").append(n.parseHTML(a)).find(d):a)}).always(c&&function(a,b){g.each(function(){c.apply(g,f||[a.responseText,b,a])})}),this},n.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){n.fn[b]=function(a){return this.on(b,a)}}),n.expr.filters.animated=function(a){return n.grep(n.timers,function(b){return a===b.elem}).length};function Lb(a){return n.isWindow(a)?a:9===a.nodeType&&a.defaultView}n.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=n.css(a,"position"),l=n(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=n.css(a,"top"),i=n.css(a,"left"),j=("absolute"===k||"fixed"===k)&&(f+i).indexOf("auto")>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),n.isFunction(b)&&(b=b.call(a,c,n.extend({},h))),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},n.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){n.offset.setOffset(this,a,b)});var b,c,d=this[0],e={top:0,left:0},f=d&&d.ownerDocument;if(f)return b=f.documentElement,n.contains(b,d)?(e=d.getBoundingClientRect(),c=Lb(f),{top:e.top+c.pageYOffset-b.clientTop,left:e.left+c.pageXOffset-b.clientLeft}):e},position:function(){if(this[0]){var a,b,c=this[0],d={top:0,left:0};return"fixed"===n.css(c,"position")?b=c.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),n.nodeName(a[0],"html")||(d=a.offset()),d.top+=n.css(a[0],"borderTopWidth",!0)-a.scrollTop(),d.left+=n.css(a[0],"borderLeftWidth",!0)-a.scrollLeft()),{top:b.top-d.top-n.css(c,"marginTop",!0),left:b.left-d.left-n.css(c,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent;while(a&&"static"===n.css(a,"position"))a=a.offsetParent;return a||Ea})}}),n.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c="pageYOffset"===b;n.fn[a]=function(d){return K(this,function(a,d,e){var f=Lb(a);return void 0===e?f?f[b]:a[d]:void(f?f.scrollTo(c?f.pageXOffset:e,c?e:f.pageYOffset):a[d]=e)},a,d,arguments.length)}}),n.each(["top","left"],function(a,b){n.cssHooks[b]=Ga(l.pixelPosition,function(a,c){return c?(c=Fa(a,b),Ba.test(c)?n(a).position()[b]+"px":c):void 0})}),n.each({Height:"height",Width:"width"},function(a,b){n.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){n.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return K(this,function(b,c,d){var e;return n.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?n.css(b,c,g):n.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),n.fn.extend({bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)},size:function(){return this.length}}),n.fn.andSelf=n.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return n});var Mb=a.jQuery,Nb=a.$;return n.noConflict=function(b){return a.$===n&&(a.$=Nb),b&&a.jQuery===n&&(a.jQuery=Mb),n},b||(a.jQuery=a.$=n),n});
diff --git a/webapp/org.eclipse.sensinact.studio.webapp.outdoor/webapp/js/leaflet-src.js b/webapp/org.eclipse.sensinact.studio.webapp.outdoor/webapp/js/leaflet-src.js
new file mode 100644
index 0000000..721ddfb
--- /dev/null
+++ b/webapp/org.eclipse.sensinact.studio.webapp.outdoor/webapp/js/leaflet-src.js
@@ -0,0 +1,9168 @@
+/*
+ Leaflet, a JavaScript library for mobile-friendly interactive maps. http://leafletjs.com
+ (c) 2010-2013, Vladimir Agafonkin
+ (c) 2010-2011, CloudMade
+*/
+(function (window, document, undefined) {
+var oldL = window.L,
+ L = {};
+
+L.version = '0.7.7';
+
+// define Leaflet for Node module pattern loaders, including Browserify
+if (typeof module === 'object' && typeof module.exports === 'object') {
+ module.exports = L;
+
+// define Leaflet as an AMD module
+} else if (typeof define === 'function' && define.amd) {
+ define(L);
+}
+
+// define Leaflet as a global L variable, saving the original L to restore later if needed
+
+L.noConflict = function () {
+ window.L = oldL;
+ return this;
+};
+
+window.L = L;
+
+
+/*
+ * L.Util contains various utility functions used throughout Leaflet code.
+ */
+
+L.Util = {
+ extend: function (dest) { // (Object[, Object, ...]) ->
+ var sources = Array.prototype.slice.call(arguments, 1),
+ i, j, len, src;
+
+ for (j = 0, len = sources.length; j < len; j++) {
+ src = sources[j] || {};
+ for (i in src) {
+ if (src.hasOwnProperty(i)) {
+ dest[i] = src[i];
+ }
+ }
+ }
+ return dest;
+ },
+
+ bind: function (fn, obj) { // (Function, Object) -> Function
+ var args = arguments.length > 2 ? Array.prototype.slice.call(arguments, 2) : null;
+ return function () {
+ return fn.apply(obj, args || arguments);
+ };
+ },
+
+ stamp: (function () {
+ var lastId = 0,
+ key = '_leaflet_id';
+ return function (obj) {
+ obj[key] = obj[key] || ++lastId;
+ return obj[key];
+ };
+ }()),
+
+ invokeEach: function (obj, method, context) {
+ var i, args;
+
+ if (typeof obj === 'object') {
+ args = Array.prototype.slice.call(arguments, 3);
+
+ for (i in obj) {
+ method.apply(context, [i, obj[i]].concat(args));
+ }
+ return true;
+ }
+
+ return false;
+ },
+
+ limitExecByInterval: function (fn, time, context) {
+ var lock, execOnUnlock;
+
+ return function wrapperFn() {
+ var args = arguments;
+
+ if (lock) {
+ execOnUnlock = true;
+ return;
+ }
+
+ lock = true;
+
+ setTimeout(function () {
+ lock = false;
+
+ if (execOnUnlock) {
+ wrapperFn.apply(context, args);
+ execOnUnlock = false;
+ }
+ }, time);
+
+ fn.apply(context, args);
+ };
+ },
+
+ falseFn: function () {
+ return false;
+ },
+
+ formatNum: function (num, digits) {
+ var pow = Math.pow(10, digits || 5);
+ return Math.round(num * pow) / pow;
+ },
+
+ trim: function (str) {
+ return str.trim ? str.trim() : str.replace(/^\s+|\s+$/g, '');
+ },
+
+ splitWords: function (str) {
+ return L.Util.trim(str).split(/\s+/);
+ },
+
+ setOptions: function (obj, options) {
+ obj.options = L.extend({}, obj.options, options);
+ return obj.options;
+ },
+
+ getParamString: function (obj, existingUrl, uppercase) {
+ var params = [];
+ for (var i in obj) {
+ params.push(encodeURIComponent(uppercase ? i.toUpperCase() : i) + '=' + encodeURIComponent(obj[i]));
+ }
+ return ((!existingUrl || existingUrl.indexOf('?') === -1) ? '?' : '&') + params.join('&');
+ },
+ template: function (str, data) {
+ return str.replace(/\{ *([\w_]+) *\}/g, function (str, key) {
+ var value = data[key];
+ if (value === undefined) {
+ throw new Error('No value provided for variable ' + str);
+ } else if (typeof value === 'function') {
+ value = value(data);
+ }
+ return value;
+ });
+ },
+
+ isArray: Array.isArray || function (obj) {
+ return (Object.prototype.toString.call(obj) === '[object Array]');
+ },
+
+ emptyImageUrl: 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs='
+};
+
+(function () {
+
+ // inspired by http://paulirish.com/2011/requestanimationframe-for-smart-animating/
+
+ function getPrefixed(name) {
+ var i, fn,
+ prefixes = ['webkit', 'moz', 'o', 'ms'];
+
+ for (i = 0; i < prefixes.length && !fn; i++) {
+ fn = window[prefixes[i] + name];
+ }
+
+ return fn;
+ }
+
+ var lastTime = 0;
+
+ function timeoutDefer(fn) {
+ var time = +new Date(),
+ timeToCall = Math.max(0, 16 - (time - lastTime));
+
+ lastTime = time + timeToCall;
+ return window.setTimeout(fn, timeToCall);
+ }
+
+ var requestFn = window.requestAnimationFrame ||
+ getPrefixed('RequestAnimationFrame') || timeoutDefer;
+
+ var cancelFn = window.cancelAnimationFrame ||
+ getPrefixed('CancelAnimationFrame') ||
+ getPrefixed('CancelRequestAnimationFrame') ||
+ function (id) { window.clearTimeout(id); };
+
+
+ L.Util.requestAnimFrame = function (fn, context, immediate, element) {
+ fn = L.bind(fn, context);
+
+ if (immediate && requestFn === timeoutDefer) {
+ fn();
+ } else {
+ return requestFn.call(window, fn, element);
+ }
+ };
+
+ L.Util.cancelAnimFrame = function (id) {
+ if (id) {
+ cancelFn.call(window, id);
+ }
+ };
+
+}());
+
+// shortcuts for most used utility functions
+L.extend = L.Util.extend;
+L.bind = L.Util.bind;
+L.stamp = L.Util.stamp;
+L.setOptions = L.Util.setOptions;
+
+
+/*
+ * L.Class powers the OOP facilities of the library.
+ * Thanks to John Resig and Dean Edwards for inspiration!
+ */
+
+L.Class = function () {};
+
+L.Class.extend = function (props) {
+
+ // extended class with the new prototype
+ var NewClass = function () {
+
+ // call the constructor
+ if (this.initialize) {
+ this.initialize.apply(this, arguments);
+ }
+
+ // call all constructor hooks
+ if (this._initHooks) {
+ this.callInitHooks();
+ }
+ };
+
+ // instantiate class without calling constructor
+ var F = function () {};
+ F.prototype = this.prototype;
+
+ var proto = new F();
+ proto.constructor = NewClass;
+
+ NewClass.prototype = proto;
+
+ //inherit parent's statics
+ for (var i in this) {
+ if (this.hasOwnProperty(i) && i !== 'prototype') {
+ NewClass[i] = this[i];
+ }
+ }
+
+ // mix static properties into the class
+ if (props.statics) {
+ L.extend(NewClass, props.statics);
+ delete props.statics;
+ }
+
+ // mix includes into the prototype
+ if (props.includes) {
+ L.Util.extend.apply(null, [proto].concat(props.includes));
+ delete props.includes;
+ }
+
+ // merge options
+ if (props.options && proto.options) {
+ props.options = L.extend({}, proto.options, props.options);
+ }
+
+ // mix given properties into the prototype
+ L.extend(proto, props);
+
+ proto._initHooks = [];
+
+ var parent = this;
+ // jshint camelcase: false
+ NewClass.__super__ = parent.prototype;
+
+ // add method for calling all hooks
+ proto.callInitHooks = function () {
+
+ if (this._initHooksCalled) { return; }
+
+ if (parent.prototype.callInitHooks) {
+ parent.prototype.callInitHooks.call(this);
+ }
+
+ this._initHooksCalled = true;
+
+ for (var i = 0, len = proto._initHooks.length; i < len; i++) {
+ proto._initHooks[i].call(this);
+ }
+ };
+
+ return NewClass;
+};
+
+
+// method for adding properties to prototype
+L.Class.include = function (props) {
+ L.extend(this.prototype, props);
+};
+
+// merge new default options to the Class
+L.Class.mergeOptions = function (options) {
+ L.extend(this.prototype.options, options);
+};
+
+// add a constructor hook
+L.Class.addInitHook = function (fn) { // (Function) || (String, args...)
+ var args = Array.prototype.slice.call(arguments, 1);
+
+ var init = typeof fn === 'function' ? fn : function () {
+ this[fn].apply(this, args);
+ };
+
+ this.prototype._initHooks = this.prototype._initHooks || [];
+ this.prototype._initHooks.push(init);
+};
+
+
+/*
+ * L.Mixin.Events is used to add custom events functionality to Leaflet classes.
+ */
+
+var eventsKey = '_leaflet_events';
+
+L.Mixin = {};
+
+L.Mixin.Events = {
+
+ addEventListener: function (types, fn, context) { // (String, Function[, Object]) or (Object[, Object])
+
+ // types can be a map of types/handlers
+ if (L.Util.invokeEach(types, this.addEventListener, this, fn, context)) { return this; }
+
+ var events = this[eventsKey] = this[eventsKey] || {},
+ contextId = context && context !== this && L.stamp(context),
+ i, len, event, type, indexKey, indexLenKey, typeIndex;
+
+ // types can be a string of space-separated words
+ types = L.Util.splitWords(types);
+
+ for (i = 0, len = types.length; i < len; i++) {
+ event = {
+ action: fn,
+ context: context || this
+ };
+ type = types[i];
+
+ if (contextId) {
+ // store listeners of a particular context in a separate hash (if it has an id)
+ // gives a major performance boost when removing thousands of map layers
+
+ indexKey = type + '_idx';
+ indexLenKey = indexKey + '_len';
+
+ typeIndex = events[indexKey] = events[indexKey] || {};
+
+ if (!typeIndex[contextId]) {
+ typeIndex[contextId] = [];
+
+ // keep track of the number of keys in the index to quickly check if it's empty
+ events[indexLenKey] = (events[indexLenKey] || 0) + 1;
+ }
+
+ typeIndex[contextId].push(event);
+
+
+ } else {
+ events[type] = events[type] || [];
+ events[type].push(event);
+ }
+ }
+
+ return this;
+ },
+
+ hasEventListeners: function (type) { // (String) -> Boolean
+ var events = this[eventsKey];
+ return !!events && ((type in events && events[type].length > 0) ||
+ (type + '_idx' in events && events[type + '_idx_len'] > 0));
+ },
+
+ removeEventListener: function (types, fn, context) { // ([String, Function, Object]) or (Object[, Object])
+
+ if (!this[eventsKey]) {
+ return this;
+ }
+
+ if (!types) {
+ return this.clearAllEventListeners();
+ }
+
+ if (L.Util.invokeEach(types, this.removeEventListener, this, fn, context)) { return this; }
+
+ var events = this[eventsKey],
+ contextId = context && context !== this && L.stamp(context),
+ i, len, type, listeners, j, indexKey, indexLenKey, typeIndex, removed;
+
+ types = L.Util.splitWords(types);
+
+ for (i = 0, len = types.length; i < len; i++) {
+ type = types[i];
+ indexKey = type + '_idx';
+ indexLenKey = indexKey + '_len';
+
+ typeIndex = events[indexKey];
+
+ if (!fn) {
+ // clear all listeners for a type if function isn't specified
+ delete events[type];
+ delete events[indexKey];
+ delete events[indexLenKey];
+
+ } else {
+ listeners = contextId && typeIndex ? typeIndex[contextId] : events[type];
+
+ if (listeners) {
+ for (j = listeners.length - 1; j >= 0; j--) {
+ if ((listeners[j].action === fn) && (!context || (listeners[j].context === context))) {
+ removed = listeners.splice(j, 1);
+ // set the old action to a no-op, because it is possible
+ // that the listener is being iterated over as part of a dispatch
+ removed[0].action = L.Util.falseFn;
+ }
+ }
+
+ if (context && typeIndex && (listeners.length === 0)) {
+ delete typeIndex[contextId];
+ events[indexLenKey]--;
+ }
+ }
+ }
+ }
+
+ return this;
+ },
+
+ clearAllEventListeners: function () {
+ delete this[eventsKey];
+ return this;
+ },
+
+ fireEvent: function (type, data) { // (String[, Object])
+ if (!this.hasEventListeners(type)) {
+ return this;
+ }
+
+ var event = L.Util.extend({}, data, { type: type, target: this });
+
+ var events = this[eventsKey],
+ listeners, i, len, typeIndex, contextId;
+
+ if (events[type]) {
+ // make sure adding/removing listeners inside other listeners won't cause infinite loop
+ listeners = events[type].slice();
+
+ for (i = 0, len = listeners.length; i < len; i++) {
+ listeners[i].action.call(listeners[i].context, event);
+ }
+ }
+
+ // fire event for the context-indexed listeners as well
+ typeIndex = events[type + '_idx'];
+
+ for (contextId in typeIndex) {
+ listeners = typeIndex[contextId].slice();
+
+ if (listeners) {
+ for (i = 0, len = listeners.length; i < len; i++) {
+ listeners[i].action.call(listeners[i].context, event);
+ }
+ }
+ }
+
+ return this;
+ },
+
+ addOneTimeEventListener: function (types, fn, context) {
+
+ if (L.Util.invokeEach(types, this.addOneTimeEventListener, this, fn, context)) { return this; }
+
+ var handler = L.bind(function () {
+ this
+ .removeEventListener(types, fn, context)
+ .removeEventListener(types, handler, context);
+ }, this);
+
+ return this
+ .addEventListener(types, fn, context)
+ .addEventListener(types, handler, context);
+ }
+};
+
+L.Mixin.Events.on = L.Mixin.Events.addEventListener;
+L.Mixin.Events.off = L.Mixin.Events.removeEventListener;
+L.Mixin.Events.once = L.Mixin.Events.addOneTimeEventListener;
+L.Mixin.Events.fire = L.Mixin.Events.fireEvent;
+
+
+/*
+ * L.Browser handles different browser and feature detections for internal Leaflet use.
+ */
+
+(function () {
+
+ var ie = 'ActiveXObject' in window,
+ ielt9 = ie && !document.addEventListener,
+
+ // terrible browser detection to work around Safari / iOS / Android browser bugs
+ ua = navigator.userAgent.toLowerCase(),
+ webkit = ua.indexOf('webkit') !== -1,
+ chrome = ua.indexOf('chrome') !== -1,
+ phantomjs = ua.indexOf('phantom') !== -1,
+ android = ua.indexOf('android') !== -1,
+ android23 = ua.search('android [23]') !== -1,
+ gecko = ua.indexOf('gecko') !== -1,
+
+ mobile = typeof orientation !== undefined + '',
+ msPointer = !window.PointerEvent && window.MSPointerEvent,
+ pointer = (window.PointerEvent && window.navigator.pointerEnabled) ||
+ msPointer,
+ retina = ('devicePixelRatio' in window && window.devicePixelRatio > 1) ||
+ ('matchMedia' in window && window.matchMedia('(min-resolution:144dpi)') &&
+ window.matchMedia('(min-resolution:144dpi)').matches),
+
+ doc = document.documentElement,
+ ie3d = ie && ('transition' in doc.style),
+ webkit3d = ('WebKitCSSMatrix' in window) && ('m11' in new window.WebKitCSSMatrix()) && !android23,
+ gecko3d = 'MozPerspective' in doc.style,
+ opera3d = 'OTransition' in doc.style,
+ any3d = !window.L_DISABLE_3D && (ie3d || webkit3d || gecko3d || opera3d) && !phantomjs;
+
+ var touch = !window.L_NO_TOUCH && !phantomjs && (pointer || 'ontouchstart' in window ||
+ (window.DocumentTouch && document instanceof window.DocumentTouch));
+
+ L.Browser = {
+ ie: ie,
+ ielt9: ielt9,
+ webkit: webkit,
+ gecko: gecko && !webkit && !window.opera && !ie,
+
+ android: android,
+ android23: android23,
+
+ chrome: chrome,
+
+ ie3d: ie3d,
+ webkit3d: webkit3d,
+ gecko3d: gecko3d,
+ opera3d: opera3d,
+ any3d: any3d,
+
+ mobile: mobile,
+ mobileWebkit: mobile && webkit,
+ mobileWebkit3d: mobile && webkit3d,
+ mobileOpera: mobile && window.opera,
+
+ touch: touch,
+ msPointer: msPointer,
+ pointer: pointer,
+
+ retina: retina
+ };
+
+}());
+
+
+/*
+ * L.Point represents a point with x and y coordinates.
+ */
+
+L.Point = function (/*Number*/ x, /*Number*/ y, /*Boolean*/ round) {
+ this.x = (round ? Math.round(x) : x);
+ this.y = (round ? Math.round(y) : y);
+};
+
+L.Point.prototype = {
+
+ clone: function () {
+ return new L.Point(this.x, this.y);
+ },
+
+ // non-destructive, returns a new point
+ add: function (point) {
+ return this.clone()._add(L.point(point));
+ },
+
+ // destructive, used directly for performance in situations where it's safe to modify existing point
+ _add: function (point) {
+ this.x += point.x;
+ this.y += point.y;
+ return this;
+ },
+
+ subtract: function (point) {
+ return this.clone()._subtract(L.point(point));
+ },
+
+ _subtract: function (point) {
+ this.x -= point.x;
+ this.y -= point.y;
+ return this;
+ },
+
+ divideBy: function (num) {
+ return this.clone()._divideBy(num);
+ },
+
+ _divideBy: function (num) {
+ this.x /= num;
+ this.y /= num;
+ return this;
+ },
+
+ multiplyBy: function (num) {
+ return this.clone()._multiplyBy(num);
+ },
+
+ _multiplyBy: function (num) {
+ this.x *= num;
+ this.y *= num;
+ return this;
+ },
+
+ round: function () {
+ return this.clone()._round();
+ },
+
+ _round: function () {
+ this.x = Math.round(this.x);
+ this.y = Math.round(this.y);
+ return this;
+ },
+
+ floor: function () {
+ return this.clone()._floor();
+ },
+
+ _floor: function () {
+ this.x = Math.floor(this.x);
+ this.y = Math.floor(this.y);
+ return this;
+ },
+
+ distanceTo: function (point) {
+ point = L.point(point);
+
+ var x = point.x - this.x,
+ y = point.y - this.y;
+
+ return Math.sqrt(x * x + y * y);
+ },
+
+ equals: function (point) {
+ point = L.point(point);
+
+ return point.x === this.x &&
+ point.y === this.y;
+ },
+
+ contains: function (point) {
+ point = L.point(point);
+
+ return Math.abs(point.x) <= Math.abs(this.x) &&
+ Math.abs(point.y) <= Math.abs(this.y);
+ },
+
+ toString: function () {
+ return 'Point(' +
+ L.Util.formatNum(this.x) + ', ' +
+ L.Util.formatNum(this.y) + ')';
+ }
+};
+
+L.point = function (x, y, round) {
+ if (x instanceof L.Point) {
+ return x;
+ }
+ if (L.Util.isArray(x)) {
+ return new L.Point(x[0], x[1]);
+ }
+ if (x === undefined || x === null) {
+ return x;
+ }
+ return new L.Point(x, y, round);
+};
+
+
+/*
+ * L.Bounds represents a rectangular area on the screen in pixel coordinates.
+ */
+
+L.Bounds = function (a, b) { //(Point, Point) or Point[]
+ if (!a) { return; }
+
+ var points = b ? [a, b] : a;
+
+ for (var i = 0, len = points.length; i < len; i++) {
+ this.extend(points[i]);
+ }
+};
+
+L.Bounds.prototype = {
+ // extend the bounds to contain the given point
+ extend: function (point) { // (Point)
+ point = L.point(point);
+
+ if (!this.min && !this.max) {
+ this.min = point.clone();
+ this.max = point.clone();
+ } else {
+ this.min.x = Math.min(point.x, this.min.x);
+ this.max.x = Math.max(point.x, this.max.x);
+ this.min.y = Math.min(point.y, this.min.y);
+ this.max.y = Math.max(point.y, this.max.y);
+ }
+ return this;
+ },
+
+ getCenter: function (round) { // (Boolean) -> Point
+ return new L.Point(
+ (this.min.x + this.max.x) / 2,
+ (this.min.y + this.max.y) / 2, round);
+ },
+
+ getBottomLeft: function () { // -> Point
+ return new L.Point(this.min.x, this.max.y);
+ },
+
+ getTopRight: function () { // -> Point
+ return new L.Point(this.max.x, this.min.y);
+ },
+
+ getSize: function () {
+ return this.max.subtract(this.min);
+ },
+
+ contains: function (obj) { // (Bounds) or (Point) -> Boolean
+ var min, max;
+
+ if (typeof obj[0] === 'number' || obj instanceof L.Point) {
+ obj = L.point(obj);
+ } else {
+ obj = L.bounds(obj);
+ }
+
+ if (obj instanceof L.Bounds) {
+ min = obj.min;
+ max = obj.max;
+ } else {
+ min = max = obj;
+ }
+
+ return (min.x >= this.min.x) &&
+ (max.x <= this.max.x) &&
+ (min.y >= this.min.y) &&
+ (max.y <= this.max.y);
+ },
+
+ intersects: function (bounds) { // (Bounds) -> Boolean
+ bounds = L.bounds(bounds);
+
+ var min = this.min,
+ max = this.max,
+ min2 = bounds.min,
+ max2 = bounds.max,
+ xIntersects = (max2.x >= min.x) && (min2.x <= max.x),
+ yIntersects = (max2.y >= min.y) && (min2.y <= max.y);
+
+ return xIntersects && yIntersects;
+ },
+
+ isValid: function () {
+ return !!(this.min && this.max);
+ }
+};
+
+L.bounds = function (a, b) { // (Bounds) or (Point, Point) or (Point[])
+ if (!a || a instanceof L.Bounds) {
+ return a;
+ }
+ return new L.Bounds(a, b);
+};
+
+
+/*
+ * L.Transformation is an utility class to perform simple point transformations through a 2d-matrix.
+ */
+
+L.Transformation = function (a, b, c, d) {
+ this._a = a;
+ this._b = b;
+ this._c = c;
+ this._d = d;
+};
+
+L.Transformation.prototype = {
+ transform: function (point, scale) { // (Point, Number) -> Point
+ return this._transform(point.clone(), scale);
+ },
+
+ // destructive transform (faster)
+ _transform: function (point, scale) {
+ scale = scale || 1;
+ point.x = scale * (this._a * point.x + this._b);
+ point.y = scale * (this._c * point.y + this._d);
+ return point;
+ },
+
+ untransform: function (point, scale) {
+ scale = scale || 1;
+ return new L.Point(
+ (point.x / scale - this._b) / this._a,
+ (point.y / scale - this._d) / this._c);
+ }
+};
+
+
+/*
+ * L.DomUtil contains various utility functions for working with DOM.
+ */
+
+L.DomUtil = {
+ get: function (id) {
+ return (typeof id === 'string' ? document.getElementById(id) : id);
+ },
+
+ getStyle: function (el, style) {
+
+ var value = el.style[style];
+
+ if (!value && el.currentStyle) {
+ value = el.currentStyle[style];
+ }
+
+ if ((!value || value === 'auto') && document.defaultView) {
+ var css = document.defaultView.getComputedStyle(el, null);
+ value = css ? css[style] : null;
+ }
+
+ return value === 'auto' ? null : value;
+ },
+
+ getViewportOffset: function (element) {
+
+ var top = 0,
+ left = 0,
+ el = element,
+ docBody = document.body,
+ docEl = document.documentElement,
+ pos;
+
+ do {
+ top += el.offsetTop || 0;
+ left += el.offsetLeft || 0;
+
+ //add borders
+ top += parseInt(L.DomUtil.getStyle(el, 'borderTopWidth'), 10) || 0;
+ left += parseInt(L.DomUtil.getStyle(el, 'borderLeftWidth'), 10) || 0;
+
+ pos = L.DomUtil.getStyle(el, 'position');
+
+ if (el.offsetParent === docBody && pos === 'absolute') { break; }
+
+ if (pos === 'fixed') {
+ top += docBody.scrollTop || docEl.scrollTop || 0;
+ left += docBody.scrollLeft || docEl.scrollLeft || 0;
+ break;
+ }
+
+ if (pos === 'relative' && !el.offsetLeft) {
+ var width = L.DomUtil.getStyle(el, 'width'),
+ maxWidth = L.DomUtil.getStyle(el, 'max-width'),
+ r = el.getBoundingClientRect();
+
+ if (width !== 'none' || maxWidth !== 'none') {
+ left += r.left + el.clientLeft;
+ }
+
+ //calculate full y offset since we're breaking out of the loop
+ top += r.top + (docBody.scrollTop || docEl.scrollTop || 0);
+
+ break;
+ }
+
+ el = el.offsetParent;
+
+ } while (el);
+
+ el = element;
+
+ do {
+ if (el === docBody) { break; }
+
+ top -= el.scrollTop || 0;
+ left -= el.scrollLeft || 0;
+
+ el = el.parentNode;
+ } while (el);
+
+ return new L.Point(left, top);
+ },
+
+ documentIsLtr: function () {
+ if (!L.DomUtil._docIsLtrCached) {
+ L.DomUtil._docIsLtrCached = true;
+ L.DomUtil._docIsLtr = L.DomUtil.getStyle(document.body, 'direction') === 'ltr';
+ }
+ return L.DomUtil._docIsLtr;
+ },
+
+ create: function (tagName, className, container) {
+
+ var el = document.createElement(tagName);
+ el.className = className;
+
+ if (container) {
+ container.appendChild(el);
+ }
+
+ return el;
+ },
+
+ hasClass: function (el, name) {
+ if (el.classList !== undefined) {
+ return el.classList.contains(name);
+ }
+ var className = L.DomUtil._getClass(el);
+ return className.length > 0 && new RegExp('(^|\\s)' + name + '(\\s|$)').test(className);
+ },
+
+ addClass: function (el, name) {
+ if (el.classList !== undefined) {
+ var classes = L.Util.splitWords(name);
+ for (var i = 0, len = classes.length; i < len; i++) {
+ el.classList.add(classes[i]);
+ }
+ } else if (!L.DomUtil.hasClass(el, name)) {
+ var className = L.DomUtil._getClass(el);
+ L.DomUtil._setClass(el, (className ? className + ' ' : '') + name);
+ }
+ },
+
+ removeClass: function (el, name) {
+ if (el.classList !== undefined) {
+ el.classList.remove(name);
+ } else {
+ L.DomUtil._setClass(el, L.Util.trim((' ' + L.DomUtil._getClass(el) + ' ').replace(' ' + name + ' ', ' ')));
+ }
+ },
+
+ _setClass: function (el, name) {
+ if (el.className.baseVal === undefined) {
+ el.className = name;
+ } else {
+ // in case of SVG element
+ el.className.baseVal = name;
+ }
+ },
+
+ _getClass: function (el) {
+ return el.className.baseVal === undefined ? el.className : el.className.baseVal;
+ },
+
+ setOpacity: function (el, value) {
+
+ if ('opacity' in el.style) {
+ el.style.opacity = value;
+
+ } else if ('filter' in el.style) {
+
+ var filter = false,
+ filterName = 'DXImageTransform.Microsoft.Alpha';
+
+ // filters collection throws an error if we try to retrieve a filter that doesn't exist
+ try {
+ filter = el.filters.item(filterName);
+ } catch (e) {
+ // don't set opacity to 1 if we haven't already set an opacity,
+ // it isn't needed and breaks transparent pngs.
+ if (value === 1) { return; }
+ }
+
+ value = Math.round(value * 100);
+
+ if (filter) {
+ filter.Enabled = (value !== 100);
+ filter.Opacity = value;
+ } else {
+ el.style.filter += ' progid:' + filterName + '(opacity=' + value + ')';
+ }
+ }
+ },
+
+ testProp: function (props) {
+
+ var style = document.documentElement.style;
+
+ for (var i = 0; i < props.length; i++) {
+ if (props[i] in style) {
+ return props[i];
+ }
+ }
+ return false;
+ },
+
+ getTranslateString: function (point) {
+ // on WebKit browsers (Chrome/Safari/iOS Safari/Android) using translate3d instead of translate
+ // makes animation smoother as it ensures HW accel is used. Firefox 13 doesn't care
+ // (same speed either way), Opera 12 doesn't support translate3d
+
+ var is3d = L.Browser.webkit3d,
+ open = 'translate' + (is3d ? '3d' : '') + '(',
+ close = (is3d ? ',0' : '') + ')';
+
+ return open + point.x + 'px,' + point.y + 'px' + close;
+ },
+
+ getScaleString: function (scale, origin) {
+
+ var preTranslateStr = L.DomUtil.getTranslateString(origin.add(origin.multiplyBy(-1 * scale))),
+ scaleStr = ' scale(' + scale + ') ';
+
+ return preTranslateStr + scaleStr;
+ },
+
+ setPosition: function (el, point, disable3D) { // (HTMLElement, Point[, Boolean])
+
+ // jshint camelcase: false
+ el._leaflet_pos = point;
+
+ if (!disable3D && L.Browser.any3d) {
+ el.style[L.DomUtil.TRANSFORM] = L.DomUtil.getTranslateString(point);
+ } else {
+ el.style.left = point.x + 'px';
+ el.style.top = point.y + 'px';
+ }
+ },
+
+ getPosition: function (el) {
+ // this method is only used for elements previously positioned using setPosition,
+ // so it's safe to cache the position for performance
+
+ // jshint camelcase: false
+ return el._leaflet_pos;
+ }
+};
+
+
+// prefix style property names
+
+L.DomUtil.TRANSFORM = L.DomUtil.testProp(
+ ['transform', 'WebkitTransform', 'OTransform', 'MozTransform', 'msTransform']);
+
+// webkitTransition comes first because some browser versions that drop vendor prefix don't do
+// the same for the transitionend event, in particular the Android 4.1 stock browser
+
+L.DomUtil.TRANSITION = L.DomUtil.testProp(
+ ['webkitTransition', 'transition', 'OTransition', 'MozTransition', 'msTransition']);
+
+L.DomUtil.TRANSITION_END =
+ L.DomUtil.TRANSITION === 'webkitTransition' || L.DomUtil.TRANSITION === 'OTransition' ?
+ L.DomUtil.TRANSITION + 'End' : 'transitionend';
+
+(function () {
+ if ('onselectstart' in document) {
+ L.extend(L.DomUtil, {
+ disableTextSelection: function () {
+ L.DomEvent.on(window, 'selectstart', L.DomEvent.preventDefault);
+ },
+
+ enableTextSelection: function () {
+ L.DomEvent.off(window, 'selectstart', L.DomEvent.preventDefault);
+ }
+ });
+ } else {
+ var userSelectProperty = L.DomUtil.testProp(
+ ['userSelect', 'WebkitUserSelect', 'OUserSelect', 'MozUserSelect', 'msUserSelect']);
+
+ L.extend(L.DomUtil, {
+ disableTextSelection: function () {
+ if (userSelectProperty) {
+ var style = document.documentElement.style;
+ this._userSelect = style[userSelectProperty];
+ style[userSelectProperty] = 'none';
+ }
+ },
+
+ enableTextSelection: function () {
+ if (userSelectProperty) {
+ document.documentElement.style[userSelectProperty] = this._userSelect;
+ delete this._userSelect;
+ }
+ }
+ });
+ }
+
+ L.extend(L.DomUtil, {
+ disableImageDrag: function () {
+ L.DomEvent.on(window, 'dragstart', L.DomEvent.preventDefault);
+ },
+
+ enableImageDrag: function () {
+ L.DomEvent.off(window, 'dragstart', L.DomEvent.preventDefault);
+ }
+ });
+})();
+
+
+/*
+ * L.LatLng represents a geographical point with latitude and longitude coordinates.
+ */
+
+L.LatLng = function (lat, lng, alt) { // (Number, Number, Number)
+ lat = parseFloat(lat);
+ lng = parseFloat(lng);
+
+ if (isNaN(lat) || isNaN(lng)) {
+ throw new Error('Invalid LatLng object: (' + lat + ', ' + lng + ')');
+ }
+
+ this.lat = lat;
+ this.lng = lng;
+
+ if (alt !== undefined) {
+ this.alt = parseFloat(alt);
+ }
+};
+
+L.extend(L.LatLng, {
+ DEG_TO_RAD: Math.PI / 180,
+ RAD_TO_DEG: 180 / Math.PI,
+ MAX_MARGIN: 1.0E-9 // max margin of error for the "equals" check
+});
+
+L.LatLng.prototype = {
+ equals: function (obj) { // (LatLng) -> Boolean
+ if (!obj) { return false; }
+
+ obj = L.latLng(obj);
+
+ var margin = Math.max(
+ Math.abs(this.lat - obj.lat),
+ Math.abs(this.lng - obj.lng));
+
+ return margin <= L.LatLng.MAX_MARGIN;
+ },
+
+ toString: function (precision) { // (Number) -> String
+ return 'LatLng(' +
+ L.Util.formatNum(this.lat, precision) + ', ' +
+ L.Util.formatNum(this.lng, precision) + ')';
+ },
+
+ // Haversine distance formula, see http://en.wikipedia.org/wiki/Haversine_formula
+ // TODO move to projection code, LatLng shouldn't know about Earth
+ distanceTo: function (other) { // (LatLng) -> Number
+ other = L.latLng(other);
+
+ var R = 6378137, // earth radius in meters
+ d2r = L.LatLng.DEG_TO_RAD,
+ dLat = (other.lat - this.lat) * d2r,
+ dLon = (other.lng - this.lng) * d2r,
+ lat1 = this.lat * d2r,
+ lat2 = other.lat * d2r,
+ sin1 = Math.sin(dLat / 2),
+ sin2 = Math.sin(dLon / 2);
+
+ var a = sin1 * sin1 + sin2 * sin2 * Math.cos(lat1) * Math.cos(lat2);
+
+ return R * 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
+ },
+
+ wrap: function (a, b) { // (Number, Number) -> LatLng
+ var lng = this.lng;
+
+ a = a || -180;
+ b = b || 180;
+
+ lng = (lng + b) % (b - a) + (lng < a || lng === b ? b : a);
+
+ return new L.LatLng(this.lat, lng);
+ }
+};
+
+L.latLng = function (a, b) { // (LatLng) or ([Number, Number]) or (Number, Number)
+ if (a instanceof L.LatLng) {
+ return a;
+ }
+ if (L.Util.isArray(a)) {
+ if (typeof a[0] === 'number' || typeof a[0] === 'string') {
+ return new L.LatLng(a[0], a[1], a[2]);
+ } else {
+ return null;
+ }
+ }
+ if (a === undefined || a === null) {
+ return a;
+ }
+ if (typeof a === 'object' && 'lat' in a) {
+ return new L.LatLng(a.lat, 'lng' in a ? a.lng : a.lon);
+ }
+ if (b === undefined) {
+ return null;
+ }
+ return new L.LatLng(a, b);
+};
+
+
+
+/*
+ * L.LatLngBounds represents a rectangular area on the map in geographical coordinates.
+ */
+
+L.LatLngBounds = function (southWest, northEast) { // (LatLng, LatLng) or (LatLng[])
+ if (!southWest) { return; }
+
+ var latlngs = northEast ? [southWest, northEast] : southWest;
+
+ for (var i = 0, len = latlngs.length; i < len; i++) {
+ this.extend(latlngs[i]);
+ }
+};
+
+L.LatLngBounds.prototype = {
+ // extend the bounds to contain the given point or bounds
+ extend: function (obj) { // (LatLng) or (LatLngBounds)
+ if (!obj) { return this; }
+
+ var latLng = L.latLng(obj);
+ if (latLng !== null) {
+ obj = latLng;
+ } else {
+ obj = L.latLngBounds(obj);
+ }
+
+ if (obj instanceof L.LatLng) {
+ if (!this._southWest && !this._northEast) {
+ this._southWest = new L.LatLng(obj.lat, obj.lng);
+ this._northEast = new L.LatLng(obj.lat, obj.lng);
+ } else {
+ this._southWest.lat = Math.min(obj.lat, this._southWest.lat);
+ this._southWest.lng = Math.min(obj.lng, this._southWest.lng);
+
+ this._northEast.lat = Math.max(obj.lat, this._northEast.lat);
+ this._northEast.lng = Math.max(obj.lng, this._northEast.lng);
+ }
+ } else if (obj instanceof L.LatLngBounds) {
+ this.extend(obj._southWest);
+ this.extend(obj._northEast);
+ }
+ return this;
+ },
+
+ // extend the bounds by a percentage
+ pad: function (bufferRatio) { // (Number) -> LatLngBounds
+ var sw = this._southWest,
+ ne = this._northEast,
+ heightBuffer = Math.abs(sw.lat - ne.lat) * bufferRatio,
+ widthBuffer = Math.abs(sw.lng - ne.lng) * bufferRatio;
+
+ return new L.LatLngBounds(
+ new L.LatLng(sw.lat - heightBuffer, sw.lng - widthBuffer),
+ new L.LatLng(ne.lat + heightBuffer, ne.lng + widthBuffer));
+ },
+
+ getCenter: function () { // -> LatLng
+ return new L.LatLng(
+ (this._southWest.lat + this._northEast.lat) / 2,
+ (this._southWest.lng + this._northEast.lng) / 2);
+ },
+
+ getSouthWest: function () {
+ return this._southWest;
+ },
+
+ getNorthEast: function () {
+ return this._northEast;
+ },
+
+ getNorthWest: function () {
+ return new L.LatLng(this.getNorth(), this.getWest());
+ },
+
+ getSouthEast: function () {
+ return new L.LatLng(this.getSouth(), this.getEast());
+ },
+
+ getWest: function () {
+ return this._southWest.lng;
+ },
+
+ getSouth: function () {
+ return this._southWest.lat;
+ },
+
+ getEast: function () {
+ return this._northEast.lng;
+ },
+
+ getNorth: function () {
+ return this._northEast.lat;
+ },
+
+ contains: function (obj) { // (LatLngBounds) or (LatLng) -> Boolean
+ if (typeof obj[0] === 'number' || obj instanceof L.LatLng) {
+ obj = L.latLng(obj);
+ } else {
+ obj = L.latLngBounds(obj);
+ }
+
+ var sw = this._southWest,
+ ne = this._northEast,
+ sw2, ne2;
+
+ if (obj instanceof L.LatLngBounds) {
+ sw2 = obj.getSouthWest();
+ ne2 = obj.getNorthEast();
+ } else {
+ sw2 = ne2 = obj;
+ }
+
+ return (sw2.lat >= sw.lat) && (ne2.lat <= ne.lat) &&
+ (sw2.lng >= sw.lng) && (ne2.lng <= ne.lng);
+ },
+
+ intersects: function (bounds) { // (LatLngBounds)
+ bounds = L.latLngBounds(bounds);
+
+ var sw = this._southWest,
+ ne = this._northEast,
+ sw2 = bounds.getSouthWest(),
+ ne2 = bounds.getNorthEast(),
+
+ latIntersects = (ne2.lat >= sw.lat) && (sw2.lat <= ne.lat),
+ lngIntersects = (ne2.lng >= sw.lng) && (sw2.lng <= ne.lng);
+
+ return latIntersects && lngIntersects;
+ },
+
+ toBBoxString: function () {
+ return [this.getWest(), this.getSouth(), this.getEast(), this.getNorth()].join(',');
+ },
+
+ equals: function (bounds) { // (LatLngBounds)
+ if (!bounds) { return false; }
+
+ bounds = L.latLngBounds(bounds);
+
+ return this._southWest.equals(bounds.getSouthWest()) &&
+ this._northEast.equals(bounds.getNorthEast());
+ },
+
+ isValid: function () {
+ return !!(this._southWest && this._northEast);
+ }
+};
+
+//TODO International date line?
+
+L.latLngBounds = function (a, b) { // (LatLngBounds) or (LatLng, LatLng)
+ if (!a || a instanceof L.LatLngBounds) {
+ return a;
+ }
+ return new L.LatLngBounds(a, b);
+};
+
+
+/*
+ * L.Projection contains various geographical projections used by CRS classes.
+ */
+
+L.Projection = {};
+
+
+/*
+ * Spherical Mercator is the most popular map projection, used by EPSG:3857 CRS used by default.
+ */
+
+L.Projection.SphericalMercator = {
+ MAX_LATITUDE: 85.0511287798,
+
+ project: function (latlng) { // (LatLng) -> Point
+ var d = L.LatLng.DEG_TO_RAD,
+ max = this.MAX_LATITUDE,
+ lat = Math.max(Math.min(max, latlng.lat), -max),
+ x = latlng.lng * d,
+ y = lat * d;
+
+ y = Math.log(Math.tan((Math.PI / 4) + (y / 2)));
+
+ return new L.Point(x, y);
+ },
+
+ unproject: function (point) { // (Point, Boolean) -> LatLng
+ var d = L.LatLng.RAD_TO_DEG,
+ lng = point.x * d,
+ lat = (2 * Math.atan(Math.exp(point.y)) - (Math.PI / 2)) * d;
+
+ return new L.LatLng(lat, lng);
+ }
+};
+
+
+/*
+ * Simple equirectangular (Plate Carree) projection, used by CRS like EPSG:4326 and Simple.
+ */
+
+L.Projection.LonLat = {
+ project: function (latlng) {
+ return new L.Point(latlng.lng, latlng.lat);
+ },
+
+ unproject: function (point) {
+ return new L.LatLng(point.y, point.x);
+ }
+};
+
+
+/*
+ * L.CRS is a base object for all defined CRS (Coordinate Reference Systems) in Leaflet.
+ */
+
+L.CRS = {
+ latLngToPoint: function (latlng, zoom) { // (LatLng, Number) -> Point
+ var projectedPoint = this.projection.project(latlng),
+ scale = this.scale(zoom);
+
+ return this.transformation._transform(projectedPoint, scale);
+ },
+
+ pointToLatLng: function (point, zoom) { // (Point, Number[, Boolean]) -> LatLng
+ var scale = this.scale(zoom),
+ untransformedPoint = this.transformation.untransform(point, scale);
+
+ return this.projection.unproject(untransformedPoint);
+ },
+
+ project: function (latlng) {
+ return this.projection.project(latlng);
+ },
+
+ scale: function (zoom) {
+ return 256 * Math.pow(2, zoom);
+ },
+
+ getSize: function (zoom) {
+ var s = this.scale(zoom);
+ return L.point(s, s);
+ }
+};
+
+
+/*
+ * A simple CRS that can be used for flat non-Earth maps like panoramas or game maps.
+ */
+
+L.CRS.Simple = L.extend({}, L.CRS, {
+ projection: L.Projection.LonLat,
+ transformation: new L.Transformation(1, 0, -1, 0),
+
+ scale: function (zoom) {
+ return Math.pow(2, zoom);
+ }
+});
+
+
+/*
+ * L.CRS.EPSG3857 (Spherical Mercator) is the most common CRS for web mapping
+ * and is used by Leaflet by default.
+ */
+
+L.CRS.EPSG3857 = L.extend({}, L.CRS, {
+ code: 'EPSG:3857',
+
+ projection: L.Projection.SphericalMercator,
+ transformation: new L.Transformation(0.5 / Math.PI, 0.5, -0.5 / Math.PI, 0.5),
+
+ project: function (latlng) { // (LatLng) -> Point
+ var projectedPoint = this.projection.project(latlng),
+ earthRadius = 6378137;
+ return projectedPoint.multiplyBy(earthRadius);
+ }
+});
+
+L.CRS.EPSG900913 = L.extend({}, L.CRS.EPSG3857, {
+ code: 'EPSG:900913'
+});
+
+
+/*
+ * L.CRS.EPSG4326 is a CRS popular among advanced GIS specialists.
+ */
+
+L.CRS.EPSG4326 = L.extend({}, L.CRS, {
+ code: 'EPSG:4326',
+
+ projection: L.Projection.LonLat,
+ transformation: new L.Transformation(1 / 360, 0.5, -1 / 360, 0.5)
+});
+
+
+/*
+ * L.Map is the central class of the API - it is used to create a map.
+ */
+
+L.Map = L.Class.extend({
+
+ includes: L.Mixin.Events,
+
+ options: {
+ crs: L.CRS.EPSG3857,
+
+ /*
+ center: LatLng,
+ zoom: Number,
+ layers: Array,
+ */
+
+ fadeAnimation: L.DomUtil.TRANSITION && !L.Browser.android23,
+ trackResize: true,
+ markerZoomAnimation: L.DomUtil.TRANSITION && L.Browser.any3d
+ },
+
+ initialize: function (id, options) { // (HTMLElement or String, Object)
+ options = L.setOptions(this, options);
+
+
+ this._initContainer(id);
+ this._initLayout();
+
+ // hack for https://github.com/Leaflet/Leaflet/issues/1980
+ this._onResize = L.bind(this._onResize, this);
+
+ this._initEvents();
+
+ if (options.maxBounds) {
+ this.setMaxBounds(options.maxBounds);
+ }
+
+ if (options.center && options.zoom !== undefined) {
+ this.setView(L.latLng(options.center), options.zoom, {reset: true});
+ }
+
+ this._handlers = [];
+
+ this._layers = {};
+ this._zoomBoundLayers = {};
+ this._tileLayersNum = 0;
+
+ this.callInitHooks();
+
+ this._addLayers(options.layers);
+ },
+
+
+ // public methods that modify map state
+
+ // replaced by animation-powered implementation in Map.PanAnimation.js
+ setView: function (center, zoom) {
+ zoom = zoom === undefined ? this.getZoom() : zoom;
+ this._resetView(L.latLng(center), this._limitZoom(zoom));
+ return this;
+ },
+
+ setZoom: function (zoom, options) {
+ if (!this._loaded) {
+ this._zoom = this._limitZoom(zoom);
+ return this;
+ }
+ return this.setView(this.getCenter(), zoom, {zoom: options});
+ },
+
+ zoomIn: function (delta, options) {
+ return this.setZoom(this._zoom + (delta || 1), options);
+ },
+
+ zoomOut: function (delta, options) {
+ return this.setZoom(this._zoom - (delta || 1), options);
+ },
+
+ setZoomAround: function (latlng, zoom, options) {
+ var scale = this.getZoomScale(zoom),
+ viewHalf = this.getSize().divideBy(2),
+ containerPoint = latlng instanceof L.Point ? latlng : this.latLngToContainerPoint(latlng),
+
+ centerOffset = containerPoint.subtract(viewHalf).multiplyBy(1 - 1 / scale),
+ newCenter = this.containerPointToLatLng(viewHalf.add(centerOffset));
+
+ return this.setView(newCenter, zoom, {zoom: options});
+ },
+
+ fitBounds: function (bounds, options) {
+
+ options = options || {};
+ bounds = bounds.getBounds ? bounds.getBounds() : L.latLngBounds(bounds);
+
+ var paddingTL = L.point(options.paddingTopLeft || options.padding || [0, 0]),
+ paddingBR = L.point(options.paddingBottomRight || options.padding || [0, 0]),
+
+ zoom = this.getBoundsZoom(bounds, false, paddingTL.add(paddingBR));
+
+ zoom = (options.maxZoom) ? Math.min(options.maxZoom, zoom) : zoom;
+
+ var paddingOffset = paddingBR.subtract(paddingTL).divideBy(2),
+
+ swPoint = this.project(bounds.getSouthWest(), zoom),
+ nePoint = this.project(bounds.getNorthEast(), zoom),
+ center = this.unproject(swPoint.add(nePoint).divideBy(2).add(paddingOffset), zoom);
+
+ return this.setView(center, zoom, options);
+ },
+
+ fitWorld: function (options) {
+ return this.fitBounds([[-90, -180], [90, 180]], options);
+ },
+
+ panTo: function (center, options) { // (LatLng)
+ return this.setView(center, this._zoom, {pan: options});
+ },
+
+ panBy: function (offset) { // (Point)
+ // replaced with animated panBy in Map.PanAnimation.js
+ this.fire('movestart');
+
+ this._rawPanBy(L.point(offset));
+
+ this.fire('move');
+ return this.fire('moveend');
+ },
+
+ setMaxBounds: function (bounds) {
+ bounds = L.latLngBounds(bounds);
+
+ this.options.maxBounds = bounds;
+
+ if (!bounds) {
+ return this.off('moveend', this._panInsideMaxBounds, this);
+ }
+
+ if (this._loaded) {
+ this._panInsideMaxBounds();
+ }
+
+ return this.on('moveend', this._panInsideMaxBounds, this);
+ },
+
+ panInsideBounds: function (bounds, options) {
+ var center = this.getCenter(),
+ newCenter = this._limitCenter(center, this._zoom, bounds);
+
+ if (center.equals(newCenter)) { return this; }
+
+ return this.panTo(newCenter, options);
+ },
+
+ addLayer: function (layer) {
+ // TODO method is too big, refactor
+
+ var id = L.stamp(layer);
+
+ if (this._layers[id]) { return this; }
+
+ this._layers[id] = layer;
+
+ // TODO getMaxZoom, getMinZoom in ILayer (instead of options)
+ if (layer.options && (!isNaN(layer.options.maxZoom) || !isNaN(layer.options.minZoom))) {
+ this._zoomBoundLayers[id] = layer;
+ this._updateZoomLevels();
+ }
+
+ // TODO looks ugly, refactor!!!
+ if (this.options.zoomAnimation && L.TileLayer && (layer instanceof L.TileLayer)) {
+ this._tileLayersNum++;
+ this._tileLayersToLoad++;
+ layer.on('load', this._onTileLayerLoad, this);
+ }
+
+ if (this._loaded) {
+ this._layerAdd(layer);
+ }
+
+ return this;
+ },
+
+ removeLayer: function (layer) {
+ var id = L.stamp(layer);
+
+ if (!this._layers[id]) { return this; }
+
+ if (this._loaded) {
+ layer.onRemove(this);
+ }
+
+ delete this._layers[id];
+
+ if (this._loaded) {
+ this.fire('layerremove', {layer: layer});
+ }
+
+ if (this._zoomBoundLayers[id]) {
+ delete this._zoomBoundLayers[id];
+ this._updateZoomLevels();
+ }
+
+ // TODO looks ugly, refactor
+ if (this.options.zoomAnimation && L.TileLayer && (layer instanceof L.TileLayer)) {
+ this._tileLayersNum--;
+ this._tileLayersToLoad--;
+ layer.off('load', this._onTileLayerLoad, this);
+ }
+
+ return this;
+ },
+
+ hasLayer: function (layer) {
+ if (!layer) { return false; }
+
+ return (L.stamp(layer) in this._layers);
+ },
+
+ eachLayer: function (method, context) {
+ for (var i in this._layers) {
+ method.call(context, this._layers[i]);
+ }
+ return this;
+ },
+
+ invalidateSize: function (options) {
+ if (!this._loaded) { return this; }
+
+ options = L.extend({
+ animate: false,
+ pan: true
+ }, options === true ? {animate: true} : options);
+
+ var oldSize = this.getSize();
+ this._sizeChanged = true;
+ this._initialCenter = null;
+
+ var newSize = this.getSize(),
+ oldCenter = oldSize.divideBy(2).round(),
+ newCenter = newSize.divideBy(2).round(),
+ offset = oldCenter.subtract(newCenter);
+
+ if (!offset.x && !offset.y) { return this; }
+
+ if (options.animate && options.pan) {
+ this.panBy(offset);
+
+ } else {
+ if (options.pan) {
+ this._rawPanBy(offset);
+ }
+
+ this.fire('move');
+
+ if (options.debounceMoveend) {
+ clearTimeout(this._sizeTimer);
+ this._sizeTimer = setTimeout(L.bind(this.fire, this, 'moveend'), 200);
+ } else {
+ this.fire('moveend');
+ }
+ }
+
+ return this.fire('resize', {
+ oldSize: oldSize,
+ newSize: newSize
+ });
+ },
+
+ // TODO handler.addTo
+ addHandler: function (name, HandlerClass) {
+ if (!HandlerClass) { return this; }
+
+ var handler = this[name] = new HandlerClass(this);
+
+ this._handlers.push(handler);
+
+ if (this.options[name]) {
+ handler.enable();
+ }
+
+ return this;
+ },
+
+ remove: function () {
+ if (this._loaded) {
+ this.fire('unload');
+ }
+
+ this._initEvents('off');
+
+ try {
+ // throws error in IE6-8
+ delete this._container._leaflet;
+ } catch (e) {
+ this._container._leaflet = undefined;
+ }
+
+ this._clearPanes();
+ if (this._clearControlPos) {
+ this._clearControlPos();
+ }
+
+ this._clearHandlers();
+
+ return this;
+ },
+
+
+ // public methods for getting map state
+
+ getCenter: function () { // (Boolean) -> LatLng
+ this._checkIfLoaded();
+
+ if (this._initialCenter && !this._moved()) {
+ return this._initialCenter;
+ }
+ return this.layerPointToLatLng(this._getCenterLayerPoint());
+ },
+
+ getZoom: function () {
+ return this._zoom;
+ },
+
+ getBounds: function () {
+ var bounds = this.getPixelBounds(),
+ sw = this.unproject(bounds.getBottomLeft()),
+ ne = this.unproject(bounds.getTopRight());
+
+ return new L.LatLngBounds(sw, ne);
+ },
+
+ getMinZoom: function () {
+ return this.options.minZoom === undefined ?
+ (this._layersMinZoom === undefined ? 0 : this._layersMinZoom) :
+ this.options.minZoom;
+ },
+
+ getMaxZoom: function () {
+ return this.options.maxZoom === undefined ?
+ (this._layersMaxZoom === undefined ? Infinity : this._layersMaxZoom) :
+ this.options.maxZoom;
+ },
+
+ getBoundsZoom: function (bounds, inside, padding) { // (LatLngBounds[, Boolean, Point]) -> Number
+ bounds = L.latLngBounds(bounds);
+
+ var zoom = this.getMinZoom() - (inside ? 1 : 0),
+ maxZoom = this.getMaxZoom(),
+ size = this.getSize(),
+
+ nw = bounds.getNorthWest(),
+ se = bounds.getSouthEast(),
+
+ zoomNotFound = true,
+ boundsSize;
+
+ padding = L.point(padding || [0, 0]);
+
+ do {
+ zoom++;
+ boundsSize = this.project(se, zoom).subtract(this.project(nw, zoom)).add(padding);
+ zoomNotFound = !inside ? size.contains(boundsSize) : boundsSize.x < size.x || boundsSize.y < size.y;
+
+ } while (zoomNotFound && zoom <= maxZoom);
+
+ if (zoomNotFound && inside) {
+ return null;
+ }
+
+ return inside ? zoom : zoom - 1;
+ },
+
+ getSize: function () {
+ if (!this._size || this._sizeChanged) {
+ this._size = new L.Point(
+ this._container.clientWidth,
+ this._container.clientHeight);
+
+ this._sizeChanged = false;
+ }
+ return this._size.clone();
+ },
+
+ getPixelBounds: function () {
+ var topLeftPoint = this._getTopLeftPoint();
+ return new L.Bounds(topLeftPoint, topLeftPoint.add(this.getSize()));
+ },
+
+ getPixelOrigin: function () {
+ this._checkIfLoaded();
+ return this._initialTopLeftPoint;
+ },
+
+ getPanes: function () {
+ return this._panes;
+ },
+
+ getContainer: function () {
+ return this._container;
+ },
+
+
+ // TODO replace with universal implementation after refactoring projections
+
+ getZoomScale: function (toZoom) {
+ var crs = this.options.crs;
+ return crs.scale(toZoom) / crs.scale(this._zoom);
+ },
+
+ getScaleZoom: function (scale) {
+ return this._zoom + (Math.log(scale) / Math.LN2);
+ },
+
+
+ // conversion methods
+
+ project: function (latlng, zoom) { // (LatLng[, Number]) -> Point
+ zoom = zoom === undefined ? this._zoom : zoom;
+ return this.options.crs.latLngToPoint(L.latLng(latlng), zoom);
+ },
+
+ unproject: function (point, zoom) { // (Point[, Number]) -> LatLng
+ zoom = zoom === undefined ? this._zoom : zoom;
+ return this.options.crs.pointToLatLng(L.point(point), zoom);
+ },
+
+ layerPointToLatLng: function (point) { // (Point)
+ var projectedPoint = L.point(point).add(this.getPixelOrigin());
+ return this.unproject(projectedPoint);
+ },
+
+ latLngToLayerPoint: function (latlng) { // (LatLng)
+ var projectedPoint = this.project(L.latLng(latlng))._round();
+ return projectedPoint._subtract(this.getPixelOrigin());
+ },
+
+ containerPointToLayerPoint: function (point) { // (Point)
+ return L.point(point).subtract(this._getMapPanePos());
+ },
+
+ layerPointToContainerPoint: function (point) { // (Point)
+ return L.point(point).add(this._getMapPanePos());
+ },
+
+ containerPointToLatLng: function (point) {
+ var layerPoint = this.containerPointToLayerPoint(L.point(point));
+ return this.layerPointToLatLng(layerPoint);
+ },
+
+ latLngToContainerPoint: function (latlng) {
+ return this.layerPointToContainerPoint(this.latLngToLayerPoint(L.latLng(latlng)));
+ },
+
+ mouseEventToContainerPoint: function (e) { // (MouseEvent)
+ return L.DomEvent.getMousePosition(e, this._container);
+ },
+
+ mouseEventToLayerPoint: function (e) { // (MouseEvent)
+ return this.containerPointToLayerPoint(this.mouseEventToContainerPoint(e));
+ },
+
+ mouseEventToLatLng: function (e) { // (MouseEvent)
+ return this.layerPointToLatLng(this.mouseEventToLayerPoint(e));
+ },
+
+
+ // map initialization methods
+
+ _initContainer: function (id) {
+ var container = this._container = L.DomUtil.get(id);
+
+ if (!container) {
+ throw new Error('Map container not found.');
+ } else if (container._leaflet) {
+ throw new Error('Map container is already initialized.');
+ }
+
+ container._leaflet = true;
+ },
+
+ _initLayout: function () {
+ var container = this._container;
+
+ L.DomUtil.addClass(container, 'leaflet-container' +
+ (L.Browser.touch ? ' leaflet-touch' : '') +
+ (L.Browser.retina ? ' leaflet-retina' : '') +
+ (L.Browser.ielt9 ? ' leaflet-oldie' : '') +
+ (this.options.fadeAnimation ? ' leaflet-fade-anim' : ''));
+
+ var position = L.DomUtil.getStyle(container, 'position');
+
+ if (position !== 'absolute' && position !== 'relative' && position !== 'fixed') {
+ container.style.position = 'relative';
+ }
+
+ this._initPanes();
+
+ if (this._initControlPos) {
+ this._initControlPos();
+ }
+ },
+
+ _initPanes: function () {
+ var panes = this._panes = {};
+
+ this._mapPane = panes.mapPane = this._createPane('leaflet-map-pane', this._container);
+
+ this._tilePane = panes.tilePane = this._createPane('leaflet-tile-pane', this._mapPane);
+ panes.objectsPane = this._createPane('leaflet-objects-pane', this._mapPane);
+ panes.shadowPane = this._createPane('leaflet-shadow-pane');
+ panes.overlayPane = this._createPane('leaflet-overlay-pane');
+ panes.markerPane = this._createPane('leaflet-marker-pane');
+ panes.popupPane = this._createPane('leaflet-popup-pane');
+
+ var zoomHide = ' leaflet-zoom-hide';
+
+ if (!this.options.markerZoomAnimation) {
+ L.DomUtil.addClass(panes.markerPane, zoomHide);
+ L.DomUtil.addClass(panes.shadowPane, zoomHide);
+ L.DomUtil.addClass(panes.popupPane, zoomHide);
+ }
+ },
+
+ _createPane: function (className, container) {
+ return L.DomUtil.create('div', className, container || this._panes.objectsPane);
+ },
+
+ _clearPanes: function () {
+ this._container.removeChild(this._mapPane);
+ },
+
+ _addLayers: function (layers) {
+ layers = layers ? (L.Util.isArray(layers) ? layers : [layers]) : [];
+
+ for (var i = 0, len = layers.length; i < len; i++) {
+ this.addLayer(layers[i]);
+ }
+ },
+
+
+ // private methods that modify map state
+
+ _resetView: function (center, zoom, preserveMapOffset, afterZoomAnim) {
+
+ var zoomChanged = (this._zoom !== zoom);
+
+ if (!afterZoomAnim) {
+ this.fire('movestart');
+
+ if (zoomChanged) {
+ this.fire('zoomstart');
+ }
+ }
+
+ this._zoom = zoom;
+ this._initialCenter = center;
+
+ this._initialTopLeftPoint = this._getNewTopLeftPoint(center);
+
+ if (!preserveMapOffset) {
+ L.DomUtil.setPosition(this._mapPane, new L.Point(0, 0));
+ } else {
+ this._initialTopLeftPoint._add(this._getMapPanePos());
+ }
+
+ this._tileLayersToLoad = this._tileLayersNum;
+
+ var loading = !this._loaded;
+ this._loaded = true;
+
+ this.fire('viewreset', {hard: !preserveMapOffset});
+
+ if (loading) {
+ this.fire('load');
+ this.eachLayer(this._layerAdd, this);
+ }
+
+ this.fire('move');
+
+ if (zoomChanged || afterZoomAnim) {
+ this.fire('zoomend');
+ }
+
+ this.fire('moveend', {hard: !preserveMapOffset});
+ },
+
+ _rawPanBy: function (offset) {
+ L.DomUtil.setPosition(this._mapPane, this._getMapPanePos().subtract(offset));
+ },
+
+ _getZoomSpan: function () {
+ return this.getMaxZoom() - this.getMinZoom();
+ },
+
+ _updateZoomLevels: function () {
+ var i,
+ minZoom = Infinity,
+ maxZoom = -Infinity,
+ oldZoomSpan = this._getZoomSpan();
+
+ for (i in this._zoomBoundLayers) {
+ var layer = this._zoomBoundLayers[i];
+ if (!isNaN(layer.options.minZoom)) {
+ minZoom = Math.min(minZoom, layer.options.minZoom);
+ }
+ if (!isNaN(layer.options.maxZoom)) {
+ maxZoom = Math.max(maxZoom, layer.options.maxZoom);
+ }
+ }
+
+ if (i === undefined) { // we have no tilelayers
+ this._layersMaxZoom = this._layersMinZoom = undefined;
+ } else {
+ this._layersMaxZoom = maxZoom;
+ this._layersMinZoom = minZoom;
+ }
+
+ if (oldZoomSpan !== this._getZoomSpan()) {
+ this.fire('zoomlevelschange');
+ }
+ },
+
+ _panInsideMaxBounds: function () {
+ this.panInsideBounds(this.options.maxBounds);
+ },
+
+ _checkIfLoaded: function () {
+ if (!this._loaded) {
+ throw new Error('Set map center and zoom first.');
+ }
+ },
+
+ // map events
+
+ _initEvents: function (onOff) {
+ if (!L.DomEvent) { return; }
+
+ onOff = onOff || 'on';
+
+ L.DomEvent[onOff](this._container, 'click', this._onMouseClick, this);
+
+ var events = ['dblclick', 'mousedown', 'mouseup', 'mouseenter',
+ 'mouseleave', 'mousemove', 'contextmenu'],
+ i, len;
+
+ for (i = 0, len = events.length; i < len; i++) {
+ L.DomEvent[onOff](this._container, events[i], this._fireMouseEvent, this);
+ }
+
+ if (this.options.trackResize) {
+ L.DomEvent[onOff](window, 'resize', this._onResize, this);
+ }
+ },
+
+ _onResize: function () {
+ L.Util.cancelAnimFrame(this._resizeRequest);
+ this._resizeRequest = L.Util.requestAnimFrame(
+ function () { this.invalidateSize({debounceMoveend: true}); }, this, false, this._container);
+ },
+
+ _onMouseClick: function (e) {
+ if (!this._loaded || (!e._simulated &&
+ ((this.dragging && this.dragging.moved()) ||
+ (this.boxZoom && this.boxZoom.moved()))) ||
+ L.DomEvent._skipped(e)) { return; }
+
+ this.fire('preclick');
+ this._fireMouseEvent(e);
+ },
+
+ _fireMouseEvent: function (e) {
+ if (!this._loaded || L.DomEvent._skipped(e)) { return; }
+
+ var type = e.type;
+
+ type = (type === 'mouseenter' ? 'mouseover' : (type === 'mouseleave' ? 'mouseout' : type));
+
+ if (!this.hasEventListeners(type)) { return; }
+
+ if (type === 'contextmenu') {
+ L.DomEvent.preventDefault(e);
+ }
+
+ var containerPoint = this.mouseEventToContainerPoint(e),
+ layerPoint = this.containerPointToLayerPoint(containerPoint),
+ latlng = this.layerPointToLatLng(layerPoint);
+
+ this.fire(type, {
+ latlng: latlng,
+ layerPoint: layerPoint,
+ containerPoint: containerPoint,
+ originalEvent: e
+ });
+ },
+
+ _onTileLayerLoad: function () {
+ this._tileLayersToLoad--;
+ if (this._tileLayersNum && !this._tileLayersToLoad) {
+ this.fire('tilelayersload');
+ }
+ },
+
+ _clearHandlers: function () {
+ for (var i = 0, len = this._handlers.length; i < len; i++) {
+ this._handlers[i].disable();
+ }
+ },
+
+ whenReady: function (callback, context) {
+ if (this._loaded) {
+ callback.call(context || this, this);
+ } else {
+ this.on('load', callback, context);
+ }
+ return this;
+ },
+
+ _layerAdd: function (layer) {
+ layer.onAdd(this);
+ this.fire('layeradd', {layer: layer});
+ },
+
+
+ // private methods for getting map state
+
+ _getMapPanePos: function () {
+ return L.DomUtil.getPosition(this._mapPane);
+ },
+
+ _moved: function () {
+ var pos = this._getMapPanePos();
+ return pos && !pos.equals([0, 0]);
+ },
+
+ _getTopLeftPoint: function () {
+ return this.getPixelOrigin().subtract(this._getMapPanePos());
+ },
+
+ _getNewTopLeftPoint: function (center, zoom) {
+ var viewHalf = this.getSize()._divideBy(2);
+ // TODO round on display, not calculation to increase precision?
+ return this.project(center, zoom)._subtract(viewHalf)._round();
+ },
+
+ _latLngToNewLayerPoint: function (latlng, newZoom, newCenter) {
+ var topLeft = this._getNewTopLeftPoint(newCenter, newZoom).add(this._getMapPanePos());
+ return this.project(latlng, newZoom)._subtract(topLeft);
+ },
+
+ // layer point of the current center
+ _getCenterLayerPoint: function () {
+ return this.containerPointToLayerPoint(this.getSize()._divideBy(2));
+ },
+
+ // offset of the specified place to the current center in pixels
+ _getCenterOffset: function (latlng) {
+ return this.latLngToLayerPoint(latlng).subtract(this._getCenterLayerPoint());
+ },
+
+ // adjust center for view to get inside bounds
+ _limitCenter: function (center, zoom, bounds) {
+
+ if (!bounds) { return center; }
+
+ var centerPoint = this.project(center, zoom),
+ viewHalf = this.getSize().divideBy(2),
+ viewBounds = new L.Bounds(centerPoint.subtract(viewHalf), centerPoint.add(viewHalf)),
+ offset = this._getBoundsOffset(viewBounds, bounds, zoom);
+
+ return this.unproject(centerPoint.add(offset), zoom);
+ },
+
+ // adjust offset for view to get inside bounds
+ _limitOffset: function (offset, bounds) {
+ if (!bounds) { return offset; }
+
+ var viewBounds = this.getPixelBounds(),
+ newBounds = new L.Bounds(viewBounds.min.add(offset), viewBounds.max.add(offset));
+
+ return offset.add(this._getBoundsOffset(newBounds, bounds));
+ },
+
+ // returns offset needed for pxBounds to get inside maxBounds at a specified zoom
+ _getBoundsOffset: function (pxBounds, maxBounds, zoom) {
+ var nwOffset = this.project(maxBounds.getNorthWest(), zoom).subtract(pxBounds.min),
+ seOffset = this.project(maxBounds.getSouthEast(), zoom).subtract(pxBounds.max),
+
+ dx = this._rebound(nwOffset.x, -seOffset.x),
+ dy = this._rebound(nwOffset.y, -seOffset.y);
+
+ return new L.Point(dx, dy);
+ },
+
+ _rebound: function (left, right) {
+ return left + right > 0 ?
+ Math.round(left - right) / 2 :
+ Math.max(0, Math.ceil(left)) - Math.max(0, Math.floor(right));
+ },
+
+ _limitZoom: function (zoom) {
+ var min = this.getMinZoom(),
+ max = this.getMaxZoom();
+
+ return Math.max(min, Math.min(max, zoom));
+ }
+});
+
+L.map = function (id, options) {
+ return new L.Map(id, options);
+};
+
+
+/*
+ * Mercator projection that takes into account that the Earth is not a perfect sphere.
+ * Less popular than spherical mercator; used by projections like EPSG:3395.
+ */
+
+L.Projection.Mercator = {
+ MAX_LATITUDE: 85.0840591556,
+
+ R_MINOR: 6356752.314245179,
+ R_MAJOR: 6378137,
+
+ project: function (latlng) { // (LatLng) -> Point
+ var d = L.LatLng.DEG_TO_RAD,
+ max = this.MAX_LATITUDE,
+ lat = Math.max(Math.min(max, latlng.lat), -max),
+ r = this.R_MAJOR,
+ r2 = this.R_MINOR,
+ x = latlng.lng * d * r,
+ y = lat * d,
+ tmp = r2 / r,
+ eccent = Math.sqrt(1.0 - tmp * tmp),
+ con = eccent * Math.sin(y);
+
+ con = Math.pow((1 - con) / (1 + con), eccent * 0.5);
+
+ var ts = Math.tan(0.5 * ((Math.PI * 0.5) - y)) / con;
+ y = -r * Math.log(ts);
+
+ return new L.Point(x, y);
+ },
+
+ unproject: function (point) { // (Point, Boolean) -> LatLng
+ var d = L.LatLng.RAD_TO_DEG,
+ r = this.R_MAJOR,
+ r2 = this.R_MINOR,
+ lng = point.x * d / r,
+ tmp = r2 / r,
+ eccent = Math.sqrt(1 - (tmp * tmp)),
+ ts = Math.exp(- point.y / r),
+ phi = (Math.PI / 2) - 2 * Math.atan(ts),
+ numIter = 15,
+ tol = 1e-7,
+ i = numIter,
+ dphi = 0.1,
+ con;
+
+ while ((Math.abs(dphi) > tol) && (--i > 0)) {
+ con = eccent * Math.sin(phi);
+ dphi = (Math.PI / 2) - 2 * Math.atan(ts *
+ Math.pow((1.0 - con) / (1.0 + con), 0.5 * eccent)) - phi;
+ phi += dphi;
+ }
+
+ return new L.LatLng(phi * d, lng);
+ }
+};
+
+
+
+L.CRS.EPSG3395 = L.extend({}, L.CRS, {
+ code: 'EPSG:3395',
+
+ projection: L.Projection.Mercator,
+
+ transformation: (function () {
+ var m = L.Projection.Mercator,
+ r = m.R_MAJOR,
+ scale = 0.5 / (Math.PI * r);
+
+ return new L.Transformation(scale, 0.5, -scale, 0.5);
+ }())
+});
+
+
+/*
+ * L.TileLayer is used for standard xyz-numbered tile layers.
+ */
+
+L.TileLayer = L.Class.extend({
+ includes: L.Mixin.Events,
+
+ options: {
+ minZoom: 0,
+ maxZoom: 18,
+ tileSize: 256,
+ subdomains: 'abc',
+ errorTileUrl: '',
+ attribution: '',
+ zoomOffset: 0,
+ opacity: 1,
+ /*
+ maxNativeZoom: null,
+ zIndex: null,
+ tms: false,
+ continuousWorld: false,
+ noWrap: false,
+ zoomReverse: false,
+ detectRetina: false,
+ reuseTiles: false,
+ bounds: false,
+ */
+ unloadInvisibleTiles: L.Browser.mobile,
+ updateWhenIdle: L.Browser.mobile
+ },
+
+ initialize: function (url, options) {
+ options = L.setOptions(this, options);
+
+ // detecting retina displays, adjusting tileSize and zoom levels
+ if (options.detectRetina && L.Browser.retina && options.maxZoom > 0) {
+
+ options.tileSize = Math.floor(options.tileSize / 2);
+ options.zoomOffset++;
+
+ if (options.minZoom > 0) {
+ options.minZoom--;
+ }
+ this.options.maxZoom--;
+ }
+
+ if (options.bounds) {
+ options.bounds = L.latLngBounds(options.bounds);
+ }
+
+ this._url = url;
+
+ var subdomains = this.options.subdomains;
+
+ if (typeof subdomains === 'string') {
+ this.options.subdomains = subdomains.split('');
+ }
+ },
+
+ onAdd: function (map) {
+ this._map = map;
+ this._animated = map._zoomAnimated;
+
+ // create a container div for tiles
+ this._initContainer();
+
+ // set up events
+ map.on({
+ 'viewreset': this._reset,
+ 'moveend': this._update
+ }, this);
+
+ if (this._animated) {
+ map.on({
+ 'zoomanim': this._animateZoom,
+ 'zoomend': this._endZoomAnim
+ }, this);
+ }
+
+ if (!this.options.updateWhenIdle) {
+ this._limitedUpdate = L.Util.limitExecByInterval(this._update, 150, this);
+ map.on('move', this._limitedUpdate, this);
+ }
+
+ this._reset();
+ this._update();
+ },
+
+ addTo: function (map) {
+ map.addLayer(this);
+ return this;
+ },
+
+ onRemove: function (map) {
+ this._container.parentNode.removeChild(this._container);
+
+ map.off({
+ 'viewreset': this._reset,
+ 'moveend': this._update
+ }, this);
+
+ if (this._animated) {
+ map.off({
+ 'zoomanim': this._animateZoom,
+ 'zoomend': this._endZoomAnim
+ }, this);
+ }
+
+ if (!this.options.updateWhenIdle) {
+ map.off('move', this._limitedUpdate, this);
+ }
+
+ this._container = null;
+ this._map = null;
+ },
+
+ bringToFront: function () {
+ var pane = this._map._panes.tilePane;
+
+ if (this._container) {
+ pane.appendChild(this._container);
+ this._setAutoZIndex(pane, Math.max);
+ }
+
+ return this;
+ },
+
+ bringToBack: function () {
+ var pane = this._map._panes.tilePane;
+
+ if (this._container) {
+ pane.insertBefore(this._container, pane.firstChild);
+ this._setAutoZIndex(pane, Math.min);
+ }
+
+ return this;
+ },
+
+ getAttribution: function () {
+ return this.options.attribution;
+ },
+
+ getContainer: function () {
+ return this._container;
+ },
+
+ setOpacity: function (opacity) {
+ this.options.opacity = opacity;
+
+ if (this._map) {
+ this._updateOpacity();
+ }
+
+ return this;
+ },
+
+ setZIndex: function (zIndex) {
+ this.options.zIndex = zIndex;
+ this._updateZIndex();
+
+ return this;
+ },
+
+ setUrl: function (url, noRedraw) {
+ this._url = url;
+
+ if (!noRedraw) {
+ this.redraw();
+ }
+
+ return this;
+ },
+
+ redraw: function () {
+ if (this._map) {
+ this._reset({hard: true});
+ this._update();
+ }
+ return this;
+ },
+
+ _updateZIndex: function () {
+ if (this._container && this.options.zIndex !== undefined) {
+ this._container.style.zIndex = this.options.zIndex;
+ }
+ },
+
+ _setAutoZIndex: function (pane, compare) {
+
+ var layers = pane.children,
+ edgeZIndex = -compare(Infinity, -Infinity), // -Infinity for max, Infinity for min
+ zIndex, i, len;
+
+ for (i = 0, len = layers.length; i < len; i++) {
+
+ if (layers[i] !== this._container) {
+ zIndex = parseInt(layers[i].style.zIndex, 10);
+
+ if (!isNaN(zIndex)) {
+ edgeZIndex = compare(edgeZIndex, zIndex);
+ }
+ }
+ }
+
+ this.options.zIndex = this._container.style.zIndex =
+ (isFinite(edgeZIndex) ? edgeZIndex : 0) + compare(1, -1);
+ },
+
+ _updateOpacity: function () {
+ var i,
+ tiles = this._tiles;
+
+ if (L.Browser.ielt9) {
+ for (i in tiles) {
+ L.DomUtil.setOpacity(tiles[i], this.options.opacity);
+ }
+ } else {
+ L.DomUtil.setOpacity(this._container, this.options.opacity);
+ }
+ },
+
+ _initContainer: function () {
+ var tilePane = this._map._panes.tilePane;
+
+ if (!this._container) {
+ this._container = L.DomUtil.create('div', 'leaflet-layer');
+
+ this._updateZIndex();
+
+ if (this._animated) {
+ var className = 'leaflet-tile-container';
+
+ this._bgBuffer = L.DomUtil.create('div', className, this._container);
+ this._tileContainer = L.DomUtil.create('div', className, this._container);
+
+ } else {
+ this._tileContainer = this._container;
+ }
+
+ tilePane.appendChild(this._container);
+
+ if (this.options.opacity < 1) {
+ this._updateOpacity();
+ }
+ }
+ },
+
+ _reset: function (e) {
+ for (var key in this._tiles) {
+ this.fire('tileunload', {tile: this._tiles[key]});
+ }
+
+ this._tiles = {};
+ this._tilesToLoad = 0;
+
+ if (this.options.reuseTiles) {
+ this._unusedTiles = [];
+ }
+
+ this._tileContainer.innerHTML = '';
+
+ if (this._animated && e && e.hard) {
+ this._clearBgBuffer();
+ }
+
+ this._initContainer();
+ },
+
+ _getTileSize: function () {
+ var map = this._map,
+ zoom = map.getZoom() + this.options.zoomOffset,
+ zoomN = this.options.maxNativeZoom,
+ tileSize = this.options.tileSize;
+
+ if (zoomN && zoom > zoomN) {
+ tileSize = Math.round(map.getZoomScale(zoom) / map.getZoomScale(zoomN) * tileSize);
+ }
+
+ return tileSize;
+ },
+
+ _update: function () {
+
+ if (!this._map) { return; }
+
+ var map = this._map,
+ bounds = map.getPixelBounds(),
+ zoom = map.getZoom(),
+ tileSize = this._getTileSize();
+
+ if (zoom > this.options.maxZoom || zoom < this.options.minZoom) {
+ return;
+ }
+
+ var tileBounds = L.bounds(
+ bounds.min.divideBy(tileSize)._floor(),
+ bounds.max.divideBy(tileSize)._floor());
+
+ this._addTilesFromCenterOut(tileBounds);
+
+ if (this.options.unloadInvisibleTiles || this.options.reuseTiles) {
+ this._removeOtherTiles(tileBounds);
+ }
+ },
+
+ _addTilesFromCenterOut: function (bounds) {
+ var queue = [],
+ center = bounds.getCenter();
+
+ var j, i, point;
+
+ for (j = bounds.min.y; j <= bounds.max.y; j++) {
+ for (i = bounds.min.x; i <= bounds.max.x; i++) {
+ point = new L.Point(i, j);
+
+ if (this._tileShouldBeLoaded(point)) {
+ queue.push(point);
+ }
+ }
+ }
+
+ var tilesToLoad = queue.length;
+
+ if (tilesToLoad === 0) { return; }
+
+ // load tiles in order of their distance to center
+ queue.sort(function (a, b) {
+ return a.distanceTo(center) - b.distanceTo(center);
+ });
+
+ var fragment = document.createDocumentFragment();
+
+ // if its the first batch of tiles to load
+ if (!this._tilesToLoad) {
+ this.fire('loading');
+ }
+
+ this._tilesToLoad += tilesToLoad;
+
+ for (i = 0; i < tilesToLoad; i++) {
+ this._addTile(queue[i], fragment);
+ }
+
+ this._tileContainer.appendChild(fragment);
+ },
+
+ _tileShouldBeLoaded: function (tilePoint) {
+ if ((tilePoint.x + ':' + tilePoint.y) in this._tiles) {
+ return false; // already loaded
+ }
+
+ var options = this.options;
+
+ if (!options.continuousWorld) {
+ var limit = this._getWrapTileNum();
+
+ // don't load if exceeds world bounds
+ if ((options.noWrap && (tilePoint.x < 0 || tilePoint.x >= limit.x)) ||
+ tilePoint.y < 0 || tilePoint.y >= limit.y) { return false; }
+ }
+
+ if (options.bounds) {
+ var tileSize = this._getTileSize(),
+ nwPoint = tilePoint.multiplyBy(tileSize),
+ sePoint = nwPoint.add([tileSize, tileSize]),
+ nw = this._map.unproject(nwPoint),
+ se = this._map.unproject(sePoint);
+
+ // TODO temporary hack, will be removed after refactoring projections
+ // https://github.com/Leaflet/Leaflet/issues/1618
+ if (!options.continuousWorld && !options.noWrap) {
+ nw = nw.wrap();
+ se = se.wrap();
+ }
+
+ if (!options.bounds.intersects([nw, se])) { return false; }
+ }
+
+ return true;
+ },
+
+ _removeOtherTiles: function (bounds) {
+ var kArr, x, y, key;
+
+ for (key in this._tiles) {
+ kArr = key.split(':');
+ x = parseInt(kArr[0], 10);
+ y = parseInt(kArr[1], 10);
+
+ // remove tile if it's out of bounds
+ if (x < bounds.min.x || x > bounds.max.x || y < bounds.min.y || y > bounds.max.y) {
+ this._removeTile(key);
+ }
+ }
+ },
+
+ _removeTile: function (key) {
+ var tile = this._tiles[key];
+
+ this.fire('tileunload', {tile: tile, url: tile.src});
+
+ if (this.options.reuseTiles) {
+ L.DomUtil.removeClass(tile, 'leaflet-tile-loaded');
+ this._unusedTiles.push(tile);
+
+ } else if (tile.parentNode === this._tileContainer) {
+ this._tileContainer.removeChild(tile);
+ }
+
+ // for https://github.com/CloudMade/Leaflet/issues/137
+ if (!L.Browser.android) {
+ tile.onload = null;
+ tile.src = L.Util.emptyImageUrl;
+ }
+
+ delete this._tiles[key];
+ },
+
+ _addTile: function (tilePoint, container) {
+ var tilePos = this._getTilePos(tilePoint);
+
+ // get unused tile - or create a new tile
+ var tile = this._getTile();
+
+ /*
+ Chrome 20 layouts much faster with top/left (verify with timeline, frames)
+ Android 4 browser has display issues with top/left and requires transform instead
+ (other browsers don't currently care) - see debug/hacks/jitter.html for an example
+ */
+ L.DomUtil.setPosition(tile, tilePos, L.Browser.chrome);
+
+ this._tiles[tilePoint.x + ':' + tilePoint.y] = tile;
+
+ this._loadTile(tile, tilePoint);
+
+ if (tile.parentNode !== this._tileContainer) {
+ container.appendChild(tile);
+ }
+ },
+
+ _getZoomForUrl: function () {
+
+ var options = this.options,
+ zoom = this._map.getZoom();
+
+ if (options.zoomReverse) {
+ zoom = options.maxZoom - zoom;
+ }
+
+ zoom += options.zoomOffset;
+
+ return options.maxNativeZoom ? Math.min(zoom, options.maxNativeZoom) : zoom;
+ },
+
+ _getTilePos: function (tilePoint) {
+ var origin = this._map.getPixelOrigin(),
+ tileSize = this._getTileSize();
+
+ return tilePoint.multiplyBy(tileSize).subtract(origin);
+ },
+
+ // image-specific code (override to implement e.g. Canvas or SVG tile layer)
+
+ getTileUrl: function (tilePoint) {
+ return L.Util.template(this._url, L.extend({
+ s: this._getSubdomain(tilePoint),
+ z: tilePoint.z,
+ x: tilePoint.x,
+ y: tilePoint.y
+ }, this.options));
+ },
+
+ _getWrapTileNum: function () {
+ var crs = this._map.options.crs,
+ size = crs.getSize(this._map.getZoom());
+ return size.divideBy(this._getTileSize())._floor();
+ },
+
+ _adjustTilePoint: function (tilePoint) {
+
+ var limit = this._getWrapTileNum();
+
+ // wrap tile coordinates
+ if (!this.options.continuousWorld && !this.options.noWrap) {
+ tilePoint.x = ((tilePoint.x % limit.x) + limit.x) % limit.x;
+ }
+
+ if (this.options.tms) {
+ tilePoint.y = limit.y - tilePoint.y - 1;
+ }
+
+ tilePoint.z = this._getZoomForUrl();
+ },
+
+ _getSubdomain: function (tilePoint) {
+ var index = Math.abs(tilePoint.x + tilePoint.y) % this.options.subdomains.length;
+ return this.options.subdomains[index];
+ },
+
+ _getTile: function () {
+ if (this.options.reuseTiles && this._unusedTiles.length > 0) {
+ var tile = this._unusedTiles.pop();
+ this._resetTile(tile);
+ return tile;
+ }
+ return this._createTile();
+ },
+
+ // Override if data stored on a tile needs to be cleaned up before reuse
+ _resetTile: function (/*tile*/) {},
+
+ _createTile: function () {
+ var tile = L.DomUtil.create('img', 'leaflet-tile');
+ tile.style.width = tile.style.height = this._getTileSize() + 'px';
+ tile.galleryimg = 'no';
+
+ tile.onselectstart = tile.onmousemove = L.Util.falseFn;
+
+ if (L.Browser.ielt9 && this.options.opacity !== undefined) {
+ L.DomUtil.setOpacity(tile, this.options.opacity);
+ }
+ // without this hack, tiles disappear after zoom on Chrome for Android
+ // https://github.com/Leaflet/Leaflet/issues/2078
+ if (L.Browser.mobileWebkit3d) {
+ tile.style.WebkitBackfaceVisibility = 'hidden';
+ }
+ return tile;
+ },
+
+ _loadTile: function (tile, tilePoint) {
+ tile._layer = this;
+ tile.onload = this._tileOnLoad;
+ tile.onerror = this._tileOnError;
+
+ this._adjustTilePoint(tilePoint);
+ tile.src = this.getTileUrl(tilePoint);
+
+ this.fire('tileloadstart', {
+ tile: tile,
+ url: tile.src
+ });
+ },
+
+ _tileLoaded: function () {
+ this._tilesToLoad--;
+
+ if (this._animated) {
+ L.DomUtil.addClass(this._tileContainer, 'leaflet-zoom-animated');
+ }
+
+ if (!this._tilesToLoad) {
+ this.fire('load');
+
+ if (this._animated) {
+ // clear scaled tiles after all new tiles are loaded (for performance)
+ clearTimeout(this._clearBgBufferTimer);
+ this._clearBgBufferTimer = setTimeout(L.bind(this._clearBgBuffer, this), 500);
+ }
+ }
+ },
+
+ _tileOnLoad: function () {
+ var layer = this._layer;
+
+ //Only if we are loading an actual image
+ if (this.src !== L.Util.emptyImageUrl) {
+ L.DomUtil.addClass(this, 'leaflet-tile-loaded');
+
+ layer.fire('tileload', {
+ tile: this,
+ url: this.src
+ });
+ }
+
+ layer._tileLoaded();
+ },
+
+ _tileOnError: function () {
+ var layer = this._layer;
+
+ layer.fire('tileerror', {
+ tile: this,
+ url: this.src
+ });
+
+ var newUrl = layer.options.errorTileUrl;
+ if (newUrl) {
+ this.src = newUrl;
+ }
+
+ layer._tileLoaded();
+ }
+});
+
+L.tileLayer = function (url, options) {
+ return new L.TileLayer(url, options);
+};
+
+
+/*
+ * L.TileLayer.WMS is used for putting WMS tile layers on the map.
+ */
+
+L.TileLayer.WMS = L.TileLayer.extend({
+
+ defaultWmsParams: {
+ service: 'WMS',
+ request: 'GetMap',
+ version: '1.1.1',
+ layers: '',
+ styles: '',
+ format: 'image/jpeg',
+ transparent: false
+ },
+
+ initialize: function (url, options) { // (String, Object)
+
+ this._url = url;
+
+ var wmsParams = L.extend({}, this.defaultWmsParams),
+ tileSize = options.tileSize || this.options.tileSize;
+
+ if (options.detectRetina && L.Browser.retina) {
+ wmsParams.width = wmsParams.height = tileSize * 2;
+ } else {
+ wmsParams.width = wmsParams.height = tileSize;
+ }
+
+ for (var i in options) {
+ // all keys that are not TileLayer options go to WMS params
+ if (!this.options.hasOwnProperty(i) && i !== 'crs') {
+ wmsParams[i] = options[i];
+ }
+ }
+
+ this.wmsParams = wmsParams;
+
+ L.setOptions(this, options);
+ },
+
+ onAdd: function (map) {
+
+ this._crs = this.options.crs || map.options.crs;
+
+ this._wmsVersion = parseFloat(this.wmsParams.version);
+
+ var projectionKey = this._wmsVersion >= 1.3 ? 'crs' : 'srs';
+ this.wmsParams[projectionKey] = this._crs.code;
+
+ L.TileLayer.prototype.onAdd.call(this, map);
+ },
+
+ getTileUrl: function (tilePoint) { // (Point, Number) -> String
+
+ var map = this._map,
+ tileSize = this.options.tileSize,
+
+ nwPoint = tilePoint.multiplyBy(tileSize),
+ sePoint = nwPoint.add([tileSize, tileSize]),
+
+ nw = this._crs.project(map.unproject(nwPoint, tilePoint.z)),
+ se = this._crs.project(map.unproject(sePoint, tilePoint.z)),
+ bbox = this._wmsVersion >= 1.3 && this._crs === L.CRS.EPSG4326 ?
+ [se.y, nw.x, nw.y, se.x].join(',') :
+ [nw.x, se.y, se.x, nw.y].join(','),
+
+ url = L.Util.template(this._url, {s: this._getSubdomain(tilePoint)});
+
+ return url + L.Util.getParamString(this.wmsParams, url, true) + '&BBOX=' + bbox;
+ },
+
+ setParams: function (params, noRedraw) {
+
+ L.extend(this.wmsParams, params);
+
+ if (!noRedraw) {
+ this.redraw();
+ }
+
+ return this;
+ }
+});
+
+L.tileLayer.wms = function (url, options) {
+ return new L.TileLayer.WMS(url, options);
+};
+
+
+/*
+ * L.TileLayer.Canvas is a class that you can use as a base for creating
+ * dynamically drawn Canvas-based tile layers.
+ */
+
+L.TileLayer.Canvas = L.TileLayer.extend({
+ options: {
+ async: false
+ },
+
+ initialize: function (options) {
+ L.setOptions(this, options);
+ },
+
+ redraw: function () {
+ if (this._map) {
+ this._reset({hard: true});
+ this._update();
+ }
+
+ for (var i in this._tiles) {
+ this._redrawTile(this._tiles[i]);
+ }
+ return this;
+ },
+
+ _redrawTile: function (tile) {
+ this.drawTile(tile, tile._tilePoint, this._map._zoom);
+ },
+
+ _createTile: function () {
+ var tile = L.DomUtil.create('canvas', 'leaflet-tile');
+ tile.width = tile.height = this.options.tileSize;
+ tile.onselectstart = tile.onmousemove = L.Util.falseFn;
+ return tile;
+ },
+
+ _loadTile: function (tile, tilePoint) {
+ tile._layer = this;
+ tile._tilePoint = tilePoint;
+
+ this._redrawTile(tile);
+
+ if (!this.options.async) {
+ this.tileDrawn(tile);
+ }
+ },
+
+ drawTile: function (/*tile, tilePoint*/) {
+ // override with rendering code
+ },
+
+ tileDrawn: function (tile) {
+ this._tileOnLoad.call(tile);
+ }
+});
+
+
+L.tileLayer.canvas = function (options) {
+ return new L.TileLayer.Canvas(options);
+};
+
+
+/*
+ * L.ImageOverlay is used to overlay images over the map (to specific geographical bounds).
+ */
+
+L.ImageOverlay = L.Class.extend({
+ includes: L.Mixin.Events,
+
+ options: {
+ opacity: 1
+ },
+
+ initialize: function (url, bounds, options) { // (String, LatLngBounds, Object)
+ this._url = url;
+ this._bounds = L.latLngBounds(bounds);
+
+ L.setOptions(this, options);
+ },
+
+ onAdd: function (map) {
+ this._map = map;
+
+ if (!this._image) {
+ this._initImage();
+ }
+
+ map._panes.overlayPane.appendChild(this._image);
+
+ map.on('viewreset', this._reset, this);
+
+ if (map.options.zoomAnimation && L.Browser.any3d) {
+ map.on('zoomanim', this._animateZoom, this);
+ }
+
+ this._reset();
+ },
+
+ onRemove: function (map) {
+ map.getPanes().overlayPane.removeChild(this._image);
+
+ map.off('viewreset', this._reset, this);
+
+ if (map.options.zoomAnimation) {
+ map.off('zoomanim', this._animateZoom, this);
+ }
+ },
+
+ addTo: function (map) {
+ map.addLayer(this);
+ return this;
+ },
+
+ setOpacity: function (opacity) {
+ this.options.opacity = opacity;
+ this._updateOpacity();
+ return this;
+ },
+
+ // TODO remove bringToFront/bringToBack duplication from TileLayer/Path
+ bringToFront: function () {
+ if (this._image) {
+ this._map._panes.overlayPane.appendChild(this._image);
+ }
+ return this;
+ },
+
+ bringToBack: function () {
+ var pane = this._map._panes.overlayPane;
+ if (this._image) {
+ pane.insertBefore(this._image, pane.firstChild);
+ }
+ return this;
+ },
+
+ setUrl: function (url) {
+ this._url = url;
+ this._image.src = this._url;
+ },
+
+ getAttribution: function () {
+ return this.options.attribution;
+ },
+
+ _initImage: function () {
+ this._image = L.DomUtil.create('img', 'leaflet-image-layer');
+
+ if (this._map.options.zoomAnimation && L.Browser.any3d) {
+ L.DomUtil.addClass(this._image, 'leaflet-zoom-animated');
+ } else {
+ L.DomUtil.addClass(this._image, 'leaflet-zoom-hide');
+ }
+
+ this._updateOpacity();
+
+ //TODO createImage util method to remove duplication
+ L.extend(this._image, {
+ galleryimg: 'no',
+ onselectstart: L.Util.falseFn,
+ onmousemove: L.Util.falseFn,
+ onload: L.bind(this._onImageLoad, this),
+ src: this._url
+ });
+ },
+
+ _animateZoom: function (e) {
+ var map = this._map,
+ image = this._image,
+ scale = map.getZoomScale(e.zoom),
+ nw = this._bounds.getNorthWest(),
+ se = this._bounds.getSouthEast(),
+
+ topLeft = map._latLngToNewLayerPoint(nw, e.zoom, e.center),
+ size = map._latLngToNewLayerPoint(se, e.zoom, e.center)._subtract(topLeft),
+ origin = topLeft._add(size._multiplyBy((1 / 2) * (1 - 1 / scale)));
+
+ image.style[L.DomUtil.TRANSFORM] =
+ L.DomUtil.getTranslateString(origin) + ' scale(' + scale + ') ';
+ },
+
+ _reset: function () {
+ var image = this._image,
+ topLeft = this._map.latLngToLayerPoint(this._bounds.getNorthWest()),
+ size = this._map.latLngToLayerPoint(this._bounds.getSouthEast())._subtract(topLeft);
+
+ L.DomUtil.setPosition(image, topLeft);
+
+ image.style.width = size.x + 'px';
+ image.style.height = size.y + 'px';
+ },
+
+ _onImageLoad: function () {
+ this.fire('load');
+ },
+
+ _updateOpacity: function () {
+ L.DomUtil.setOpacity(this._image, this.options.opacity);
+ }
+});
+
+L.imageOverlay = function (url, bounds, options) {
+ return new L.ImageOverlay(url, bounds, options);
+};
+
+
+/*
+ * L.Icon is an image-based icon class that you can use with L.Marker for custom markers.
+ */
+
+L.Icon = L.Class.extend({
+ options: {
+ /*
+ iconUrl: (String) (required)
+ iconRetinaUrl: (String) (optional, used for retina devices if detected)
+ iconSize: (Point) (can be set through CSS)
+ iconAnchor: (Point) (centered by default, can be set in CSS with negative margins)
+ popupAnchor: (Point) (if not specified, popup opens in the anchor point)
+ shadowUrl: (String) (no shadow by default)
+ shadowRetinaUrl: (String) (optional, used for retina devices if detected)
+ shadowSize: (Point)
+ shadowAnchor: (Point)
+ */
+ className: ''
+ },
+
+ initialize: function (options) {
+ L.setOptions(this, options);
+ },
+
+ createIcon: function (oldIcon) {
+ return this._createIcon('icon', oldIcon);
+ },
+
+ createShadow: function (oldIcon) {
+ return this._createIcon('shadow', oldIcon);
+ },
+
+ _createIcon: function (name, oldIcon) {
+ var src = this._getIconUrl(name);
+
+ if (!src) {
+ if (name === 'icon') {
+ throw new Error('iconUrl not set in Icon options (see the docs).');
+ }
+ return null;
+ }
+
+ var img;
+ if (!oldIcon || oldIcon.tagName !== 'IMG') {
+ img = this._createImg(src);
+ } else {
+ img = this._createImg(src, oldIcon);
+ }
+ this._setIconStyles(img, name);
+
+ return img;
+ },
+
+ _setIconStyles: function (img, name) {
+ var options = this.options,
+ size = L.point(options[name + 'Size']),
+ anchor;
+
+ if (name === 'shadow') {
+ anchor = L.point(options.shadowAnchor || options.iconAnchor);
+ } else {
+ anchor = L.point(options.iconAnchor);
+ }
+
+ if (!anchor && size) {
+ anchor = size.divideBy(2, true);
+ }
+
+ img.className = 'leaflet-marker-' + name + ' ' + options.className;
+
+ if (anchor) {
+ img.style.marginLeft = (-anchor.x) + 'px';
+ img.style.marginTop = (-anchor.y) + 'px';
+ }
+
+ if (size) {
+ img.style.width = size.x + 'px';
+ img.style.height = size.y + 'px';
+ }
+ },
+
+ _createImg: function (src, el) {
+ el = el || document.createElement('img');
+ el.src = src;
+ return el;
+ },
+
+ _getIconUrl: function (name) {
+ if (L.Browser.retina && this.options[name + 'RetinaUrl']) {
+ return this.options[name + 'RetinaUrl'];
+ }
+ return this.options[name + 'Url'];
+ }
+});
+
+L.icon = function (options) {
+ return new L.Icon(options);
+};
+
+
+/*
+ * L.Icon.Default is the blue marker icon used by default in Leaflet.
+ */
+
+L.Icon.Default = L.Icon.extend({
+
+ options: {
+ iconSize: [25, 41],
+ iconAnchor: [12, 41],
+ popupAnchor: [1, -34],
+
+ shadowSize: [41, 41]
+ },
+
+ _getIconUrl: function (name) {
+ var key = name + 'Url';
+
+ if (this.options[key]) {
+ return this.options[key];
+ }
+
+ if (L.Browser.retina && name === 'icon') {
+ name += '-2x';
+ }
+
+ var path = L.Icon.Default.imagePath;
+
+ if (!path) {
+ throw new Error('Couldn\'t autodetect L.Icon.Default.imagePath, set it manually.');
+ }
+
+ return path + '/marker-' + name + '.png';
+ }
+});
+
+L.Icon.Default.imagePath = (function () {
+ var scripts = document.getElementsByTagName('script'),
+ leafletRe = /[\/^]leaflet[\-\._]?([\w\-\._]*)\.js\??/;
+
+ var i, len, src, matches, path;
+
+ for (i = 0, len = scripts.length; i < len; i++) {
+ src = scripts[i].src;
+ matches = src.match(leafletRe);
+
+ if (matches) {
+ path = src.split(leafletRe)[0];
+ return (path ? path + '/' : '') + 'images';
+ }
+ }
+}());
+
+
+/*
+ * L.Marker is used to display clickable/draggable icons on the map.
+ */
+
+L.Marker = L.Class.extend({
+
+ includes: L.Mixin.Events,
+
+ options: {
+ icon: new L.Icon.Default(),
+ title: '',
+ alt: '',
+ clickable: true,
+ draggable: false,
+ keyboard: true,
+ zIndexOffset: 0,
+ opacity: 1,
+ riseOnHover: false,
+ riseOffset: 250
+ },
+
+ initialize: function (latlng, options) {
+ L.setOptions(this, options);
+ this._latlng = L.latLng(latlng);
+ },
+
+ onAdd: function (map) {
+ this._map = map;
+
+ map.on('viewreset', this.update, this);
+
+ this._initIcon();
+ this.update();
+ this.fire('add');
+
+ if (map.options.zoomAnimation && map.options.markerZoomAnimation) {
+ map.on('zoomanim', this._animateZoom, this);
+ }
+ },
+
+ addTo: function (map) {
+ map.addLayer(this);
+ return this;
+ },
+
+ onRemove: function (map) {
+ if (this.dragging) {
+ this.dragging.disable();
+ }
+
+ this._removeIcon();
+ this._removeShadow();
+
+ this.fire('remove');
+
+ map.off({
+ 'viewreset': this.update,
+ 'zoomanim': this._animateZoom
+ }, this);
+
+ this._map = null;
+ },
+
+ getLatLng: function () {
+ return this._latlng;
+ },
+
+ setLatLng: function (latlng) {
+ this._latlng = L.latLng(latlng);
+
+ this.update();
+
+ return this.fire('move', { latlng: this._latlng });
+ },
+
+ setZIndexOffset: function (offset) {
+ this.options.zIndexOffset = offset;
+ this.update();
+
+ return this;
+ },
+
+ setIcon: function (icon) {
+
+ this.options.icon = icon;
+
+ if (this._map) {
+ this._initIcon();
+ this.update();
+ }
+
+ if (this._popup) {
+ this.bindPopup(this._popup);
+ }
+
+ return this;
+ },
+
+ update: function () {
+ if (this._icon) {
+ this._setPos(this._map.latLngToLayerPoint(this._latlng).round());
+ }
+ return this;
+ },
+
+ _initIcon: function () {
+ var options = this.options,
+ map = this._map,
+ animation = (map.options.zoomAnimation && map.options.markerZoomAnimation),
+ classToAdd = animation ? 'leaflet-zoom-animated' : 'leaflet-zoom-hide';
+
+ var icon = options.icon.createIcon(this._icon),
+ addIcon = false;
+
+ // if we're not reusing the icon, remove the old one and init new one
+ if (icon !== this._icon) {
+ if (this._icon) {
+ this._removeIcon();
+ }
+ addIcon = true;
+
+ if (options.title) {
+ icon.title = options.title;
+ }
+
+ if (options.alt) {
+ icon.alt = options.alt;
+ }
+ }
+
+ L.DomUtil.addClass(icon, classToAdd);
+
+ if (options.keyboard) {
+ icon.tabIndex = '0';
+ }
+
+ this._icon = icon;
+
+ this._initInteraction();
+
+ if (options.riseOnHover) {
+ L.DomEvent
+ .on(icon, 'mouseover', this._bringToFront, this)
+ .on(icon, 'mouseout', this._resetZIndex, this);
+ }
+
+ var newShadow = options.icon.createShadow(this._shadow),
+ addShadow = false;
+
+ if (newShadow !== this._shadow) {
+ this._removeShadow();
+ addShadow = true;
+ }
+
+ if (newShadow) {
+ L.DomUtil.addClass(newShadow, classToAdd);
+ }
+ this._shadow = newShadow;
+
+
+ if (options.opacity < 1) {
+ this._updateOpacity();
+ }
+
+
+ var panes = this._map._panes;
+
+ if (addIcon) {
+ panes.markerPane.appendChild(this._icon);
+ }
+
+ if (newShadow && addShadow) {
+ panes.shadowPane.appendChild(this._shadow);
+ }
+ },
+
+ _removeIcon: function () {
+ if (this.options.riseOnHover) {
+ L.DomEvent
+ .off(this._icon, 'mouseover', this._bringToFront)
+ .off(this._icon, 'mouseout', this._resetZIndex);
+ }
+
+ this._map._panes.markerPane.removeChild(this._icon);
+
+ this._icon = null;
+ },
+
+ _removeShadow: function () {
+ if (this._shadow) {
+ this._map._panes.shadowPane.removeChild(this._shadow);
+ }
+ this._shadow = null;
+ },
+
+ _setPos: function (pos) {
+ L.DomUtil.setPosition(this._icon, pos);
+
+ if (this._shadow) {
+ L.DomUtil.setPosition(this._shadow, pos);
+ }
+
+ this._zIndex = pos.y + this.options.zIndexOffset;
+
+ this._resetZIndex();
+ },
+
+ _updateZIndex: function (offset) {
+ this._icon.style.zIndex = this._zIndex + offset;
+ },
+
+ _animateZoom: function (opt) {
+ var pos = this._map._latLngToNewLayerPoint(this._latlng, opt.zoom, opt.center).round();
+
+ this._setPos(pos);
+ },
+
+ _initInteraction: function () {
+
+ if (!this.options.clickable) { return; }
+
+ // TODO refactor into something shared with Map/Path/etc. to DRY it up
+
+ var icon = this._icon,
+ events = ['dblclick', 'mousedown', 'mouseover', 'mouseout', 'contextmenu'];
+
+ L.DomUtil.addClass(icon, 'leaflet-clickable');
+ L.DomEvent.on(icon, 'click', this._onMouseClick, this);
+ L.DomEvent.on(icon, 'keypress', this._onKeyPress, this);
+
+ for (var i = 0; i < events.length; i++) {
+ L.DomEvent.on(icon, events[i], this._fireMouseEvent, this);
+ }
+
+ if (L.Handler.MarkerDrag) {
+ this.dragging = new L.Handler.MarkerDrag(this);
+
+ if (this.options.draggable) {
+ this.dragging.enable();
+ }
+ }
+ },
+
+ _onMouseClick: function (e) {
+ var wasDragged = this.dragging && this.dragging.moved();
+
+ if (this.hasEventListeners(e.type) || wasDragged) {
+ L.DomEvent.stopPropagation(e);
+ }
+
+ if (wasDragged) { return; }
+
+ if ((!this.dragging || !this.dragging._enabled) && this._map.dragging && this._map.dragging.moved()) { return; }
+
+ this.fire(e.type, {
+ originalEvent: e,
+ latlng: this._latlng
+ });
+ },
+
+ _onKeyPress: function (e) {
+ if (e.keyCode === 13) {
+ this.fire('click', {
+ originalEvent: e,
+ latlng: this._latlng
+ });
+ }
+ },
+
+ _fireMouseEvent: function (e) {
+
+ this.fire(e.type, {
+ originalEvent: e,
+ latlng: this._latlng
+ });
+
+ // TODO proper custom event propagation
+ // this line will always be called if marker is in a FeatureGroup
+ if (e.type === 'contextmenu' && this.hasEventListeners(e.type)) {
+ L.DomEvent.preventDefault(e);
+ }
+ if (e.type !== 'mousedown') {
+ L.DomEvent.stopPropagation(e);
+ } else {
+ L.DomEvent.preventDefault(e);
+ }
+ },
+
+ setOpacity: function (opacity) {
+ this.options.opacity = opacity;
+ if (this._map) {
+ this._updateOpacity();
+ }
+
+ return this;
+ },
+
+ _updateOpacity: function () {
+ L.DomUtil.setOpacity(this._icon, this.options.opacity);
+ if (this._shadow) {
+ L.DomUtil.setOpacity(this._shadow, this.options.opacity);
+ }
+ },
+
+ _bringToFront: function () {
+ this._updateZIndex(this.options.riseOffset);
+ },
+
+ _resetZIndex: function () {
+ this._updateZIndex(0);
+ }
+});
+
+L.marker = function (latlng, options) {
+ return new L.Marker(latlng, options);
+};
+
+
+/*
+ * L.DivIcon is a lightweight HTML-based icon class (as opposed to the image-based L.Icon)
+ * to use with L.Marker.
+ */
+
+L.DivIcon = L.Icon.extend({
+ options: {
+ iconSize: [12, 12], // also can be set through CSS
+ /*
+ iconAnchor: (Point)
+ popupAnchor: (Point)
+ html: (String)
+ bgPos: (Point)
+ */
+ className: 'leaflet-div-icon',
+ html: false
+ },
+
+ createIcon: function (oldIcon) {
+ var div = (oldIcon && oldIcon.tagName === 'DIV') ? oldIcon : document.createElement('div'),
+ options = this.options;
+
+ if (options.html !== false) {
+ div.innerHTML = options.html;
+ } else {
+ div.innerHTML = '';
+ }
+
+ if (options.bgPos) {
+ div.style.backgroundPosition =
+ (-options.bgPos.x) + 'px ' + (-options.bgPos.y) + 'px';
+ }
+
+ this._setIconStyles(div, 'icon');
+ return div;
+ },
+
+ createShadow: function () {
+ return null;
+ }
+});
+
+L.divIcon = function (options) {
+ return new L.DivIcon(options);
+};
+
+
+/*
+ * L.Popup is used for displaying popups on the map.
+ */
+
+L.Map.mergeOptions({
+ closePopupOnClick: true
+});
+
+L.Popup = L.Class.extend({
+ includes: L.Mixin.Events,
+
+ options: {
+ minWidth: 50,
+ maxWidth: 300,
+ // maxHeight: null,
+ autoPan: true,
+ closeButton: true,
+ offset: [0, 7],
+ autoPanPadding: [5, 5],
+ // autoPanPaddingTopLeft: null,
+ // autoPanPaddingBottomRight: null,
+ keepInView: false,
+ className: '',
+ zoomAnimation: true
+ },
+
+ initialize: function (options, source) {
+ L.setOptions(this, options);
+
+ this._source = source;
+ this._animated = L.Browser.any3d && this.options.zoomAnimation;
+ this._isOpen = false;
+ },
+
+ onAdd: function (map) {
+ this._map = map;
+
+ if (!this._container) {
+ this._initLayout();
+ }
+
+ var animFade = map.options.fadeAnimation;
+
+ if (animFade) {
+ L.DomUtil.setOpacity(this._container, 0);
+ }
+ map._panes.popupPane.appendChild(this._container);
+
+ map.on(this._getEvents(), this);
+
+ this.update();
+
+ if (animFade) {
+ L.DomUtil.setOpacity(this._container, 1);
+ }
+
+ this.fire('open');
+
+ map.fire('popupopen', {popup: this});
+
+ if (this._source) {
+ this._source.fire('popupopen', {popup: this});
+ }
+ },
+
+ addTo: function (map) {
+ map.addLayer(this);
+ return this;
+ },
+
+ openOn: function (map) {
+ map.openPopup(this);
+ return this;
+ },
+
+ onRemove: function (map) {
+ map._panes.popupPane.removeChild(this._container);
+
+ L.Util.falseFn(this._container.offsetWidth); // force reflow
+
+ map.off(this._getEvents(), this);
+
+ if (map.options.fadeAnimation) {
+ L.DomUtil.setOpacity(this._container, 0);
+ }
+
+ this._map = null;
+
+ this.fire('close');
+
+ map.fire('popupclose', {popup: this});
+
+ if (this._source) {
+ this._source.fire('popupclose', {popup: this});
+ }
+ },
+
+ getLatLng: function () {
+ return this._latlng;
+ },
+
+ setLatLng: function (latlng) {
+ this._latlng = L.latLng(latlng);
+ if (this._map) {
+ this._updatePosition();
+ this._adjustPan();
+ }
+ return this;
+ },
+
+ getContent: function () {
+ return this._content;
+ },
+
+ setContent: function (content) {
+ this._content = content;
+ this.update();
+ return this;
+ },
+
+ update: function () {
+ if (!this._map) { return; }
+
+ this._container.style.visibility = 'hidden';
+
+ this._updateContent();
+ this._updateLayout();
+ this._updatePosition();
+
+ this._container.style.visibility = '';
+
+ this._adjustPan();
+ },
+
+ _getEvents: function () {
+ var events = {
+ viewreset: this._updatePosition
+ };
+
+ if (this._animated) {
+ events.zoomanim = this._zoomAnimation;
+ }
+ if ('closeOnClick' in this.options ? this.options.closeOnClick : this._map.options.closePopupOnClick) {
+ events.preclick = this._close;
+ }
+ if (this.options.keepInView) {
+ events.moveend = this._adjustPan;
+ }
+
+ return events;
+ },
+
+ _close: function () {
+ if (this._map) {
+ this._map.closePopup(this);
+ }
+ },
+
+ _initLayout: function () {
+ var prefix = 'leaflet-popup',
+ containerClass = prefix + ' ' + this.options.className + ' leaflet-zoom-' +
+ (this._animated ? 'animated' : 'hide'),
+ container = this._container = L.DomUtil.create('div', containerClass),
+ closeButton;
+
+ if (this.options.closeButton) {
+ closeButton = this._closeButton =
+ L.DomUtil.create('a', prefix + '-close-button', container);
+ closeButton.href = '#close';
+ closeButton.innerHTML = '×';
+ L.DomEvent.disableClickPropagation(closeButton);
+
+ L.DomEvent.on(closeButton, 'click', this._onCloseButtonClick, this);
+ }
+
+ var wrapper = this._wrapper =
+ L.DomUtil.create('div', prefix + '-content-wrapper', container);
+ L.DomEvent.disableClickPropagation(wrapper);
+
+ this._contentNode = L.DomUtil.create('div', prefix + '-content', wrapper);
+
+ L.DomEvent.disableScrollPropagation(this._contentNode);
+ L.DomEvent.on(wrapper, 'contextmenu', L.DomEvent.stopPropagation);
+
+ this._tipContainer = L.DomUtil.create('div', prefix + '-tip-container', container);
+ this._tip = L.DomUtil.create('div', prefix + '-tip', this._tipContainer);
+ },
+
+ _updateContent: function () {
+ if (!this._content) { return; }
+
+ if (typeof this._content === 'string') {
+ this._contentNode.innerHTML = this._content;
+ } else {
+ while (this._contentNode.hasChildNodes()) {
+ this._contentNode.removeChild(this._contentNode.firstChild);
+ }
+ this._contentNode.appendChild(this._content);
+ }
+ this.fire('contentupdate');
+ },
+
+ _updateLayout: function () {
+ var container = this._contentNode,
+ style = container.style;
+
+ style.width = '';
+ style.whiteSpace = 'nowrap';
+
+ var width = container.offsetWidth;
+ width = Math.min(width, this.options.maxWidth);
+ width = Math.max(width, this.options.minWidth);
+
+ style.width = (width + 1) + 'px';
+ style.whiteSpace = '';
+
+ style.height = '';
+
+ var height = container.offsetHeight,
+ maxHeight = this.options.maxHeight,
+ scrolledClass = 'leaflet-popup-scrolled';
+
+ if (maxHeight && height > maxHeight) {
+ style.height = maxHeight + 'px';
+ L.DomUtil.addClass(container, scrolledClass);
+ } else {
+ L.DomUtil.removeClass(container, scrolledClass);
+ }
+
+ this._containerWidth = this._container.offsetWidth;
+ },
+
+ _updatePosition: function () {
+ if (!this._map) { return; }
+
+ var pos = this._map.latLngToLayerPoint(this._latlng),
+ animated = this._animated,
+ offset = L.point(this.options.offset);
+
+ if (animated) {
+ L.DomUtil.setPosition(this._container, pos);
+ }
+
+ this._containerBottom = -offset.y - (animated ? 0 : pos.y);
+ this._containerLeft = -Math.round(this._containerWidth / 2) + offset.x + (animated ? 0 : pos.x);
+
+ // bottom position the popup in case the height of the popup changes (images loading etc)
+ this._container.style.bottom = this._containerBottom + 'px';
+ this._container.style.left = this._containerLeft + 'px';
+ },
+
+ _zoomAnimation: function (opt) {
+ var pos = this._map._latLngToNewLayerPoint(this._latlng, opt.zoom, opt.center);
+
+ L.DomUtil.setPosition(this._container, pos);
+ },
+
+ _adjustPan: function () {
+ if (!this.options.autoPan) { return; }
+
+ var map = this._map,
+ containerHeight = this._container.offsetHeight,
+ containerWidth = this._containerWidth,
+
+ layerPos = new L.Point(this._containerLeft, -containerHeight - this._containerBottom);
+
+ if (this._animated) {
+ layerPos._add(L.DomUtil.getPosition(this._container));
+ }
+
+ var containerPos = map.layerPointToContainerPoint(layerPos),
+ padding = L.point(this.options.autoPanPadding),
+ paddingTL = L.point(this.options.autoPanPaddingTopLeft || padding),
+ paddingBR = L.point(this.options.autoPanPaddingBottomRight || padding),
+ size = map.getSize(),
+ dx = 0,
+ dy = 0;
+
+ if (containerPos.x + containerWidth + paddingBR.x > size.x) { // right
+ dx = containerPos.x + containerWidth - size.x + paddingBR.x;
+ }
+ if (containerPos.x - dx - paddingTL.x < 0) { // left
+ dx = containerPos.x - paddingTL.x;
+ }
+ if (containerPos.y + containerHeight + paddingBR.y > size.y) { // bottom
+ dy = containerPos.y + containerHeight - size.y + paddingBR.y;
+ }
+ if (containerPos.y - dy - paddingTL.y < 0) { // top
+ dy = containerPos.y - paddingTL.y;
+ }
+
+ if (dx || dy) {
+ map
+ .fire('autopanstart')
+ .panBy([dx, dy]);
+ }
+ },
+
+ _onCloseButtonClick: function (e) {
+ this._close();
+ L.DomEvent.stop(e);
+ }
+});
+
+L.popup = function (options, source) {
+ return new L.Popup(options, source);
+};
+
+
+L.Map.include({
+ openPopup: function (popup, latlng, options) { // (Popup) or (String || HTMLElement, LatLng[, Object])
+ this.closePopup();
+
+ if (!(popup instanceof L.Popup)) {
+ var content = popup;
+
+ popup = new L.Popup(options)
+ .setLatLng(latlng)
+ .setContent(content);
+ }
+ popup._isOpen = true;
+
+ this._popup = popup;
+ return this.addLayer(popup);
+ },
+
+ closePopup: function (popup) {
+ if (!popup || popup === this._popup) {
+ popup = this._popup;
+ this._popup = null;
+ }
+ if (popup) {
+ this.removeLayer(popup);
+ popup._isOpen = false;
+ }
+ return this;
+ }
+});
+
+
+/*
+ * Popup extension to L.Marker, adding popup-related methods.
+ */
+
+L.Marker.include({
+ openPopup: function () {
+ if (this._popup && this._map && !this._map.hasLayer(this._popup)) {
+ this._popup.setLatLng(this._latlng);
+ this._map.openPopup(this._popup);
+ }
+
+ return this;
+ },
+
+ closePopup: function () {
+ if (this._popup) {
+ this._popup._close();
+ }
+ return this;
+ },
+
+ togglePopup: function () {
+ if (this._popup) {
+ if (this._popup._isOpen) {
+ this.closePopup();
+ } else {
+ this.openPopup();
+ }
+ }
+ return this;
+ },
+
+ bindPopup: function (content, options) {
+ var anchor = L.point(this.options.icon.options.popupAnchor || [0, 0]);
+
+ anchor = anchor.add(L.Popup.prototype.options.offset);
+
+ if (options && options.offset) {
+ anchor = anchor.add(options.offset);
+ }
+
+ options = L.extend({offset: anchor}, options);
+
+ if (!this._popupHandlersAdded) {
+ this
+ .on('click', this.togglePopup, this)
+ .on('remove', this.closePopup, this)
+ .on('move', this._movePopup, this);
+ this._popupHandlersAdded = true;
+ }
+
+ if (content instanceof L.Popup) {
+ L.setOptions(content, options);
+ this._popup = content;
+ content._source = this;
+ } else {
+ this._popup = new L.Popup(options, this)
+ .setContent(content);
+ }
+
+ return this;
+ },
+
+ setPopupContent: function (content) {
+ if (this._popup) {
+ this._popup.setContent(content);
+ }
+ return this;
+ },
+
+ unbindPopup: function () {
+ if (this._popup) {
+ this._popup = null;
+ this
+ .off('click', this.togglePopup, this)
+ .off('remove', this.closePopup, this)
+ .off('move', this._movePopup, this);
+ this._popupHandlersAdded = false;
+ }
+ return this;
+ },
+
+ getPopup: function () {
+ return this._popup;
+ },
+
+ _movePopup: function (e) {
+ this._popup.setLatLng(e.latlng);
+ }
+});
+
+
+/*
+ * L.LayerGroup is a class to combine several layers into one so that
+ * you can manipulate the group (e.g. add/remove it) as one layer.
+ */
+
+L.LayerGroup = L.Class.extend({
+ initialize: function (layers) {
+ this._layers = {};
+
+ var i, len;
+
+ if (layers) {
+ for (i = 0, len = layers.length; i < len; i++) {
+ this.addLayer(layers[i]);
+ }
+ }
+ },
+
+ addLayer: function (layer) {
+ var id = this.getLayerId(layer);
+
+ this._layers[id] = layer;
+
+ if (this._map) {
+ this._map.addLayer(layer);
+ }
+
+ return this;
+ },
+
+ removeLayer: function (layer) {
+ var id = layer in this._layers ? layer : this.getLayerId(layer);
+
+ if (this._map && this._layers[id]) {
+ this._map.removeLayer(this._layers[id]);
+ }
+
+ delete this._layers[id];
+
+ return this;
+ },
+
+ hasLayer: function (layer) {
+ if (!layer) { return false; }
+
+ return (layer in this._layers || this.getLayerId(layer) in this._layers);
+ },
+
+ clearLayers: function () {
+ this.eachLayer(this.removeLayer, this);
+ return this;
+ },
+
+ invoke: function (methodName) {
+ var args = Array.prototype.slice.call(arguments, 1),
+ i, layer;
+
+ for (i in this._layers) {
+ layer = this._layers[i];
+
+ if (layer[methodName]) {
+ layer[methodName].apply(layer, args);
+ }
+ }
+
+ return this;
+ },
+
+ onAdd: function (map) {
+ this._map = map;
+ this.eachLayer(map.addLayer, map);
+ },
+
+ onRemove: function (map) {
+ this.eachLayer(map.removeLayer, map);
+ this._map = null;
+ },
+
+ addTo: function (map) {
+ map.addLayer(this);
+ return this;
+ },
+
+ eachLayer: function (method, context) {
+ for (var i in this._layers) {
+ method.call(context, this._layers[i]);
+ }
+ return this;
+ },
+
+ getLayer: function (id) {
+ return this._layers[id];
+ },
+
+ getLayers: function () {
+ var layers = [];
+
+ for (var i in this._layers) {
+ layers.push(this._layers[i]);
+ }
+ return layers;
+ },
+
+ setZIndex: function (zIndex) {
+ return this.invoke('setZIndex', zIndex);
+ },
+
+ getLayerId: function (layer) {
+ return L.stamp(layer);
+ }
+});
+
+L.layerGroup = function (layers) {
+ return new L.LayerGroup(layers);
+};
+
+
+/*
+ * L.FeatureGroup extends L.LayerGroup by introducing mouse events and additional methods
+ * shared between a group of interactive layers (like vectors or markers).
+ */
+
+L.FeatureGroup = L.LayerGroup.extend({
+ includes: L.Mixin.Events,
+
+ statics: {
+ EVENTS: 'click dblclick mouseover mouseout mousemove contextmenu popupopen popupclose'
+ },
+
+ addLayer: function (layer) {
+ if (this.hasLayer(layer)) {
+ return this;
+ }
+
+ if ('on' in layer) {
+ layer.on(L.FeatureGroup.EVENTS, this._propagateEvent, this);
+ }
+
+ L.LayerGroup.prototype.addLayer.call(this, layer);
+
+ if (this._popupContent && layer.bindPopup) {
+ layer.bindPopup(this._popupContent, this._popupOptions);
+ }
+
+ return this.fire('layeradd', {layer: layer});
+ },
+
+ removeLayer: function (layer) {
+ if (!this.hasLayer(layer)) {
+ return this;
+ }
+ if (layer in this._layers) {
+ layer = this._layers[layer];
+ }
+
+ if ('off' in layer) {
+ layer.off(L.FeatureGroup.EVENTS, this._propagateEvent, this);
+ }
+
+ L.LayerGroup.prototype.removeLayer.call(this, layer);
+
+ if (this._popupContent) {
+ this.invoke('unbindPopup');
+ }
+
+ return this.fire('layerremove', {layer: layer});
+ },
+
+ bindPopup: function (content, options) {
+ this._popupContent = content;
+ this._popupOptions = options;
+ return this.invoke('bindPopup', content, options);
+ },
+
+ openPopup: function (latlng) {
+ // open popup on the first layer
+ for (var id in this._layers) {
+ this._layers[id].openPopup(latlng);
+ break;
+ }
+ return this;
+ },
+
+ setStyle: function (style) {
+ return this.invoke('setStyle', style);
+ },
+
+ bringToFront: function () {
+ return this.invoke('bringToFront');
+ },
+
+ bringToBack: function () {
+ return this.invoke('bringToBack');
+ },
+
+ getBounds: function () {
+ var bounds = new L.LatLngBounds();
+
+ this.eachLayer(function (layer) {
+ bounds.extend(layer instanceof L.Marker ? layer.getLatLng() : layer.getBounds());
+ });
+
+ return bounds;
+ },
+
+ _propagateEvent: function (e) {
+ e = L.extend({
+ layer: e.target,
+ target: this
+ }, e);
+ this.fire(e.type, e);
+ }
+});
+
+L.featureGroup = function (layers) {
+ return new L.FeatureGroup(layers);
+};
+
+
+/*
+ * L.Path is a base class for rendering vector paths on a map. Inherited by Polyline, Circle, etc.
+ */
+
+L.Path = L.Class.extend({
+ includes: [L.Mixin.Events],
+
+ statics: {
+ // how much to extend the clip area around the map view
+ // (relative to its size, e.g. 0.5 is half the screen in each direction)
+ // set it so that SVG element doesn't exceed 1280px (vectors flicker on dragend if it is)
+ CLIP_PADDING: (function () {
+ var max = L.Browser.mobile ? 1280 : 2000,
+ target = (max / Math.max(window.outerWidth, window.outerHeight) - 1) / 2;
+ return Math.max(0, Math.min(0.5, target));
+ })()
+ },
+
+ options: {
+ stroke: true,
+ color: '#0033ff',
+ dashArray: null,
+ lineCap: null,
+ lineJoin: null,
+ weight: 5,
+ opacity: 0.5,
+
+ fill: false,
+ fillColor: null, //same as color by default
+ fillOpacity: 0.2,
+
+ clickable: true
+ },
+
+ initialize: function (options) {
+ L.setOptions(this, options);
+ },
+
+ onAdd: function (map) {
+ this._map = map;
+
+ if (!this._container) {
+ this._initElements();
+ this._initEvents();
+ }
+
+ this.projectLatlngs();
+ this._updatePath();
+
+ if (this._container) {
+ this._map._pathRoot.appendChild(this._container);
+ }
+
+ this.fire('add');
+
+ map.on({
+ 'viewreset': this.projectLatlngs,
+ 'moveend': this._updatePath
+ }, this);
+ },
+
+ addTo: function (map) {
+ map.addLayer(this);
+ return this;
+ },
+
+ onRemove: function (map) {
+ map._pathRoot.removeChild(this._container);
+
+ // Need to fire remove event before we set _map to null as the event hooks might need the object
+ this.fire('remove');
+ this._map = null;
+
+ if (L.Browser.vml) {
+ this._container = null;
+ this._stroke = null;
+ this._fill = null;
+ }
+
+ map.off({
+ 'viewreset': this.projectLatlngs,
+ 'moveend': this._updatePath
+ }, this);
+ },
+
+ projectLatlngs: function () {
+ // do all projection stuff here
+ },
+
+ setStyle: function (style) {
+ L.setOptions(this, style);
+
+ if (this._container) {
+ this._updateStyle();
+ }
+
+ return this;
+ },
+
+ redraw: function () {
+ if (this._map) {
+ this.projectLatlngs();
+ this._updatePath();
+ }
+ return this;
+ }
+});
+
+L.Map.include({
+ _updatePathViewport: function () {
+ var p = L.Path.CLIP_PADDING,
+ size = this.getSize(),
+ panePos = L.DomUtil.getPosition(this._mapPane),
+ min = panePos.multiplyBy(-1)._subtract(size.multiplyBy(p)._round()),
+ max = min.add(size.multiplyBy(1 + p * 2)._round());
+
+ this._pathViewport = new L.Bounds(min, max);
+ }
+});
+
+
+/*
+ * Extends L.Path with SVG-specific rendering code.
+ */
+
+L.Path.SVG_NS = 'http://www.w3.org/2000/svg';
+
+L.Browser.svg = !!(document.createElementNS && document.createElementNS(L.Path.SVG_NS, 'svg').createSVGRect);
+
+L.Path = L.Path.extend({
+ statics: {
+ SVG: L.Browser.svg
+ },
+
+ bringToFront: function () {
+ var root = this._map._pathRoot,
+ path = this._container;
+
+ if (path && root.lastChild !== path) {
+ root.appendChild(path);
+ }
+ return this;
+ },
+
+ bringToBack: function () {
+ var root = this._map._pathRoot,
+ path = this._container,
+ first = root.firstChild;
+
+ if (path && first !== path) {
+ root.insertBefore(path, first);
+ }
+ return this;
+ },
+
+ getPathString: function () {
+ // form path string here
+ },
+
+ _createElement: function (name) {
+ return document.createElementNS(L.Path.SVG_NS, name);
+ },
+
+ _initElements: function () {
+ this._map._initPathRoot();
+ this._initPath();
+ this._initStyle();
+ },
+
+ _initPath: function () {
+ this._container = this._createElement('g');
+
+ this._path = this._createElement('path');
+
+ if (this.options.className) {
+ L.DomUtil.addClass(this._path, this.options.className);
+ }
+
+ this._container.appendChild(this._path);
+ },
+
+ _initStyle: function () {
+ if (this.options.stroke) {
+ this._path.setAttribute('stroke-linejoin', 'round');
+ this._path.setAttribute('stroke-linecap', 'round');
+ }
+ if (this.options.fill) {
+ this._path.setAttribute('fill-rule', 'evenodd');
+ }
+ if (this.options.pointerEvents) {
+ this._path.setAttribute('pointer-events', this.options.pointerEvents);
+ }
+ if (!this.options.clickable && !this.options.pointerEvents) {
+ this._path.setAttribute('pointer-events', 'none');
+ }
+ this._updateStyle();
+ },
+
+ _updateStyle: function () {
+ if (this.options.stroke) {
+ this._path.setAttribute('stroke', this.options.color);
+ this._path.setAttribute('stroke-opacity', this.options.opacity);
+ this._path.setAttribute('stroke-width', this.options.weight);
+ if (this.options.dashArray) {
+ this._path.setAttribute('stroke-dasharray', this.options.dashArray);
+ } else {
+ this._path.removeAttribute('stroke-dasharray');
+ }
+ if (this.options.lineCap) {
+ this._path.setAttribute('stroke-linecap', this.options.lineCap);
+ }
+ if (this.options.lineJoin) {
+ this._path.setAttribute('stroke-linejoin', this.options.lineJoin);
+ }
+ } else {
+ this._path.setAttribute('stroke', 'none');
+ }
+ if (this.options.fill) {
+ this._path.setAttribute('fill', this.options.fillColor || this.options.color);
+ this._path.setAttribute('fill-opacity', this.options.fillOpacity);
+ } else {
+ this._path.setAttribute('fill', 'none');
+ }
+ },
+
+ _updatePath: function () {
+ var str = this.getPathString();
+ if (!str) {
+ // fix webkit empty string parsing bug
+ str = 'M0 0';
+ }
+ this._path.setAttribute('d', str);
+ },
+
+ // TODO remove duplication with L.Map
+ _initEvents: function () {
+ if (this.options.clickable) {
+ if (L.Browser.svg || !L.Browser.vml) {
+ L.DomUtil.addClass(this._path, 'leaflet-clickable');
+ }
+
+ L.DomEvent.on(this._container, 'click', this._onMouseClick, this);
+
+ var events = ['dblclick', 'mousedown', 'mouseover',
+ 'mouseout', 'mousemove', 'contextmenu'];
+ for (var i = 0; i < events.length; i++) {
+ L.DomEvent.on(this._container, events[i], this._fireMouseEvent, this);
+ }
+ }
+ },
+
+ _onMouseClick: function (e) {
+ if (this._map.dragging && this._map.dragging.moved()) { return; }
+
+ this._fireMouseEvent(e);
+ },
+
+ _fireMouseEvent: function (e) {
+ if (!this._map || !this.hasEventListeners(e.type)) { return; }
+
+ var map = this._map,
+ containerPoint = map.mouseEventToContainerPoint(e),
+ layerPoint = map.containerPointToLayerPoint(containerPoint),
+ latlng = map.layerPointToLatLng(layerPoint);
+
+ this.fire(e.type, {
+ latlng: latlng,
+ layerPoint: layerPoint,
+ containerPoint: containerPoint,
+ originalEvent: e
+ });
+
+ if (e.type === 'contextmenu') {
+ L.DomEvent.preventDefault(e);
+ }
+ if (e.type !== 'mousemove') {
+ L.DomEvent.stopPropagation(e);
+ }
+ }
+});
+
+L.Map.include({
+ _initPathRoot: function () {
+ if (!this._pathRoot) {
+ this._pathRoot = L.Path.prototype._createElement('svg');
+ this._panes.overlayPane.appendChild(this._pathRoot);
+
+ if (this.options.zoomAnimation && L.Browser.any3d) {
+ L.DomUtil.addClass(this._pathRoot, 'leaflet-zoom-animated');
+
+ this.on({
+ 'zoomanim': this._animatePathZoom,
+ 'zoomend': this._endPathZoom
+ });
+ } else {
+ L.DomUtil.addClass(this._pathRoot, 'leaflet-zoom-hide');
+ }
+
+ this.on('moveend', this._updateSvgViewport);
+ this._updateSvgViewport();
+ }
+ },
+
+ _animatePathZoom: function (e) {
+ var scale = this.getZoomScale(e.zoom),
+ offset = this._getCenterOffset(e.center)._multiplyBy(-scale)._add(this._pathViewport.min);
+
+ this._pathRoot.style[L.DomUtil.TRANSFORM] =
+ L.DomUtil.getTranslateString(offset) + ' scale(' + scale + ') ';
+
+ this._pathZooming = true;
+ },
+
+ _endPathZoom: function () {
+ this._pathZooming = false;
+ },
+
+ _updateSvgViewport: function () {
+
+ if (this._pathZooming) {
+ // Do not update SVGs while a zoom animation is going on otherwise the animation will break.
+ // When the zoom animation ends we will be updated again anyway
+ // This fixes the case where you do a momentum move and zoom while the move is still ongoing.
+ return;
+ }
+
+ this._updatePathViewport();
+
+ var vp = this._pathViewport,
+ min = vp.min,
+ max = vp.max,
+ width = max.x - min.x,
+ height = max.y - min.y,
+ root = this._pathRoot,
+ pane = this._panes.overlayPane;
+
+ // Hack to make flicker on drag end on mobile webkit less irritating
+ if (L.Browser.mobileWebkit) {
+ pane.removeChild(root);
+ }
+
+ L.DomUtil.setPosition(root, min);
+ root.setAttribute('width', width);
+ root.setAttribute('height', height);
+ root.setAttribute('viewBox', [min.x, min.y, width, height].join(' '));
+
+ if (L.Browser.mobileWebkit) {
+ pane.appendChild(root);
+ }
+ }
+});
+
+
+/*
+ * Popup extension to L.Path (polylines, polygons, circles), adding popup-related methods.
+ */
+
+L.Path.include({
+
+ bindPopup: function (content, options) {
+
+ if (content instanceof L.Popup) {
+ this._popup = content;
+ } else {
+ if (!this._popup || options) {
+ this._popup = new L.Popup(options, this);
+ }
+ this._popup.setContent(content);
+ }
+
+ if (!this._popupHandlersAdded) {
+ this
+ .on('click', this._openPopup, this)
+ .on('remove', this.closePopup, this);
+
+ this._popupHandlersAdded = true;
+ }
+
+ return this;
+ },
+
+ unbindPopup: function () {
+ if (this._popup) {
+ this._popup = null;
+ this
+ .off('click', this._openPopup)
+ .off('remove', this.closePopup);
+
+ this._popupHandlersAdded = false;
+ }
+ return this;
+ },
+
+ openPopup: function (latlng) {
+
+ if (this._popup) {
+ // open the popup from one of the path's points if not specified
+ latlng = latlng || this._latlng ||
+ this._latlngs[Math.floor(this._latlngs.length / 2)];
+
+ this._openPopup({latlng: latlng});
+ }
+
+ return this;
+ },
+
+ closePopup: function () {
+ if (this._popup) {
+ this._popup._close();
+ }
+ return this;
+ },
+
+ _openPopup: function (e) {
+ this._popup.setLatLng(e.latlng);
+ this._map.openPopup(this._popup);
+ }
+});
+
+
+/*
+ * Vector rendering for IE6-8 through VML.
+ * Thanks to Dmitry Baranovsky and his Raphael library for inspiration!
+ */
+
+L.Browser.vml = !L.Browser.svg && (function () {
+ try {
+ var div = document.createElement('div');
+ div.innerHTML = '<v:shape adj="1"/>';
+
+ var shape = div.firstChild;
+ shape.style.behavior = 'url(#default#VML)';
+
+ return shape && (typeof shape.adj === 'object');
+
+ } catch (e) {
+ return false;
+ }
+}());
+
+L.Path = L.Browser.svg || !L.Browser.vml ? L.Path : L.Path.extend({
+ statics: {
+ VML: true,
+ CLIP_PADDING: 0.02
+ },
+
+ _createElement: (function () {
+ try {
+ document.namespaces.add('lvml', 'urn:schemas-microsoft-com:vml');
+ return function (name) {
+ return document.createElement('<lvml:' + name + ' class="lvml">');
+ };
+ } catch (e) {
+ return function (name) {
+ return document.createElement(
+ '<' + name + ' xmlns="urn:schemas-microsoft.com:vml" class="lvml">');
+ };
+ }
+ }()),
+
+ _initPath: function () {
+ var container = this._container = this._createElement('shape');
+
+ L.DomUtil.addClass(container, 'leaflet-vml-shape' +
+ (this.options.className ? ' ' + this.options.className : ''));
+
+ if (this.options.clickable) {
+ L.DomUtil.addClass(container, 'leaflet-clickable');
+ }
+
+ container.coordsize = '1 1';
+
+ this._path = this._createElement('path');
+ container.appendChild(this._path);
+
+ this._map._pathRoot.appendChild(container);
+ },
+
+ _initStyle: function () {
+ this._updateStyle();
+ },
+
+ _updateStyle: function () {
+ var stroke = this._stroke,
+ fill = this._fill,
+ options = this.options,
+ container = this._container;
+
+ container.stroked = options.stroke;
+ container.filled = options.fill;
+
+ if (options.stroke) {
+ if (!stroke) {
+ stroke = this._stroke = this._createElement('stroke');
+ stroke.endcap = 'round';
+ container.appendChild(stroke);
+ }
+ stroke.weight = options.weight + 'px';
+ stroke.color = options.color;
+ stroke.opacity = options.opacity;
+
+ if (options.dashArray) {
+ stroke.dashStyle = L.Util.isArray(options.dashArray) ?
+ options.dashArray.join(' ') :
+ options.dashArray.replace(/( *, *)/g, ' ');
+ } else {
+ stroke.dashStyle = '';
+ }
+ if (options.lineCap) {
+ stroke.endcap = options.lineCap.replace('butt', 'flat');
+ }
+ if (options.lineJoin) {
+ stroke.joinstyle = options.lineJoin;
+ }
+
+ } else if (stroke) {
+ container.removeChild(stroke);
+ this._stroke = null;
+ }
+
+ if (options.fill) {
+ if (!fill) {
+ fill = this._fill = this._createElement('fill');
+ container.appendChild(fill);
+ }
+ fill.color = options.fillColor || options.color;
+ fill.opacity = options.fillOpacity;
+
+ } else if (fill) {
+ container.removeChild(fill);
+ this._fill = null;
+ }
+ },
+
+ _updatePath: function () {
+ var style = this._container.style;
+
+ style.display = 'none';
+ this._path.v = this.getPathString() + ' '; // the space fixes IE empty path string bug
+ style.display = '';
+ }
+});
+
+L.Map.include(L.Browser.svg || !L.Browser.vml ? {} : {
+ _initPathRoot: function () {
+ if (this._pathRoot) { return; }
+
+ var root = this._pathRoot = document.createElement('div');
+ root.className = 'leaflet-vml-container';
+ this._panes.overlayPane.appendChild(root);
+
+ this.on('moveend', this._updatePathViewport);
+ this._updatePathViewport();
+ }
+});
+
+
+/*
+ * Vector rendering for all browsers that support canvas.
+ */
+
+L.Browser.canvas = (function () {
+ return !!document.createElement('canvas').getContext;
+}());
+
+L.Path = (L.Path.SVG && !window.L_PREFER_CANVAS) || !L.Browser.canvas ? L.Path : L.Path.extend({
+ statics: {
+ //CLIP_PADDING: 0.02, // not sure if there's a need to set it to a small value
+ CANVAS: true,
+ SVG: false
+ },
+
+ redraw: function () {
+ if (this._map) {
+ this.projectLatlngs();
+ this._requestUpdate();
+ }
+ return this;
+ },
+
+ setStyle: function (style) {
+ L.setOptions(this, style);
+
+ if (this._map) {
+ this._updateStyle();
+ this._requestUpdate();
+ }
+ return this;
+ },
+
+ onRemove: function (map) {
+ map
+ .off('viewreset', this.projectLatlngs, this)
+ .off('moveend', this._updatePath, this);
+
+ if (this.options.clickable) {
+ this._map.off('click', this._onClick, this);
+ this._map.off('mousemove', this._onMouseMove, this);
+ }
+
+ this._requestUpdate();
+
+ this.fire('remove');
+ this._map = null;
+ },
+
+ _requestUpdate: function () {
+ if (this._map && !L.Path._updateRequest) {
+ L.Path._updateRequest = L.Util.requestAnimFrame(this._fireMapMoveEnd, this._map);
+ }
+ },
+
+ _fireMapMoveEnd: function () {
+ L.Path._updateRequest = null;
+ this.fire('moveend');
+ },
+
+ _initElements: function () {
+ this._map._initPathRoot();
+ this._ctx = this._map._canvasCtx;
+ },
+
+ _updateStyle: function () {
+ var options = this.options;
+
+ if (options.stroke) {
+ this._ctx.lineWidth = options.weight;
+ this._ctx.strokeStyle = options.color;
+ }
+ if (options.fill) {
+ this._ctx.fillStyle = options.fillColor || options.color;
+ }
+
+ if (options.lineCap) {
+ this._ctx.lineCap = options.lineCap;
+ }
+ if (options.lineJoin) {
+ this._ctx.lineJoin = options.lineJoin;
+ }
+ },
+
+ _drawPath: function () {
+ var i, j, len, len2, point, drawMethod;
+
+ this._ctx.beginPath();
+
+ for (i = 0, len = this._parts.length; i < len; i++) {
+ for (j = 0, len2 = this._parts[i].length; j < len2; j++) {
+ point = this._parts[i][j];
+ drawMethod = (j === 0 ? 'move' : 'line') + 'To';
+
+ this._ctx[drawMethod](point.x, point.y);
+ }
+ // TODO refactor ugly hack
+ if (this instanceof L.Polygon) {
+ this._ctx.closePath();
+ }
+ }
+ },
+
+ _checkIfEmpty: function () {
+ return !this._parts.length;
+ },
+
+ _updatePath: function () {
+ if (this._checkIfEmpty()) { return; }
+
+ var ctx = this._ctx,
+ options = this.options;
+
+ this._drawPath();
+ ctx.save();
+ this._updateStyle();
+
+ if (options.fill) {
+ ctx.globalAlpha = options.fillOpacity;
+ ctx.fill(options.fillRule || 'evenodd');
+ }
+
+ if (options.stroke) {
+ ctx.globalAlpha = options.opacity;
+ ctx.stroke();
+ }
+
+ ctx.restore();
+
+ // TODO optimization: 1 fill/stroke for all features with equal style instead of 1 for each feature
+ },
+
+ _initEvents: function () {
+ if (this.options.clickable) {
+ this._map.on('mousemove', this._onMouseMove, this);
+ this._map.on('click dblclick contextmenu', this._fireMouseEvent, this);
+ }
+ },
+
+ _fireMouseEvent: function (e) {
+ if (this._containsPoint(e.layerPoint)) {
+ this.fire(e.type, e);
+ }
+ },
+
+ _onMouseMove: function (e) {
+ if (!this._map || this._map._animatingZoom) { return; }
+
+ // TODO don't do on each move
+ if (this._containsPoint(e.layerPoint)) {
+ this._ctx.canvas.style.cursor = 'pointer';
+ this._mouseInside = true;
+ this.fire('mouseover', e);
+
+ } else if (this._mouseInside) {
+ this._ctx.canvas.style.cursor = '';
+ this._mouseInside = false;
+ this.fire('mouseout', e);
+ }
+ }
+});
+
+L.Map.include((L.Path.SVG && !window.L_PREFER_CANVAS) || !L.Browser.canvas ? {} : {
+ _initPathRoot: function () {
+ var root = this._pathRoot,
+ ctx;
+
+ if (!root) {
+ root = this._pathRoot = document.createElement('canvas');
+ root.style.position = 'absolute';
+ ctx = this._canvasCtx = root.getContext('2d');
+
+ ctx.lineCap = 'round';
+ ctx.lineJoin = 'round';
+
+ this._panes.overlayPane.appendChild(root);
+
+ if (this.options.zoomAnimation) {
+ this._pathRoot.className = 'leaflet-zoom-animated';
+ this.on('zoomanim', this._animatePathZoom);
+ this.on('zoomend', this._endPathZoom);
+ }
+ this.on('moveend', this._updateCanvasViewport);
+ this._updateCanvasViewport();
+ }
+ },
+
+ _updateCanvasViewport: function () {
+ // don't redraw while zooming. See _updateSvgViewport for more details
+ if (this._pathZooming) { return; }
+ this._updatePathViewport();
+
+ var vp = this._pathViewport,
+ min = vp.min,
+ size = vp.max.subtract(min),
+ root = this._pathRoot;
+
+ //TODO check if this works properly on mobile webkit
+ L.DomUtil.setPosition(root, min);
+ root.width = size.x;
+ root.height = size.y;
+ root.getContext('2d').translate(-min.x, -min.y);
+ }
+});
+
+
+/*
+ * L.LineUtil contains different utility functions for line segments
+ * and polylines (clipping, simplification, distances, etc.)
+ */
+
+/*jshint bitwise:false */ // allow bitwise operations for this file
+
+L.LineUtil = {
+
+ // Simplify polyline with vertex reduction and Douglas-Peucker simplification.
+ // Improves rendering performance dramatically by lessening the number of points to draw.
+
+ simplify: function (/*Point[]*/ points, /*Number*/ tolerance) {
+ if (!tolerance || !points.length) {
+ return points.slice();
+ }
+
+ var sqTolerance = tolerance * tolerance;
+
+ // stage 1: vertex reduction
+ points = this._reducePoints(points, sqTolerance);
+
+ // stage 2: Douglas-Peucker simplification
+ points = this._simplifyDP(points, sqTolerance);
+
+ return points;
+ },
+
+ // distance from a point to a segment between two points
+ pointToSegmentDistance: function (/*Point*/ p, /*Point*/ p1, /*Point*/ p2) {
+ return Math.sqrt(this._sqClosestPointOnSegment(p, p1, p2, true));
+ },
+
+ closestPointOnSegment: function (/*Point*/ p, /*Point*/ p1, /*Point*/ p2) {
+ return this._sqClosestPointOnSegment(p, p1, p2);
+ },
+
+ // Douglas-Peucker simplification, see http://en.wikipedia.org/wiki/Douglas-Peucker_algorithm
+ _simplifyDP: function (points, sqTolerance) {
+
+ var len = points.length,
+ ArrayConstructor = typeof Uint8Array !== undefined + '' ? Uint8Array : Array,
+ markers = new ArrayConstructor(len);
+
+ markers[0] = markers[len - 1] = 1;
+
+ this._simplifyDPStep(points, markers, sqTolerance, 0, len - 1);
+
+ var i,
+ newPoints = [];
+
+ for (i = 0; i < len; i++) {
+ if (markers[i]) {
+ newPoints.push(points[i]);
+ }
+ }
+
+ return newPoints;
+ },
+
+ _simplifyDPStep: function (points, markers, sqTolerance, first, last) {
+
+ var maxSqDist = 0,
+ index, i, sqDist;
+
+ for (i = first + 1; i <= last - 1; i++) {
+ sqDist = this._sqClosestPointOnSegment(points[i], points[first], points[last], true);
+
+ if (sqDist > maxSqDist) {
+ index = i;
+ maxSqDist = sqDist;
+ }
+ }
+
+ if (maxSqDist > sqTolerance) {
+ markers[index] = 1;
+
+ this._simplifyDPStep(points, markers, sqTolerance, first, index);
+ this._simplifyDPStep(points, markers, sqTolerance, index, last);
+ }
+ },
+
+ // reduce points that are too close to each other to a single point
+ _reducePoints: function (points, sqTolerance) {
+ var reducedPoints = [points[0]];
+
+ for (var i = 1, prev = 0, len = points.length; i < len; i++) {
+ if (this._sqDist(points[i], points[prev]) > sqTolerance) {
+ reducedPoints.push(points[i]);
+ prev = i;
+ }
+ }
+ if (prev < len - 1) {
+ reducedPoints.push(points[len - 1]);
+ }
+ return reducedPoints;
+ },
+
+ // Cohen-Sutherland line clipping algorithm.
+ // Used to avoid rendering parts of a polyline that are not currently visible.
+
+ clipSegment: function (a, b, bounds, useLastCode) {
+ var codeA = useLastCode ? this._lastCode : this._getBitCode(a, bounds),
+ codeB = this._getBitCode(b, bounds),
+
+ codeOut, p, newCode;
+
+ // save 2nd code to avoid calculating it on the next segment
+ this._lastCode = codeB;
+
+ while (true) {
+ // if a,b is inside the clip window (trivial accept)
+ if (!(codeA | codeB)) {
+ return [a, b];
+ // if a,b is outside the clip window (trivial reject)
+ } else if (codeA & codeB) {
+ return false;
+ // other cases
+ } else {
+ codeOut = codeA || codeB;
+ p = this._getEdgeIntersection(a, b, codeOut, bounds);
+ newCode = this._getBitCode(p, bounds);
+
+ if (codeOut === codeA) {
+ a = p;
+ codeA = newCode;
+ } else {
+ b = p;
+ codeB = newCode;
+ }
+ }
+ }
+ },
+
+ _getEdgeIntersection: function (a, b, code, bounds) {
+ var dx = b.x - a.x,
+ dy = b.y - a.y,
+ min = bounds.min,
+ max = bounds.max;
+
+ if (code & 8) { // top
+ return new L.Point(a.x + dx * (max.y - a.y) / dy, max.y);
+ } else if (code & 4) { // bottom
+ return new L.Point(a.x + dx * (min.y - a.y) / dy, min.y);
+ } else if (code & 2) { // right
+ return new L.Point(max.x, a.y + dy * (max.x - a.x) / dx);
+ } else if (code & 1) { // left
+ return new L.Point(min.x, a.y + dy * (min.x - a.x) / dx);
+ }
+ },
+
+ _getBitCode: function (/*Point*/ p, bounds) {
+ var code = 0;
+
+ if (p.x < bounds.min.x) { // left
+ code |= 1;
+ } else if (p.x > bounds.max.x) { // right
+ code |= 2;
+ }
+ if (p.y < bounds.min.y) { // bottom
+ code |= 4;
+ } else if (p.y > bounds.max.y) { // top
+ code |= 8;
+ }
+
+ return code;
+ },
+
+ // square distance (to avoid unnecessary Math.sqrt calls)
+ _sqDist: function (p1, p2) {
+ var dx = p2.x - p1.x,
+ dy = p2.y - p1.y;
+ return dx * dx + dy * dy;
+ },
+
+ // return closest point on segment or distance to that point
+ _sqClosestPointOnSegment: function (p, p1, p2, sqDist) {
+ var x = p1.x,
+ y = p1.y,
+ dx = p2.x - x,
+ dy = p2.y - y,
+ dot = dx * dx + dy * dy,
+ t;
+
+ if (dot > 0) {
+ t = ((p.x - x) * dx + (p.y - y) * dy) / dot;
+
+ if (t > 1) {
+ x = p2.x;
+ y = p2.y;
+ } else if (t > 0) {
+ x += dx * t;
+ y += dy * t;
+ }
+ }
+
+ dx = p.x - x;
+ dy = p.y - y;
+
+ return sqDist ? dx * dx + dy * dy : new L.Point(x, y);
+ }
+};
+
+
+/*
+ * L.Polyline is used to display polylines on a map.
+ */
+
+L.Polyline = L.Path.extend({
+ initialize: function (latlngs, options) {
+ L.Path.prototype.initialize.call(this, options);
+
+ this._latlngs = this._convertLatLngs(latlngs);
+ },
+
+ options: {
+ // how much to simplify the polyline on each zoom level
+ // more = better performance and smoother look, less = more accurate
+ smoothFactor: 1.0,
+ noClip: false
+ },
+
+ projectLatlngs: function () {
+ this._originalPoints = [];
+
+ for (var i = 0, len = this._latlngs.length; i < len; i++) {
+ this._originalPoints[i] = this._map.latLngToLayerPoint(this._latlngs[i]);
+ }
+ },
+
+ getPathString: function () {
+ for (var i = 0, len = this._parts.length, str = ''; i < len; i++) {
+ str += this._getPathPartStr(this._parts[i]);
+ }
+ return str;
+ },
+
+ getLatLngs: function () {
+ return this._latlngs;
+ },
+
+ setLatLngs: function (latlngs) {
+ this._latlngs = this._convertLatLngs(latlngs);
+ return this.redraw();
+ },
+
+ addLatLng: function (latlng) {
+ this._latlngs.push(L.latLng(latlng));
+ return this.redraw();
+ },
+
+ spliceLatLngs: function () { // (Number index, Number howMany)
+ var removed = [].splice.apply(this._latlngs, arguments);
+ this._convertLatLngs(this._latlngs, true);
+ this.redraw();
+ return removed;
+ },
+
+ closestLayerPoint: function (p) {
+ var minDistance = Infinity, parts = this._parts, p1, p2, minPoint = null;
+
+ for (var j = 0, jLen = parts.length; j < jLen; j++) {
+ var points = parts[j];
+ for (var i = 1, len = points.length; i < len; i++) {
+ p1 = points[i - 1];
+ p2 = points[i];
+ var sqDist = L.LineUtil._sqClosestPointOnSegment(p, p1, p2, true);
+ if (sqDist < minDistance) {
+ minDistance = sqDist;
+ minPoint = L.LineUtil._sqClosestPointOnSegment(p, p1, p2);
+ }
+ }
+ }
+ if (minPoint) {
+ minPoint.distance = Math.sqrt(minDistance);
+ }
+ return minPoint;
+ },
+
+ getBounds: function () {
+ return new L.LatLngBounds(this.getLatLngs());
+ },
+
+ _convertLatLngs: function (latlngs, overwrite) {
+ var i, len, target = overwrite ? latlngs : [];
+
+ for (i = 0, len = latlngs.length; i < len; i++) {
+ if (L.Util.isArray(latlngs[i]) && typeof latlngs[i][0] !== 'number') {
+ return;
+ }
+ target[i] = L.latLng(latlngs[i]);
+ }
+ return target;
+ },
+
+ _initEvents: function () {
+ L.Path.prototype._initEvents.call(this);
+ },
+
+ _getPathPartStr: function (points) {
+ var round = L.Path.VML;
+
+ for (var j = 0, len2 = points.length, str = '', p; j < len2; j++) {
+ p = points[j];
+ if (round) {
+ p._round();
+ }
+ str += (j ? 'L' : 'M') + p.x + ' ' + p.y;
+ }
+ return str;
+ },
+
+ _clipPoints: function () {
+ var points = this._originalPoints,
+ len = points.length,
+ i, k, segment;
+
+ if (this.options.noClip) {
+ this._parts = [points];
+ return;
+ }
+
+ this._parts = [];
+
+ var parts = this._parts,
+ vp = this._map._pathViewport,
+ lu = L.LineUtil;
+
+ for (i = 0, k = 0; i < len - 1; i++) {
+ segment = lu.clipSegment(points[i], points[i + 1], vp, i);
+ if (!segment) {
+ continue;
+ }
+
+ parts[k] = parts[k] || [];
+ parts[k].push(segment[0]);
+
+ // if segment goes out of screen, or it's the last one, it's the end of the line part
+ if ((segment[1] !== points[i + 1]) || (i === len - 2)) {
+ parts[k].push(segment[1]);
+ k++;
+ }
+ }
+ },
+
+ // simplify each clipped part of the polyline
+ _simplifyPoints: function () {
+ var parts = this._parts,
+ lu = L.LineUtil;
+
+ for (var i = 0, len = parts.length; i < len; i++) {
+ parts[i] = lu.simplify(parts[i], this.options.smoothFactor);
+ }
+ },
+
+ _updatePath: function () {
+ if (!this._map) { return; }
+
+ this._clipPoints();
+ this._simplifyPoints();
+
+ L.Path.prototype._updatePath.call(this);
+ }
+});
+
+L.polyline = function (latlngs, options) {
+ return new L.Polyline(latlngs, options);
+};
+
+
+/*
+ * L.PolyUtil contains utility functions for polygons (clipping, etc.).
+ */
+
+/*jshint bitwise:false */ // allow bitwise operations here
+
+L.PolyUtil = {};
+
+/*
+ * Sutherland-Hodgeman polygon clipping algorithm.
+ * Used to avoid rendering parts of a polygon that are not currently visible.
+ */
+L.PolyUtil.clipPolygon = function (points, bounds) {
+ var clippedPoints,
+ edges = [1, 4, 2, 8],
+ i, j, k,
+ a, b,
+ len, edge, p,
+ lu = L.LineUtil;
+
+ for (i = 0, len = points.length; i < len; i++) {
+ points[i]._code = lu._getBitCode(points[i], bounds);
+ }
+
+ // for each edge (left, bottom, right, top)
+ for (k = 0; k < 4; k++) {
+ edge = edges[k];
+ clippedPoints = [];
+
+ for (i = 0, len = points.length, j = len - 1; i < len; j = i++) {
+ a = points[i];
+ b = points[j];
+
+ // if a is inside the clip window
+ if (!(a._code & edge)) {
+ // if b is outside the clip window (a->b goes out of screen)
+ if (b._code & edge) {
+ p = lu._getEdgeIntersection(b, a, edge, bounds);
+ p._code = lu._getBitCode(p, bounds);
+ clippedPoints.push(p);
+ }
+ clippedPoints.push(a);
+
+ // else if b is inside the clip window (a->b enters the screen)
+ } else if (!(b._code & edge)) {
+ p = lu._getEdgeIntersection(b, a, edge, bounds);
+ p._code = lu._getBitCode(p, bounds);
+ clippedPoints.push(p);
+ }
+ }
+ points = clippedPoints;
+ }
+
+ return points;
+};
+
+
+/*
+ * L.Polygon is used to display polygons on a map.
+ */
+
+L.Polygon = L.Polyline.extend({
+ options: {
+ fill: true
+ },
+
+ initialize: function (latlngs, options) {
+ L.Polyline.prototype.initialize.call(this, latlngs, options);
+ this._initWithHoles(latlngs);
+ },
+
+ _initWithHoles: function (latlngs) {
+ var i, len, hole;
+ if (latlngs && L.Util.isArray(latlngs[0]) && (typeof latlngs[0][0] !== 'number')) {
+ this._latlngs = this._convertLatLngs(latlngs[0]);
+ this._holes = latlngs.slice(1);
+
+ for (i = 0, len = this._holes.length; i < len; i++) {
+ hole = this._holes[i] = this._convertLatLngs(this._holes[i]);
+ if (hole[0].equals(hole[hole.length - 1])) {
+ hole.pop();
+ }
+ }
+ }
+
+ // filter out last point if its equal to the first one
+ latlngs = this._latlngs;
+
+ if (latlngs.length >= 2 && latlngs[0].equals(latlngs[latlngs.length - 1])) {
+ latlngs.pop();
+ }
+ },
+
+ projectLatlngs: function () {
+ L.Polyline.prototype.projectLatlngs.call(this);
+
+ // project polygon holes points
+ // TODO move this logic to Polyline to get rid of duplication
+ this._holePoints = [];
+
+ if (!this._holes) { return; }
+
+ var i, j, len, len2;
+
+ for (i = 0, len = this._holes.length; i < len; i++) {
+ this._holePoints[i] = [];
+
+ for (j = 0, len2 = this._holes[i].length; j < len2; j++) {
+ this._holePoints[i][j] = this._map.latLngToLayerPoint(this._holes[i][j]);
+ }
+ }
+ },
+
+ setLatLngs: function (latlngs) {
+ if (latlngs && L.Util.isArray(latlngs[0]) && (typeof latlngs[0][0] !== 'number')) {
+ this._initWithHoles(latlngs);
+ return this.redraw();
+ } else {
+ return L.Polyline.prototype.setLatLngs.call(this, latlngs);
+ }
+ },
+
+ _clipPoints: function () {
+ var points = this._originalPoints,
+ newParts = [];
+
+ this._parts = [points].concat(this._holePoints);
+
+ if (this.options.noClip) { return; }
+
+ for (var i = 0, len = this._parts.length; i < len; i++) {
+ var clipped = L.PolyUtil.clipPolygon(this._parts[i], this._map._pathViewport);
+ if (clipped.length) {
+ newParts.push(clipped);
+ }
+ }
+
+ this._parts = newParts;
+ },
+
+ _getPathPartStr: function (points) {
+ var str = L.Polyline.prototype._getPathPartStr.call(this, points);
+ return str + (L.Browser.svg ? 'z' : 'x');
+ }
+});
+
+L.polygon = function (latlngs, options) {
+ return new L.Polygon(latlngs, options);
+};
+
+
+/*
+ * Contains L.MultiPolyline and L.MultiPolygon layers.
+ */
+
+(function () {
+ function createMulti(Klass) {
+
+ return L.FeatureGroup.extend({
+
+ initialize: function (latlngs, options) {
+ this._layers = {};
+ this._options = options;
+ this.setLatLngs(latlngs);
+ },
+
+ setLatLngs: function (latlngs) {
+ var i = 0,
+ len = latlngs.length;
+
+ this.eachLayer(function (layer) {
+ if (i < len) {
+ layer.setLatLngs(latlngs[i++]);
+ } else {
+ this.removeLayer(layer);
+ }
+ }, this);
+
+ while (i < len) {
+ this.addLayer(new Klass(latlngs[i++], this._options));
+ }
+
+ return this;
+ },
+
+ getLatLngs: function () {
+ var latlngs = [];
+
+ this.eachLayer(function (layer) {
+ latlngs.push(layer.getLatLngs());
+ });
+
+ return latlngs;
+ }
+ });
+ }
+
+ L.MultiPolyline = createMulti(L.Polyline);
+ L.MultiPolygon = createMulti(L.Polygon);
+
+ L.multiPolyline = function (latlngs, options) {
+ return new L.MultiPolyline(latlngs, options);
+ };
+
+ L.multiPolygon = function (latlngs, options) {
+ return new L.MultiPolygon(latlngs, options);
+ };
+}());
+
+
+/*
+ * L.Rectangle extends Polygon and creates a rectangle when passed a LatLngBounds object.
+ */
+
+L.Rectangle = L.Polygon.extend({
+ initialize: function (latLngBounds, options) {
+ L.Polygon.prototype.initialize.call(this, this._boundsToLatLngs(latLngBounds), options);
+ },
+
+ setBounds: function (latLngBounds) {
+ this.setLatLngs(this._boundsToLatLngs(latLngBounds));
+ },
+
+ _boundsToLatLngs: function (latLngBounds) {
+ latLngBounds = L.latLngBounds(latLngBounds);
+ return [
+ latLngBounds.getSouthWest(),
+ latLngBounds.getNorthWest(),
+ latLngBounds.getNorthEast(),
+ latLngBounds.getSouthEast()
+ ];
+ }
+});
+
+L.rectangle = function (latLngBounds, options) {
+ return new L.Rectangle(latLngBounds, options);
+};
+
+
+/*
+ * L.Circle is a circle overlay (with a certain radius in meters).
+ */
+
+L.Circle = L.Path.extend({
+ initialize: function (latlng, radius, options) {
+ L.Path.prototype.initialize.call(this, options);
+
+ this._latlng = L.latLng(latlng);
+ this._mRadius = radius;
+ },
+
+ options: {
+ fill: true
+ },
+
+ setLatLng: function (latlng) {
+ this._latlng = L.latLng(latlng);
+ return this.redraw();
+ },
+
+ setRadius: function (radius) {
+ this._mRadius = radius;
+ return this.redraw();
+ },
+
+ projectLatlngs: function () {
+ var lngRadius = this._getLngRadius(),
+ latlng = this._latlng,
+ pointLeft = this._map.latLngToLayerPoint([latlng.lat, latlng.lng - lngRadius]);
+
+ this._point = this._map.latLngToLayerPoint(latlng);
+ this._radius = Math.max(this._point.x - pointLeft.x, 1);
+ },
+
+ getBounds: function () {
+ var lngRadius = this._getLngRadius(),
+ latRadius = (this._mRadius / 40075017) * 360,
+ latlng = this._latlng;
+
+ return new L.LatLngBounds(
+ [latlng.lat - latRadius, latlng.lng - lngRadius],
+ [latlng.lat + latRadius, latlng.lng + lngRadius]);
+ },
+
+ getLatLng: function () {
+ return this._latlng;
+ },
+
+ getPathString: function () {
+ var p = this._point,
+ r = this._radius;
+
+ if (this._checkIfEmpty()) {
+ return '';
+ }
+
+ if (L.Browser.svg) {
+ return 'M' + p.x + ',' + (p.y - r) +
+ 'A' + r + ',' + r + ',0,1,1,' +
+ (p.x - 0.1) + ',' + (p.y - r) + ' z';
+ } else {
+ p._round();
+ r = Math.round(r);
+ return 'AL ' + p.x + ',' + p.y + ' ' + r + ',' + r + ' 0,' + (65535 * 360);
+ }
+ },
+
+ getRadius: function () {
+ return this._mRadius;
+ },
+
+ // TODO Earth hardcoded, move into projection code!
+
+ _getLatRadius: function () {
+ return (this._mRadius / 40075017) * 360;
+ },
+
+ _getLngRadius: function () {
+ return this._getLatRadius() / Math.cos(L.LatLng.DEG_TO_RAD * this._latlng.lat);
+ },
+
+ _checkIfEmpty: function () {
+ if (!this._map) {
+ return false;
+ }
+ var vp = this._map._pathViewport,
+ r = this._radius,
+ p = this._point;
+
+ return p.x - r > vp.max.x || p.y - r > vp.max.y ||
+ p.x + r < vp.min.x || p.y + r < vp.min.y;
+ }
+});
+
+L.circle = function (latlng, radius, options) {
+ return new L.Circle(latlng, radius, options);
+};
+
+
+/*
+ * L.CircleMarker is a circle overlay with a permanent pixel radius.
+ */
+
+L.CircleMarker = L.Circle.extend({
+ options: {
+ radius: 10,
+ weight: 2
+ },
+
+ initialize: function (latlng, options) {
+ L.Circle.prototype.initialize.call(this, latlng, null, options);
+ this._radius = this.options.radius;
+ },
+
+ projectLatlngs: function () {
+ this._point = this._map.latLngToLayerPoint(this._latlng);
+ },
+
+ _updateStyle : function () {
+ L.Circle.prototype._updateStyle.call(this);
+ this.setRadius(this.options.radius);
+ },
+
+ setLatLng: function (latlng) {
+ L.Circle.prototype.setLatLng.call(this, latlng);
+ if (this._popup && this._popup._isOpen) {
+ this._popup.setLatLng(latlng);
+ }
+ return this;
+ },
+
+ setRadius: function (radius) {
+ this.options.radius = this._radius = radius;
+ return this.redraw();
+ },
+
+ getRadius: function () {
+ return this._radius;
+ }
+});
+
+L.circleMarker = function (latlng, options) {
+ return new L.CircleMarker(latlng, options);
+};
+
+
+/*
+ * Extends L.Polyline to be able to manually detect clicks on Canvas-rendered polylines.
+ */
+
+L.Polyline.include(!L.Path.CANVAS ? {} : {
+ _containsPoint: function (p, closed) {
+ var i, j, k, len, len2, dist, part,
+ w = this.options.weight / 2;
+
+ if (L.Browser.touch) {
+ w += 10; // polyline click tolerance on touch devices
+ }
+
+ for (i = 0, len = this._parts.length; i < len; i++) {
+ part = this._parts[i];
+ for (j = 0, len2 = part.length, k = len2 - 1; j < len2; k = j++) {
+ if (!closed && (j === 0)) {
+ continue;
+ }
+
+ dist = L.LineUtil.pointToSegmentDistance(p, part[k], part[j]);
+
+ if (dist <= w) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+});
+
+
+/*
+ * Extends L.Polygon to be able to manually detect clicks on Canvas-rendered polygons.
+ */
+
+L.Polygon.include(!L.Path.CANVAS ? {} : {
+ _containsPoint: function (p) {
+ var inside = false,
+ part, p1, p2,
+ i, j, k,
+ len, len2;
+
+ // TODO optimization: check if within bounds first
+
+ if (L.Polyline.prototype._containsPoint.call(this, p, true)) {
+ // click on polygon border
+ return true;
+ }
+
+ // ray casting algorithm for detecting if point is in polygon
+
+ for (i = 0, len = this._parts.length; i < len; i++) {
+ part = this._parts[i];
+
+ for (j = 0, len2 = part.length, k = len2 - 1; j < len2; k = j++) {
+ p1 = part[j];
+ p2 = part[k];
+
+ if (((p1.y > p.y) !== (p2.y > p.y)) &&
+ (p.x < (p2.x - p1.x) * (p.y - p1.y) / (p2.y - p1.y) + p1.x)) {
+ inside = !inside;
+ }
+ }
+ }
+
+ return inside;
+ }
+});
+
+
+/*
+ * Extends L.Circle with Canvas-specific code.
+ */
+
+L.Circle.include(!L.Path.CANVAS ? {} : {
+ _drawPath: function () {
+ var p = this._point;
+ this._ctx.beginPath();
+ this._ctx.arc(p.x, p.y, this._radius, 0, Math.PI * 2, false);
+ },
+
+ _containsPoint: function (p) {
+ var center = this._point,
+ w2 = this.options.stroke ? this.options.weight / 2 : 0;
+
+ return (p.distanceTo(center) <= this._radius + w2);
+ }
+});
+
+
+/*
+ * CircleMarker canvas specific drawing parts.
+ */
+
+L.CircleMarker.include(!L.Path.CANVAS ? {} : {
+ _updateStyle: function () {
+ L.Path.prototype._updateStyle.call(this);
+ }
+});
+
+
+/*
+ * L.GeoJSON turns any GeoJSON data into a Leaflet layer.
+ */
+
+L.GeoJSON = L.FeatureGroup.extend({
+
+ initialize: function (geojson, options) {
+ L.setOptions(this, options);
+
+ this._layers = {};
+
+ if (geojson) {
+ this.addData(geojson);
+ }
+ },
+
+ addData: function (geojson) {
+ var features = L.Util.isArray(geojson) ? geojson : geojson.features,
+ i, len, feature;
+
+ if (features) {
+ for (i = 0, len = features.length; i < len; i++) {
+ // Only add this if geometry or geometries are set and not null
+ feature = features[i];
+ if (feature.geometries || feature.geometry || feature.features || feature.coordinates) {
+ this.addData(features[i]);
+ }
+ }
+ return this;
+ }
+
+ var options = this.options;
+
+ if (options.filter && !options.filter(geojson)) { return; }
+
+ var layer = L.GeoJSON.geometryToLayer(geojson, options.pointToLayer, options.coordsToLatLng, options);
+ layer.feature = L.GeoJSON.asFeature(geojson);
+
+ layer.defaultOptions = layer.options;
+ this.resetStyle(layer);
+
+ if (options.onEachFeature) {
+ options.onEachFeature(geojson, layer);
+ }
+
+ return this.addLayer(layer);
+ },
+
+ resetStyle: function (layer) {
+ var style = this.options.style;
+ if (style) {
+ // reset any custom styles
+ L.Util.extend(layer.options, layer.defaultOptions);
+
+ this._setLayerStyle(layer, style);
+ }
+ },
+
+ setStyle: function (style) {
+ this.eachLayer(function (layer) {
+ this._setLayerStyle(layer, style);
+ }, this);
+ },
+
+ _setLayerStyle: function (layer, style) {
+ if (typeof style === 'function') {
+ style = style(layer.feature);
+ }
+ if (layer.setStyle) {
+ layer.setStyle(style);
+ }
+ }
+});
+
+L.extend(L.GeoJSON, {
+ geometryToLayer: function (geojson, pointToLayer, coordsToLatLng, vectorOptions) {
+ var geometry = geojson.type === 'Feature' ? geojson.geometry : geojson,
+ coords = geometry.coordinates,
+ layers = [],
+ latlng, latlngs, i, len;
+
+ coordsToLatLng = coordsToLatLng || this.coordsToLatLng;
+
+ switch (geometry.type) {
+ case 'Point':
+ latlng = coordsToLatLng(coords);
+ return pointToLayer ? pointToLayer(geojson, latlng) : new L.Marker(latlng);
+
+ case 'MultiPoint':
+ for (i = 0, len = coords.length; i < len; i++) {
+ latlng = coordsToLatLng(coords[i]);
+ layers.push(pointToLayer ? pointToLayer(geojson, latlng) : new L.Marker(latlng));
+ }
+ return new L.FeatureGroup(layers);
+
+ case 'LineString':
+ latlngs = this.coordsToLatLngs(coords, 0, coordsToLatLng);
+ return new L.Polyline(latlngs, vectorOptions);
+
+ case 'Polygon':
+ if (coords.length === 2 && !coords[1].length) {
+ throw new Error('Invalid GeoJSON object.');
+ }
+ latlngs = this.coordsToLatLngs(coords, 1, coordsToLatLng);
+ return new L.Polygon(latlngs, vectorOptions);
+
+ case 'MultiLineString':
+ latlngs = this.coordsToLatLngs(coords, 1, coordsToLatLng);
+ return new L.MultiPolyline(latlngs, vectorOptions);
+
+ case 'MultiPolygon':
+ latlngs = this.coordsToLatLngs(coords, 2, coordsToLatLng);
+ return new L.MultiPolygon(latlngs, vectorOptions);
+
+ case 'GeometryCollection':
+ for (i = 0, len = geometry.geometries.length; i < len; i++) {
+
+ layers.push(this.geometryToLayer({
+ geometry: geometry.geometries[i],
+ type: 'Feature',
+ properties: geojson.properties
+ }, pointToLayer, coordsToLatLng, vectorOptions));
+ }
+ return new L.FeatureGroup(layers);
+
+ default:
+ throw new Error('Invalid GeoJSON object.');
+ }
+ },
+
+ coordsToLatLng: function (coords) { // (Array[, Boolean]) -> LatLng
+ return new L.LatLng(coords[1], coords[0], coords[2]);
+ },
+
+ coordsToLatLngs: function (coords, levelsDeep, coordsToLatLng) { // (Array[, Number, Function]) -> Array
+ var latlng, i, len,
+ latlngs = [];
+
+ for (i = 0, len = coords.length; i < len; i++) {
+ latlng = levelsDeep ?
+ this.coordsToLatLngs(coords[i], levelsDeep - 1, coordsToLatLng) :
+ (coordsToLatLng || this.coordsToLatLng)(coords[i]);
+
+ latlngs.push(latlng);
+ }
+
+ return latlngs;
+ },
+
+ latLngToCoords: function (latlng) {
+ var coords = [latlng.lng, latlng.lat];
+
+ if (latlng.alt !== undefined) {
+ coords.push(latlng.alt);
+ }
+ return coords;
+ },
+
+ latLngsToCoords: function (latLngs) {
+ var coords = [];
+
+ for (var i = 0, len = latLngs.length; i < len; i++) {
+ coords.push(L.GeoJSON.latLngToCoords(latLngs[i]));
+ }
+
+ return coords;
+ },
+
+ getFeature: function (layer, newGeometry) {
+ return layer.feature ? L.extend({}, layer.feature, {geometry: newGeometry}) : L.GeoJSON.asFeature(newGeometry);
+ },
+
+ asFeature: function (geoJSON) {
+ if (geoJSON.type === 'Feature') {
+ return geoJSON;
+ }
+
+ return {
+ type: 'Feature',
+ properties: {},
+ geometry: geoJSON
+ };
+ }
+});
+
+var PointToGeoJSON = {
+ toGeoJSON: function () {
+ return L.GeoJSON.getFeature(this, {
+ type: 'Point',
+ coordinates: L.GeoJSON.latLngToCoords(this.getLatLng())
+ });
+ }
+};
+
+L.Marker.include(PointToGeoJSON);
+L.Circle.include(PointToGeoJSON);
+L.CircleMarker.include(PointToGeoJSON);
+
+L.Polyline.include({
+ toGeoJSON: function () {
+ return L.GeoJSON.getFeature(this, {
+ type: 'LineString',
+ coordinates: L.GeoJSON.latLngsToCoords(this.getLatLngs())
+ });
+ }
+});
+
+L.Polygon.include({
+ toGeoJSON: function () {
+ var coords = [L.GeoJSON.latLngsToCoords(this.getLatLngs())],
+ i, len, hole;
+
+ coords[0].push(coords[0][0]);
+
+ if (this._holes) {
+ for (i = 0, len = this._holes.length; i < len; i++) {
+ hole = L.GeoJSON.latLngsToCoords(this._holes[i]);
+ hole.push(hole[0]);
+ coords.push(hole);
+ }
+ }
+
+ return L.GeoJSON.getFeature(this, {
+ type: 'Polygon',
+ coordinates: coords
+ });
+ }
+});
+
+(function () {
+ function multiToGeoJSON(type) {
+ return function () {
+ var coords = [];
+
+ this.eachLayer(function (layer) {
+ coords.push(layer.toGeoJSON().geometry.coordinates);
+ });
+
+ return L.GeoJSON.getFeature(this, {
+ type: type,
+ coordinates: coords
+ });
+ };
+ }
+
+ L.MultiPolyline.include({toGeoJSON: multiToGeoJSON('MultiLineString')});
+ L.MultiPolygon.include({toGeoJSON: multiToGeoJSON('MultiPolygon')});
+
+ L.LayerGroup.include({
+ toGeoJSON: function () {
+
+ var geometry = this.feature && this.feature.geometry,
+ jsons = [],
+ json;
+
+ if (geometry && geometry.type === 'MultiPoint') {
+ return multiToGeoJSON('MultiPoint').call(this);
+ }
+
+ var isGeometryCollection = geometry && geometry.type === 'GeometryCollection';
+
+ this.eachLayer(function (layer) {
+ if (layer.toGeoJSON) {
+ json = layer.toGeoJSON();
+ jsons.push(isGeometryCollection ? json.geometry : L.GeoJSON.asFeature(json));
+ }
+ });
+
+ if (isGeometryCollection) {
+ return L.GeoJSON.getFeature(this, {
+ geometries: jsons,
+ type: 'GeometryCollection'
+ });
+ }
+
+ return {
+ type: 'FeatureCollection',
+ features: jsons
+ };
+ }
+ });
+}());
+
+L.geoJson = function (geojson, options) {
+ return new L.GeoJSON(geojson, options);
+};
+
+
+/*
+ * L.DomEvent contains functions for working with DOM events.
+ */
+
+L.DomEvent = {
+ /* inspired by John Resig, Dean Edwards and YUI addEvent implementations */
+ addListener: function (obj, type, fn, context) { // (HTMLElement, String, Function[, Object])
+
+ var id = L.stamp(fn),
+ key = '_leaflet_' + type + id,
+ handler, originalHandler, newType;
+
+ if (obj[key]) { return this; }
+
+ handler = function (e) {
+ return fn.call(context || obj, e || L.DomEvent._getEvent());
+ };
+
+ if (L.Browser.pointer && type.indexOf('touch') === 0) {
+ return this.addPointerListener(obj, type, handler, id);
+ }
+ if (L.Browser.touch && (type === 'dblclick') && this.addDoubleTapListener) {
+ this.addDoubleTapListener(obj, handler, id);
+ }
+
+ if ('addEventListener' in obj) {
+
+ if (type === 'mousewheel') {
+ obj.addEventListener('DOMMouseScroll', handler, false);
+ obj.addEventListener(type, handler, false);
+
+ } else if ((type === 'mouseenter') || (type === 'mouseleave')) {
+
+ originalHandler = handler;
+ newType = (type === 'mouseenter' ? 'mouseover' : 'mouseout');
+
+ handler = function (e) {
+ if (!L.DomEvent._checkMouse(obj, e)) { return; }
+ return originalHandler(e);
+ };
+
+ obj.addEventListener(newType, handler, false);
+
+ } else if (type === 'click' && L.Browser.android) {
+ originalHandler = handler;
+ handler = function (e) {
+ return L.DomEvent._filterClick(e, originalHandler);
+ };
+
+ obj.addEventListener(type, handler, false);
+ } else {
+ obj.addEventListener(type, handler, false);
+ }
+
+ } else if ('attachEvent' in obj) {
+ obj.attachEvent('on' + type, handler);
+ }
+
+ obj[key] = handler;
+
+ return this;
+ },
+
+ removeListener: function (obj, type, fn) { // (HTMLElement, String, Function)
+
+ var id = L.stamp(fn),
+ key = '_leaflet_' + type + id,
+ handler = obj[key];
+
+ if (!handler) { return this; }
+
+ if (L.Browser.pointer && type.indexOf('touch') === 0) {
+ this.removePointerListener(obj, type, id);
+ } else if (L.Browser.touch && (type === 'dblclick') && this.removeDoubleTapListener) {
+ this.removeDoubleTapListener(obj, id);
+
+ } else if ('removeEventListener' in obj) {
+
+ if (type === 'mousewheel') {
+ obj.removeEventListener('DOMMouseScroll', handler, false);
+ obj.removeEventListener(type, handler, false);
+
+ } else if ((type === 'mouseenter') || (type === 'mouseleave')) {
+ obj.removeEventListener((type === 'mouseenter' ? 'mouseover' : 'mouseout'), handler, false);
+ } else {
+ obj.removeEventListener(type, handler, false);
+ }
+ } else if ('detachEvent' in obj) {
+ obj.detachEvent('on' + type, handler);
+ }
+
+ obj[key] = null;
+
+ return this;
+ },
+
+ stopPropagation: function (e) {
+
+ if (e.stopPropagation) {
+ e.stopPropagation();
+ } else {
+ e.cancelBubble = true;
+ }
+ L.DomEvent._skipped(e);
+
+ return this;
+ },
+
+ disableScrollPropagation: function (el) {
+ var stop = L.DomEvent.stopPropagation;
+
+ return L.DomEvent
+ .on(el, 'mousewheel', stop)
+ .on(el, 'MozMousePixelScroll', stop);
+ },
+
+ disableClickPropagation: function (el) {
+ var stop = L.DomEvent.stopPropagation;
+
+ for (var i = L.Draggable.START.length - 1; i >= 0; i--) {
+ L.DomEvent.on(el, L.Draggable.START[i], stop);
+ }
+
+ return L.DomEvent
+ .on(el, 'click', L.DomEvent._fakeStop)
+ .on(el, 'dblclick', stop);
+ },
+
+ preventDefault: function (e) {
+
+ if (e.preventDefault) {
+ e.preventDefault();
+ } else {
+ e.returnValue = false;
+ }
+ return this;
+ },
+
+ stop: function (e) {
+ return L.DomEvent
+ .preventDefault(e)
+ .stopPropagation(e);
+ },
+
+ getMousePosition: function (e, container) {
+ if (!container) {
+ return new L.Point(e.clientX, e.clientY);
+ }
+
+ var rect = container.getBoundingClientRect();
+
+ return new L.Point(
+ e.clientX - rect.left - container.clientLeft,
+ e.clientY - rect.top - container.clientTop);
+ },
+
+ getWheelDelta: function (e) {
+
+ var delta = 0;
+
+ if (e.wheelDelta) {
+ delta = e.wheelDelta / 120;
+ }
+ if (e.detail) {
+ delta = -e.detail / 3;
+ }
+ return delta;
+ },
+
+ _skipEvents: {},
+
+ _fakeStop: function (e) {
+ // fakes stopPropagation by setting a special event flag, checked/reset with L.DomEvent._skipped(e)
+ L.DomEvent._skipEvents[e.type] = true;
+ },
+
+ _skipped: function (e) {
+ var skipped = this._skipEvents[e.type];
+ // reset when checking, as it's only used in map container and propagates outside of the map
+ this._skipEvents[e.type] = false;
+ return skipped;
+ },
+
+ // check if element really left/entered the event target (for mouseenter/mouseleave)
+ _checkMouse: function (el, e) {
+
+ var related = e.relatedTarget;
+
+ if (!related) { return true; }
+
+ try {
+ while (related && (related !== el)) {
+ related = related.parentNode;
+ }
+ } catch (err) {
+ return false;
+ }
+ return (related !== el);
+ },
+
+ _getEvent: function () { // evil magic for IE
+ /*jshint noarg:false */
+ var e = window.event;
+ if (!e) {
+ var caller = arguments.callee.caller;
+ while (caller) {
+ e = caller['arguments'][0];
+ if (e && window.Event === e.constructor) {
+ break;
+ }
+ caller = caller.caller;
+ }
+ }
+ return e;
+ },
+
+ // this is a horrible workaround for a bug in Android where a single touch triggers two click events
+ _filterClick: function (e, handler) {
+ var timeStamp = (e.timeStamp || e.originalEvent.timeStamp),
+ elapsed = L.DomEvent._lastClick && (timeStamp - L.DomEvent._lastClick);
+
+ // are they closer together than 500ms yet more than 100ms?
+ // Android typically triggers them ~300ms apart while multiple listeners
+ // on the same event should be triggered far faster;
+ // or check if click is simulated on the element, and if it is, reject any non-simulated events
+
+ if ((elapsed && elapsed > 100 && elapsed < 500) || (e.target._simulatedClick && !e._simulated)) {
+ L.DomEvent.stop(e);
+ return;
+ }
+ L.DomEvent._lastClick = timeStamp;
+
+ return handler(e);
+ }
+};
+
+L.DomEvent.on = L.DomEvent.addListener;
+L.DomEvent.off = L.DomEvent.removeListener;
+
+
+/*
+ * L.Draggable allows you to add dragging capabilities to any element. Supports mobile devices too.
+ */
+
+L.Draggable = L.Class.extend({
+ includes: L.Mixin.Events,
+
+ statics: {
+ START: L.Browser.touch ? ['touchstart', 'mousedown'] : ['mousedown'],
+ END: {
+ mousedown: 'mouseup',
+ touchstart: 'touchend',
+ pointerdown: 'touchend',
+ MSPointerDown: 'touchend'
+ },
+ MOVE: {
+ mousedown: 'mousemove',
+ touchstart: 'touchmove',
+ pointerdown: 'touchmove',
+ MSPointerDown: 'touchmove'
+ }
+ },
+
+ initialize: function (element, dragStartTarget) {
+ this._element = element;
+ this._dragStartTarget = dragStartTarget || element;
+ },
+
+ enable: function () {
+ if (this._enabled) { return; }
+
+ for (var i = L.Draggable.START.length - 1; i >= 0; i--) {
+ L.DomEvent.on(this._dragStartTarget, L.Draggable.START[i], this._onDown, this);
+ }
+
+ this._enabled = true;
+ },
+
+ disable: function () {
+ if (!this._enabled) { return; }
+
+ for (var i = L.Draggable.START.length - 1; i >= 0; i--) {
+ L.DomEvent.off(this._dragStartTarget, L.Draggable.START[i], this._onDown, this);
+ }
+
+ this._enabled = false;
+ this._moved = false;
+ },
+
+ _onDown: function (e) {
+ this._moved = false;
+
+ if (e.shiftKey || ((e.which !== 1) && (e.button !== 1) && !e.touches)) { return; }
+
+ L.DomEvent.stopPropagation(e);
+
+ if (L.Draggable._disabled) { return; }
+
+ L.DomUtil.disableImageDrag();
+ L.DomUtil.disableTextSelection();
+
+ if (this._moving) { return; }
+
+ var first = e.touches ? e.touches[0] : e;
+
+ this._startPoint = new L.Point(first.clientX, first.clientY);
+ this._startPos = this._newPos = L.DomUtil.getPosition(this._element);
+
+ L.DomEvent
+ .on(document, L.Draggable.MOVE[e.type], this._onMove, this)
+ .on(document, L.Draggable.END[e.type], this._onUp, this);
+ },
+
+ _onMove: function (e) {
+ if (e.touches && e.touches.length > 1) {
+ this._moved = true;
+ return;
+ }
+
+ var first = (e.touches && e.touches.length === 1 ? e.touches[0] : e),
+ newPoint = new L.Point(first.clientX, first.clientY),
+ offset = newPoint.subtract(this._startPoint);
+
+ if (!offset.x && !offset.y) { return; }
+ if (L.Browser.touch && Math.abs(offset.x) + Math.abs(offset.y) < 3) { return; }
+
+ L.DomEvent.preventDefault(e);
+
+ if (!this._moved) {
+ this.fire('dragstart');
+
+ this._moved = true;
+ this._startPos = L.DomUtil.getPosition(this._element).subtract(offset);
+
+ L.DomUtil.addClass(document.body, 'leaflet-dragging');
+ this._lastTarget = e.target || e.srcElement;
+ L.DomUtil.addClass(this._lastTarget, 'leaflet-drag-target');
+ }
+
+ this._newPos = this._startPos.add(offset);
+ this._moving = true;
+
+ L.Util.cancelAnimFrame(this._animRequest);
+ this._animRequest = L.Util.requestAnimFrame(this._updatePosition, this, true, this._dragStartTarget);
+ },
+
+ _updatePosition: function () {
+ this.fire('predrag');
+ L.DomUtil.setPosition(this._element, this._newPos);
+ this.fire('drag');
+ },
+
+ _onUp: function () {
+ L.DomUtil.removeClass(document.body, 'leaflet-dragging');
+
+ if (this._lastTarget) {
+ L.DomUtil.removeClass(this._lastTarget, 'leaflet-drag-target');
+ this._lastTarget = null;
+ }
+
+ for (var i in L.Draggable.MOVE) {
+ L.DomEvent
+ .off(document, L.Draggable.MOVE[i], this._onMove)
+ .off(document, L.Draggable.END[i], this._onUp);
+ }
+
+ L.DomUtil.enableImageDrag();
+ L.DomUtil.enableTextSelection();
+
+ if (this._moved && this._moving) {
+ // ensure drag is not fired after dragend
+ L.Util.cancelAnimFrame(this._animRequest);
+
+ this.fire('dragend', {
+ distance: this._newPos.distanceTo(this._startPos)
+ });
+ }
+
+ this._moving = false;
+ }
+});
+
+
+/*
+ L.Handler is a base class for handler classes that are used internally to inject
+ interaction features like dragging to classes like Map and Marker.
+*/
+
+L.Handler = L.Class.extend({
+ initialize: function (map) {
+ this._map = map;
+ },
+
+ enable: function () {
+ if (this._enabled) { return; }
+
+ this._enabled = true;
+ this.addHooks();
+ },
+
+ disable: function () {
+ if (!this._enabled) { return; }
+
+ this._enabled = false;
+ this.removeHooks();
+ },
+
+ enabled: function () {
+ return !!this._enabled;
+ }
+});
+
+
+/*
+ * L.Handler.MapDrag is used to make the map draggable (with panning inertia), enabled by default.
+ */
+
+L.Map.mergeOptions({
+ dragging: true,
+
+ inertia: !L.Browser.android23,
+ inertiaDeceleration: 3400, // px/s^2
+ inertiaMaxSpeed: Infinity, // px/s
+ inertiaThreshold: L.Browser.touch ? 32 : 18, // ms
+ easeLinearity: 0.25,
+
+ // TODO refactor, move to CRS
+ worldCopyJump: false
+});
+
+L.Map.Drag = L.Handler.extend({
+ addHooks: function () {
+ if (!this._draggable) {
+ var map = this._map;
+
+ this._draggable = new L.Draggable(map._mapPane, map._container);
+
+ this._draggable.on({
+ 'dragstart': this._onDragStart,
+ 'drag': this._onDrag,
+ 'dragend': this._onDragEnd
+ }, this);
+
+ if (map.options.worldCopyJump) {
+ this._draggable.on('predrag', this._onPreDrag, this);
+ map.on('viewreset', this._onViewReset, this);
+
+ map.whenReady(this._onViewReset, this);
+ }
+ }
+ this._draggable.enable();
+ },
+
+ removeHooks: function () {
+ this._draggable.disable();
+ },
+
+ moved: function () {
+ return this._draggable && this._draggable._moved;
+ },
+
+ _onDragStart: function () {
+ var map = this._map;
+
+ if (map._panAnim) {
+ map._panAnim.stop();
+ }
+
+ map
+ .fire('movestart')
+ .fire('dragstart');
+
+ if (map.options.inertia) {
+ this._positions = [];
+ this._times = [];
+ }
+ },
+
+ _onDrag: function () {
+ if (this._map.options.inertia) {
+ var time = this._lastTime = +new Date(),
+ pos = this._lastPos = this._draggable._newPos;
+
+ this._positions.push(pos);
+ this._times.push(time);
+
+ if (time - this._times[0] > 200) {
+ this._positions.shift();
+ this._times.shift();
+ }
+ }
+
+ this._map
+ .fire('move')
+ .fire('drag');
+ },
+
+ _onViewReset: function () {
+ // TODO fix hardcoded Earth values
+ var pxCenter = this._map.getSize()._divideBy(2),
+ pxWorldCenter = this._map.latLngToLayerPoint([0, 0]);
+
+ this._initialWorldOffset = pxWorldCenter.subtract(pxCenter).x;
+ this._worldWidth = this._map.project([0, 180]).x;
+ },
+
+ _onPreDrag: function () {
+ // TODO refactor to be able to adjust map pane position after zoom
+ var worldWidth = this._worldWidth,
+ halfWidth = Math.round(worldWidth / 2),
+ dx = this._initialWorldOffset,
+ x = this._draggable._newPos.x,
+ newX1 = (x - halfWidth + dx) % worldWidth + halfWidth - dx,
+ newX2 = (x + halfWidth + dx) % worldWidth - halfWidth - dx,
+ newX = Math.abs(newX1 + dx) < Math.abs(newX2 + dx) ? newX1 : newX2;
+
+ this._draggable._newPos.x = newX;
+ },
+
+ _onDragEnd: function (e) {
+ var map = this._map,
+ options = map.options,
+ delay = +new Date() - this._lastTime,
+
+ noInertia = !options.inertia || delay > options.inertiaThreshold || !this._positions[0];
+
+ map.fire('dragend', e);
+
+ if (noInertia) {
+ map.fire('moveend');
+
+ } else {
+
+ var direction = this._lastPos.subtract(this._positions[0]),
+ duration = (this._lastTime + delay - this._times[0]) / 1000,
+ ease = options.easeLinearity,
+
+ speedVector = direction.multiplyBy(ease / duration),
+ speed = speedVector.distanceTo([0, 0]),
+
+ limitedSpeed = Math.min(options.inertiaMaxSpeed, speed),
+ limitedSpeedVector = speedVector.multiplyBy(limitedSpeed / speed),
+
+ decelerationDuration = limitedSpeed / (options.inertiaDeceleration * ease),
+ offset = limitedSpeedVector.multiplyBy(-decelerationDuration / 2).round();
+
+ if (!offset.x || !offset.y) {
+ map.fire('moveend');
+
+ } else {
+ offset = map._limitOffset(offset, map.options.maxBounds);
+
+ L.Util.requestAnimFrame(function () {
+ map.panBy(offset, {
+ duration: decelerationDuration,
+ easeLinearity: ease,
+ noMoveStart: true
+ });
+ });
+ }
+ }
+ }
+});
+
+L.Map.addInitHook('addHandler', 'dragging', L.Map.Drag);
+
+
+/*
+ * L.Handler.DoubleClickZoom is used to handle double-click zoom on the map, enabled by default.
+ */
+
+L.Map.mergeOptions({
+ doubleClickZoom: true
+});
+
+L.Map.DoubleClickZoom = L.Handler.extend({
+ addHooks: function () {
+ this._map.on('dblclick', this._onDoubleClick, this);
+ },
+
+ removeHooks: function () {
+ this._map.off('dblclick', this._onDoubleClick, this);
+ },
+
+ _onDoubleClick: function (e) {
+ var map = this._map,
+ zoom = map.getZoom() + (e.originalEvent.shiftKey ? -1 : 1);
+
+ if (map.options.doubleClickZoom === 'center') {
+ map.setZoom(zoom);
+ } else {
+ map.setZoomAround(e.containerPoint, zoom);
+ }
+ }
+});
+
+L.Map.addInitHook('addHandler', 'doubleClickZoom', L.Map.DoubleClickZoom);
+
+
+/*
+ * L.Handler.ScrollWheelZoom is used by L.Map to enable mouse scroll wheel zoom on the map.
+ */
+
+L.Map.mergeOptions({
+ scrollWheelZoom: true
+});
+
+L.Map.ScrollWheelZoom = L.Handler.extend({
+ addHooks: function () {
+ L.DomEvent.on(this._map._container, 'mousewheel', this._onWheelScroll, this);
+ L.DomEvent.on(this._map._container, 'MozMousePixelScroll', L.DomEvent.preventDefault);
+ this._delta = 0;
+ },
+
+ removeHooks: function () {
+ L.DomEvent.off(this._map._container, 'mousewheel', this._onWheelScroll);
+ L.DomEvent.off(this._map._container, 'MozMousePixelScroll', L.DomEvent.preventDefault);
+ },
+
+ _onWheelScroll: function (e) {
+ var delta = L.DomEvent.getWheelDelta(e);
+
+ this._delta += delta;
+ this._lastMousePos = this._map.mouseEventToContainerPoint(e);
+
+ if (!this._startTime) {
+ this._startTime = +new Date();
+ }
+
+ var left = Math.max(40 - (+new Date() - this._startTime), 0);
+
+ clearTimeout(this._timer);
+ this._timer = setTimeout(L.bind(this._performZoom, this), left);
+
+ L.DomEvent.preventDefault(e);
+ L.DomEvent.stopPropagation(e);
+ },
+
+ _performZoom: function () {
+ var map = this._map,
+ delta = this._delta,
+ zoom = map.getZoom();
+
+ delta = delta > 0 ? Math.ceil(delta) : Math.floor(delta);
+ delta = Math.max(Math.min(delta, 4), -4);
+ delta = map._limitZoom(zoom + delta) - zoom;
+
+ this._delta = 0;
+ this._startTime = null;
+
+ if (!delta) { return; }
+
+ if (map.options.scrollWheelZoom === 'center') {
+ map.setZoom(zoom + delta);
+ } else {
+ map.setZoomAround(this._lastMousePos, zoom + delta);
+ }
+ }
+});
+
+L.Map.addInitHook('addHandler', 'scrollWheelZoom', L.Map.ScrollWheelZoom);
+
+
+/*
+ * Extends the event handling code with double tap support for mobile browsers.
+ */
+
+L.extend(L.DomEvent, {
+
+ _touchstart: L.Browser.msPointer ? 'MSPointerDown' : L.Browser.pointer ? 'pointerdown' : 'touchstart',
+ _touchend: L.Browser.msPointer ? 'MSPointerUp' : L.Browser.pointer ? 'pointerup' : 'touchend',
+
+ // inspired by Zepto touch code by Thomas Fuchs
+ addDoubleTapListener: function (obj, handler, id) {
+ var last,
+ doubleTap = false,
+ delay = 250,
+ touch,
+ pre = '_leaflet_',
+ touchstart = this._touchstart,
+ touchend = this._touchend,
+ trackedTouches = [];
+
+ function onTouchStart(e) {
+ var count;
+
+ if (L.Browser.pointer) {
+ trackedTouches.push(e.pointerId);
+ count = trackedTouches.length;
+ } else {
+ count = e.touches.length;
+ }
+ if (count > 1) {
+ return;
+ }
+
+ var now = Date.now(),
+ delta = now - (last || now);
+
+ touch = e.touches ? e.touches[0] : e;
+ doubleTap = (delta > 0 && delta <= delay);
+ last = now;
+ }
+
+ function onTouchEnd(e) {
+ if (L.Browser.pointer) {
+ var idx = trackedTouches.indexOf(e.pointerId);
+ if (idx === -1) {
+ return;
+ }
+ trackedTouches.splice(idx, 1);
+ }
+
+ if (doubleTap) {
+ if (L.Browser.pointer) {
+ // work around .type being readonly with MSPointer* events
+ var newTouch = { },
+ prop;
+
+ // jshint forin:false
+ for (var i in touch) {
+ prop = touch[i];
+ if (typeof prop === 'function') {
+ newTouch[i] = prop.bind(touch);
+ } else {
+ newTouch[i] = prop;
+ }
+ }
+ touch = newTouch;
+ }
+ touch.type = 'dblclick';
+ handler(touch);
+ last = null;
+ }
+ }
+ obj[pre + touchstart + id] = onTouchStart;
+ obj[pre + touchend + id] = onTouchEnd;
+
+ // on pointer we need to listen on the document, otherwise a drag starting on the map and moving off screen
+ // will not come through to us, so we will lose track of how many touches are ongoing
+ var endElement = L.Browser.pointer ? document.documentElement : obj;
+
+ obj.addEventListener(touchstart, onTouchStart, false);
+ endElement.addEventListener(touchend, onTouchEnd, false);
+
+ if (L.Browser.pointer) {
+ endElement.addEventListener(L.DomEvent.POINTER_CANCEL, onTouchEnd, false);
+ }
+
+ return this;
+ },
+
+ removeDoubleTapListener: function (obj, id) {
+ var pre = '_leaflet_';
+
+ obj.removeEventListener(this._touchstart, obj[pre + this._touchstart + id], false);
+ (L.Browser.pointer ? document.documentElement : obj).removeEventListener(
+ this._touchend, obj[pre + this._touchend + id], false);
+
+ if (L.Browser.pointer) {
+ document.documentElement.removeEventListener(L.DomEvent.POINTER_CANCEL, obj[pre + this._touchend + id],
+ false);
+ }
+
+ return this;
+ }
+});
+
+
+/*
+ * Extends L.DomEvent to provide touch support for Internet Explorer and Windows-based devices.
+ */
+
+L.extend(L.DomEvent, {
+
+ //static
+ POINTER_DOWN: L.Browser.msPointer ? 'MSPointerDown' : 'pointerdown',
+ POINTER_MOVE: L.Browser.msPointer ? 'MSPointerMove' : 'pointermove',
+ POINTER_UP: L.Browser.msPointer ? 'MSPointerUp' : 'pointerup',
+ POINTER_CANCEL: L.Browser.msPointer ? 'MSPointerCancel' : 'pointercancel',
+
+ _pointers: [],
+ _pointerDocumentListener: false,
+
+ // Provides a touch events wrapper for (ms)pointer events.
+ // Based on changes by veproza https://github.com/CloudMade/Leaflet/pull/1019
+ //ref http://www.w3.org/TR/pointerevents/ https://www.w3.org/Bugs/Public/show_bug.cgi?id=22890
+
+ addPointerListener: function (obj, type, handler, id) {
+
+ switch (type) {
+ case 'touchstart':
+ return this.addPointerListenerStart(obj, type, handler, id);
+ case 'touchend':
+ return this.addPointerListenerEnd(obj, type, handler, id);
+ case 'touchmove':
+ return this.addPointerListenerMove(obj, type, handler, id);
+ default:
+ throw 'Unknown touch event type';
+ }
+ },
+
+ addPointerListenerStart: function (obj, type, handler, id) {
+ var pre = '_leaflet_',
+ pointers = this._pointers;
+
+ var cb = function (e) {
+ if (e.pointerType !== 'mouse' && e.pointerType !== e.MSPOINTER_TYPE_MOUSE) {
+ L.DomEvent.preventDefault(e);
+ }
+
+ var alreadyInArray = false;
+ for (var i = 0; i < pointers.length; i++) {
+ if (pointers[i].pointerId === e.pointerId) {
+ alreadyInArray = true;
+ break;
+ }
+ }
+ if (!alreadyInArray) {
+ pointers.push(e);
+ }
+
+ e.touches = pointers.slice();
+ e.changedTouches = [e];
+
+ handler(e);
+ };
+
+ obj[pre + 'touchstart' + id] = cb;
+ obj.addEventListener(this.POINTER_DOWN, cb, false);
+
+ // need to also listen for end events to keep the _pointers list accurate
+ // this needs to be on the body and never go away
+ if (!this._pointerDocumentListener) {
+ var internalCb = function (e) {
+ for (var i = 0; i < pointers.length; i++) {
+ if (pointers[i].pointerId === e.pointerId) {
+ pointers.splice(i, 1);
+ break;
+ }
+ }
+ };
+ //We listen on the documentElement as any drags that end by moving the touch off the screen get fired there
+ document.documentElement.addEventListener(this.POINTER_UP, internalCb, false);
+ document.documentElement.addEventListener(this.POINTER_CANCEL, internalCb, false);
+
+ this._pointerDocumentListener = true;
+ }
+
+ return this;
+ },
+
+ addPointerListenerMove: function (obj, type, handler, id) {
+ var pre = '_leaflet_',
+ touches = this._pointers;
+
+ function cb(e) {
+
+ // don't fire touch moves when mouse isn't down
+ if ((e.pointerType === e.MSPOINTER_TYPE_MOUSE || e.pointerType === 'mouse') && e.buttons === 0) { return; }
+
+ for (var i = 0; i < touches.length; i++) {
+ if (touches[i].pointerId === e.pointerId) {
+ touches[i] = e;
+ break;
+ }
+ }
+
+ e.touches = touches.slice();
+ e.changedTouches = [e];
+
+ handler(e);
+ }
+
+ obj[pre + 'touchmove' + id] = cb;
+ obj.addEventListener(this.POINTER_MOVE, cb, false);
+
+ return this;
+ },
+
+ addPointerListenerEnd: function (obj, type, handler, id) {
+ var pre = '_leaflet_',
+ touches = this._pointers;
+
+ var cb = function (e) {
+ for (var i = 0; i < touches.length; i++) {
+ if (touches[i].pointerId === e.pointerId) {
+ touches.splice(i, 1);
+ break;
+ }
+ }
+
+ e.touches = touches.slice();
+ e.changedTouches = [e];
+
+ handler(e);
+ };
+
+ obj[pre + 'touchend' + id] = cb;
+ obj.addEventListener(this.POINTER_UP, cb, false);
+ obj.addEventListener(this.POINTER_CANCEL, cb, false);
+
+ return this;
+ },
+
+ removePointerListener: function (obj, type, id) {
+ var pre = '_leaflet_',
+ cb = obj[pre + type + id];
+
+ switch (type) {
+ case 'touchstart':
+ obj.removeEventListener(this.POINTER_DOWN, cb, false);
+ break;
+ case 'touchmove':
+ obj.removeEventListener(this.POINTER_MOVE, cb, false);
+ break;
+ case 'touchend':
+ obj.removeEventListener(this.POINTER_UP, cb, false);
+ obj.removeEventListener(this.POINTER_CANCEL, cb, false);
+ break;
+ }
+
+ return this;
+ }
+});
+
+
+/*
+ * L.Handler.TouchZoom is used by L.Map to add pinch zoom on supported mobile browsers.
+ */
+
+L.Map.mergeOptions({
+ touchZoom: L.Browser.touch && !L.Browser.android23,
+ bounceAtZoomLimits: true
+});
+
+L.Map.TouchZoom = L.Handler.extend({
+ addHooks: function () {
+ L.DomEvent.on(this._map._container, 'touchstart', this._onTouchStart, this);
+ },
+
+ removeHooks: function () {
+ L.DomEvent.off(this._map._container, 'touchstart', this._onTouchStart, this);
+ },
+
+ _onTouchStart: function (e) {
+ var map = this._map;
+
+ if (!e.touches || e.touches.length !== 2 || map._animatingZoom || this._zooming) { return; }
+
+ var p1 = map.mouseEventToLayerPoint(e.touches[0]),
+ p2 = map.mouseEventToLayerPoint(e.touches[1]),
+ viewCenter = map._getCenterLayerPoint();
+
+ this._startCenter = p1.add(p2)._divideBy(2);
+ this._startDist = p1.distanceTo(p2);
+
+ this._moved = false;
+ this._zooming = true;
+
+ this._centerOffset = viewCenter.subtract(this._startCenter);
+
+ if (map._panAnim) {
+ map._panAnim.stop();
+ }
+
+ L.DomEvent
+ .on(document, 'touchmove', this._onTouchMove, this)
+ .on(document, 'touchend', this._onTouchEnd, this);
+
+ L.DomEvent.preventDefault(e);
+ },
+
+ _onTouchMove: function (e) {
+ var map = this._map;
+
+ if (!e.touches || e.touches.length !== 2 || !this._zooming) { return; }
+
+ var p1 = map.mouseEventToLayerPoint(e.touches[0]),
+ p2 = map.mouseEventToLayerPoint(e.touches[1]);
+
+ this._scale = p1.distanceTo(p2) / this._startDist;
+ this._delta = p1._add(p2)._divideBy(2)._subtract(this._startCenter);
+
+ if (this._scale === 1) { return; }
+
+ if (!map.options.bounceAtZoomLimits) {
+ if ((map.getZoom() === map.getMinZoom() && this._scale < 1) ||
+ (map.getZoom() === map.getMaxZoom() && this._scale > 1)) { return; }
+ }
+
+ if (!this._moved) {
+ L.DomUtil.addClass(map._mapPane, 'leaflet-touching');
+
+ map
+ .fire('movestart')
+ .fire('zoomstart');
+
+ this._moved = true;
+ }
+
+ L.Util.cancelAnimFrame(this._animRequest);
+ this._animRequest = L.Util.requestAnimFrame(
+ this._updateOnMove, this, true, this._map._container);
+
+ L.DomEvent.preventDefault(e);
+ },
+
+ _updateOnMove: function () {
+ var map = this._map,
+ origin = this._getScaleOrigin(),
+ center = map.layerPointToLatLng(origin),
+ zoom = map.getScaleZoom(this._scale);
+
+ map._animateZoom(center, zoom, this._startCenter, this._scale, this._delta, false, true);
+ },
+
+ _onTouchEnd: function () {
+ if (!this._moved || !this._zooming) {
+ this._zooming = false;
+ return;
+ }
+
+ var map = this._map;
+
+ this._zooming = false;
+ L.DomUtil.removeClass(map._mapPane, 'leaflet-touching');
+ L.Util.cancelAnimFrame(this._animRequest);
+
+ L.DomEvent
+ .off(document, 'touchmove', this._onTouchMove)
+ .off(document, 'touchend', this._onTouchEnd);
+
+ var origin = this._getScaleOrigin(),
+ center = map.layerPointToLatLng(origin),
+
+ oldZoom = map.getZoom(),
+ floatZoomDelta = map.getScaleZoom(this._scale) - oldZoom,
+ roundZoomDelta = (floatZoomDelta > 0 ?
+ Math.ceil(floatZoomDelta) : Math.floor(floatZoomDelta)),
+
+ zoom = map._limitZoom(oldZoom + roundZoomDelta),
+ scale = map.getZoomScale(zoom) / this._scale;
+
+ map._animateZoom(center, zoom, origin, scale);
+ },
+
+ _getScaleOrigin: function () {
+ var centerOffset = this._centerOffset.subtract(this._delta).divideBy(this._scale);
+ return this._startCenter.add(centerOffset);
+ }
+});
+
+L.Map.addInitHook('addHandler', 'touchZoom', L.Map.TouchZoom);
+
+
+/*
+ * L.Map.Tap is used to enable mobile hacks like quick taps and long hold.
+ */
+
+L.Map.mergeOptions({
+ tap: true,
+ tapTolerance: 15
+});
+
+L.Map.Tap = L.Handler.extend({
+ addHooks: function () {
+ L.DomEvent.on(this._map._container, 'touchstart', this._onDown, this);
+ },
+
+ removeHooks: function () {
+ L.DomEvent.off(this._map._container, 'touchstart', this._onDown, this);
+ },
+
+ _onDown: function (e) {
+ if (!e.touches) { return; }
+
+ L.DomEvent.preventDefault(e);
+
+ this._fireClick = true;
+
+ // don't simulate click or track longpress if more than 1 touch
+ if (e.touches.length > 1) {
+ this._fireClick = false;
+ clearTimeout(this._holdTimeout);
+ return;
+ }
+
+ var first = e.touches[0],
+ el = first.target;
+
+ this._startPos = this._newPos = new L.Point(first.clientX, first.clientY);
+
+ // if touching a link, highlight it
+ if (el.tagName && el.tagName.toLowerCase() === 'a') {
+ L.DomUtil.addClass(el, 'leaflet-active');
+ }
+
+ // simulate long hold but setting a timeout
+ this._holdTimeout = setTimeout(L.bind(function () {
+ if (this._isTapValid()) {
+ this._fireClick = false;
+ this._onUp();
+ this._simulateEvent('contextmenu', first);
+ }
+ }, this), 1000);
+
+ L.DomEvent
+ .on(document, 'touchmove', this._onMove, this)
+ .on(document, 'touchend', this._onUp, this);
+ },
+
+ _onUp: function (e) {
+ clearTimeout(this._holdTimeout);
+
+ L.DomEvent
+ .off(document, 'touchmove', this._onMove, this)
+ .off(document, 'touchend', this._onUp, this);
+
+ if (this._fireClick && e && e.changedTouches) {
+
+ var first = e.changedTouches[0],
+ el = first.target;
+
+ if (el && el.tagName && el.tagName.toLowerCase() === 'a') {
+ L.DomUtil.removeClass(el, 'leaflet-active');
+ }
+
+ // simulate click if the touch didn't move too much
+ if (this._isTapValid()) {
+ this._simulateEvent('click', first);
+ }
+ }
+ },
+
+ _isTapValid: function () {
+ return this._newPos.distanceTo(this._startPos) <= this._map.options.tapTolerance;
+ },
+
+ _onMove: function (e) {
+ var first = e.touches[0];
+ this._newPos = new L.Point(first.clientX, first.clientY);
+ },
+
+ _simulateEvent: function (type, e) {
+ var simulatedEvent = document.createEvent('MouseEvents');
+
+ simulatedEvent._simulated = true;
+ e.target._simulatedClick = true;
+
+ simulatedEvent.initMouseEvent(
+ type, true, true, window, 1,
+ e.screenX, e.screenY,
+ e.clientX, e.clientY,
+ false, false, false, false, 0, null);
+
+ e.target.dispatchEvent(simulatedEvent);
+ }
+});
+
+if (L.Browser.touch && !L.Browser.pointer) {
+ L.Map.addInitHook('addHandler', 'tap', L.Map.Tap);
+}
+
+
+/*
+ * L.Handler.ShiftDragZoom is used to add shift-drag zoom interaction to the map
+ * (zoom to a selected bounding box), enabled by default.
+ */
+
+L.Map.mergeOptions({
+ boxZoom: true
+});
+
+L.Map.BoxZoom = L.Handler.extend({
+ initialize: function (map) {
+ this._map = map;
+ this._container = map._container;
+ this._pane = map._panes.overlayPane;
+ this._moved = false;
+ },
+
+ addHooks: function () {
+ L.DomEvent.on(this._container, 'mousedown', this._onMouseDown, this);
+ },
+
+ removeHooks: function () {
+ L.DomEvent.off(this._container, 'mousedown', this._onMouseDown);
+ this._moved = false;
+ },
+
+ moved: function () {
+ return this._moved;
+ },
+
+ _onMouseDown: function (e) {
+ this._moved = false;
+
+ if (!e.shiftKey || ((e.which !== 1) && (e.button !== 1))) { return false; }
+
+ L.DomUtil.disableTextSelection();
+ L.DomUtil.disableImageDrag();
+
+ this._startLayerPoint = this._map.mouseEventToLayerPoint(e);
+
+ L.DomEvent
+ .on(document, 'mousemove', this._onMouseMove, this)
+ .on(document, 'mouseup', this._onMouseUp, this)
+ .on(document, 'keydown', this._onKeyDown, this);
+ },
+
+ _onMouseMove: function (e) {
+ if (!this._moved) {
+ this._box = L.DomUtil.create('div', 'leaflet-zoom-box', this._pane);
+ L.DomUtil.setPosition(this._box, this._startLayerPoint);
+
+ //TODO refactor: move cursor to styles
+ this._container.style.cursor = 'crosshair';
+ this._map.fire('boxzoomstart');
+ }
+
+ var startPoint = this._startLayerPoint,
+ box = this._box,
+
+ layerPoint = this._map.mouseEventToLayerPoint(e),
+ offset = layerPoint.subtract(startPoint),
+
+ newPos = new L.Point(
+ Math.min(layerPoint.x, startPoint.x),
+ Math.min(layerPoint.y, startPoint.y));
+
+ L.DomUtil.setPosition(box, newPos);
+
+ this._moved = true;
+
+ // TODO refactor: remove hardcoded 4 pixels
+ box.style.width = (Math.max(0, Math.abs(offset.x) - 4)) + 'px';
+ box.style.height = (Math.max(0, Math.abs(offset.y) - 4)) + 'px';
+ },
+
+ _finish: function () {
+ if (this._moved) {
+ this._pane.removeChild(this._box);
+ this._container.style.cursor = '';
+ }
+
+ L.DomUtil.enableTextSelection();
+ L.DomUtil.enableImageDrag();
+
+ L.DomEvent
+ .off(document, 'mousemove', this._onMouseMove)
+ .off(document, 'mouseup', this._onMouseUp)
+ .off(document, 'keydown', this._onKeyDown);
+ },
+
+ _onMouseUp: function (e) {
+
+ this._finish();
+
+ var map = this._map,
+ layerPoint = map.mouseEventToLayerPoint(e);
+
+ if (this._startLayerPoint.equals(layerPoint)) { return; }
+
+ var bounds = new L.LatLngBounds(
+ map.layerPointToLatLng(this._startLayerPoint),
+ map.layerPointToLatLng(layerPoint));
+
+ map.fitBounds(bounds);
+
+ map.fire('boxzoomend', {
+ boxZoomBounds: bounds
+ });
+ },
+
+ _onKeyDown: function (e) {
+ if (e.keyCode === 27) {
+ this._finish();
+ }
+ }
+});
+
+L.Map.addInitHook('addHandler', 'boxZoom', L.Map.BoxZoom);
+
+
+/*
+ * L.Map.Keyboard is handling keyboard interaction with the map, enabled by default.
+ */
+
+L.Map.mergeOptions({
+ keyboard: true,
+ keyboardPanOffset: 80,
+ keyboardZoomOffset: 1
+});
+
+L.Map.Keyboard = L.Handler.extend({
+
+ keyCodes: {
+ left: [37],
+ right: [39],
+ down: [40],
+ up: [38],
+ zoomIn: [187, 107, 61, 171],
+ zoomOut: [189, 109, 173]
+ },
+
+ initialize: function (map) {
+ this._map = map;
+
+ this._setPanOffset(map.options.keyboardPanOffset);
+ this._setZoomOffset(map.options.keyboardZoomOffset);
+ },
+
+ addHooks: function () {
+ var container = this._map._container;
+
+ // make the container focusable by tabbing
+ if (container.tabIndex === -1) {
+ container.tabIndex = '0';
+ }
+
+ L.DomEvent
+ .on(container, 'focus', this._onFocus, this)
+ .on(container, 'blur', this._onBlur, this)
+ .on(container, 'mousedown', this._onMouseDown, this);
+
+ this._map
+ .on('focus', this._addHooks, this)
+ .on('blur', this._removeHooks, this);
+ },
+
+ removeHooks: function () {
+ this._removeHooks();
+
+ var container = this._map._container;
+
+ L.DomEvent
+ .off(container, 'focus', this._onFocus, this)
+ .off(container, 'blur', this._onBlur, this)
+ .off(container, 'mousedown', this._onMouseDown, this);
+
+ this._map
+ .off('focus', this._addHooks, this)
+ .off('blur', this._removeHooks, this);
+ },
+
+ _onMouseDown: function () {
+ if (this._focused) { return; }
+
+ var body = document.body,
+ docEl = document.documentElement,
+ top = body.scrollTop || docEl.scrollTop,
+ left = body.scrollLeft || docEl.scrollLeft;
+
+ this._map._container.focus();
+
+ window.scrollTo(left, top);
+ },
+
+ _onFocus: function () {
+ this._focused = true;
+ this._map.fire('focus');
+ },
+
+ _onBlur: function () {
+ this._focused = false;
+ this._map.fire('blur');
+ },
+
+ _setPanOffset: function (pan) {
+ var keys = this._panKeys = {},
+ codes = this.keyCodes,
+ i, len;
+
+ for (i = 0, len = codes.left.length; i < len; i++) {
+ keys[codes.left[i]] = [-1 * pan, 0];
+ }
+ for (i = 0, len = codes.right.length; i < len; i++) {
+ keys[codes.right[i]] = [pan, 0];
+ }
+ for (i = 0, len = codes.down.length; i < len; i++) {
+ keys[codes.down[i]] = [0, pan];
+ }
+ for (i = 0, len = codes.up.length; i < len; i++) {
+ keys[codes.up[i]] = [0, -1 * pan];
+ }
+ },
+
+ _setZoomOffset: function (zoom) {
+ var keys = this._zoomKeys = {},
+ codes = this.keyCodes,
+ i, len;
+
+ for (i = 0, len = codes.zoomIn.length; i < len; i++) {
+ keys[codes.zoomIn[i]] = zoom;
+ }
+ for (i = 0, len = codes.zoomOut.length; i < len; i++) {
+ keys[codes.zoomOut[i]] = -zoom;
+ }
+ },
+
+ _addHooks: function () {
+ L.DomEvent.on(document, 'keydown', this._onKeyDown, this);
+ },
+
+ _removeHooks: function () {
+ L.DomEvent.off(document, 'keydown', this._onKeyDown, this);
+ },
+
+ _onKeyDown: function (e) {
+ var key = e.keyCode,
+ map = this._map;
+
+ if (key in this._panKeys) {
+
+ if (map._panAnim && map._panAnim._inProgress) { return; }
+
+ map.panBy(this._panKeys[key]);
+
+ if (map.options.maxBounds) {
+ map.panInsideBounds(map.options.maxBounds);
+ }
+
+ } else if (key in this._zoomKeys) {
+ map.setZoom(map.getZoom() + this._zoomKeys[key]);
+
+ } else {
+ return;
+ }
+
+ L.DomEvent.stop(e);
+ }
+});
+
+L.Map.addInitHook('addHandler', 'keyboard', L.Map.Keyboard);
+
+
+/*
+ * L.Handler.MarkerDrag is used internally by L.Marker to make the markers draggable.
+ */
+
+L.Handler.MarkerDrag = L.Handler.extend({
+ initialize: function (marker) {
+ this._marker = marker;
+ },
+
+ addHooks: function () {
+ var icon = this._marker._icon;
+ if (!this._draggable) {
+ this._draggable = new L.Draggable(icon, icon);
+ }
+
+ this._draggable
+ .on('dragstart', this._onDragStart, this)
+ .on('drag', this._onDrag, this)
+ .on('dragend', this._onDragEnd, this);
+ this._draggable.enable();
+ L.DomUtil.addClass(this._marker._icon, 'leaflet-marker-draggable');
+ },
+
+ removeHooks: function () {
+ this._draggable
+ .off('dragstart', this._onDragStart, this)
+ .off('drag', this._onDrag, this)
+ .off('dragend', this._onDragEnd, this);
+
+ this._draggable.disable();
+ L.DomUtil.removeClass(this._marker._icon, 'leaflet-marker-draggable');
+ },
+
+ moved: function () {
+ return this._draggable && this._draggable._moved;
+ },
+
+ _onDragStart: function () {
+ this._marker
+ .closePopup()
+ .fire('movestart')
+ .fire('dragstart');
+ },
+
+ _onDrag: function () {
+ var marker = this._marker,
+ shadow = marker._shadow,
+ iconPos = L.DomUtil.getPosition(marker._icon),
+ latlng = marker._map.layerPointToLatLng(iconPos);
+
+ // update shadow position
+ if (shadow) {
+ L.DomUtil.setPosition(shadow, iconPos);
+ }
+
+ marker._latlng = latlng;
+
+ marker
+ .fire('move', {latlng: latlng})
+ .fire('drag');
+ },
+
+ _onDragEnd: function (e) {
+ this._marker
+ .fire('moveend')
+ .fire('dragend', e);
+ }
+});
+
+
+/*
+ * L.Control is a base class for implementing map controls. Handles positioning.
+ * All other controls extend from this class.
+ */
+
+L.Control = L.Class.extend({
+ options: {
+ position: 'topright'
+ },
+
+ initialize: function (options) {
+ L.setOptions(this, options);
+ },
+
+ getPosition: function () {
+ return this.options.position;
+ },
+
+ setPosition: function (position) {
+ var map = this._map;
+
+ if (map) {
+ map.removeControl(this);
+ }
+
+ this.options.position = position;
+
+ if (map) {
+ map.addControl(this);
+ }
+
+ return this;
+ },
+
+ getContainer: function () {
+ return this._container;
+ },
+
+ addTo: function (map) {
+ this._map = map;
+
+ var container = this._container = this.onAdd(map),
+ pos = this.getPosition(),
+ corner = map._controlCorners[pos];
+
+ L.DomUtil.addClass(container, 'leaflet-control');
+
+ if (pos.indexOf('bottom') !== -1) {
+ corner.insertBefore(container, corner.firstChild);
+ } else {
+ corner.appendChild(container);
+ }
+
+ return this;
+ },
+
+ removeFrom: function (map) {
+ var pos = this.getPosition(),
+ corner = map._controlCorners[pos];
+
+ corner.removeChild(this._container);
+ this._map = null;
+
+ if (this.onRemove) {
+ this.onRemove(map);
+ }
+
+ return this;
+ },
+
+ _refocusOnMap: function () {
+ if (this._map) {
+ this._map.getContainer().focus();
+ }
+ }
+});
+
+L.control = function (options) {
+ return new L.Control(options);
+};
+
+
+// adds control-related methods to L.Map
+
+L.Map.include({
+ addControl: function (control) {
+ control.addTo(this);
+ return this;
+ },
+
+ removeControl: function (control) {
+ control.removeFrom(this);
+ return this;
+ },
+
+ _initControlPos: function () {
+ var corners = this._controlCorners = {},
+ l = 'leaflet-',
+ container = this._controlContainer =
+ L.DomUtil.create('div', l + 'control-container', this._container);
+
+ function createCorner(vSide, hSide) {
+ var className = l + vSide + ' ' + l + hSide;
+
+ corners[vSide + hSide] = L.DomUtil.create('div', className, container);
+ }
+
+ createCorner('top', 'left');
+ createCorner('top', 'right');
+ createCorner('bottom', 'left');
+ createCorner('bottom', 'right');
+ },
+
+ _clearControlPos: function () {
+ this._container.removeChild(this._controlContainer);
+ }
+});
+
+
+/*
+ * L.Control.Zoom is used for the default zoom buttons on the map.
+ */
+
+L.Control.Zoom = L.Control.extend({
+ options: {
+ position: 'topleft',
+ zoomInText: '+',
+ zoomInTitle: 'Zoom in',
+ zoomOutText: '-',
+ zoomOutTitle: 'Zoom out'
+ },
+
+ onAdd: function (map) {
+ var zoomName = 'leaflet-control-zoom',
+ container = L.DomUtil.create('div', zoomName + ' leaflet-bar');
+
+ this._map = map;
+
+ this._zoomInButton = this._createButton(
+ this.options.zoomInText, this.options.zoomInTitle,
+ zoomName + '-in', container, this._zoomIn, this);
+ this._zoomOutButton = this._createButton(
+ this.options.zoomOutText, this.options.zoomOutTitle,
+ zoomName + '-out', container, this._zoomOut, this);
+
+ this._updateDisabled();
+ map.on('zoomend zoomlevelschange', this._updateDisabled, this);
+
+ return container;
+ },
+
+ onRemove: function (map) {
+ map.off('zoomend zoomlevelschange', this._updateDisabled, this);
+ },
+
+ _zoomIn: function (e) {
+ this._map.zoomIn(e.shiftKey ? 3 : 1);
+ },
+
+ _zoomOut: function (e) {
+ this._map.zoomOut(e.shiftKey ? 3 : 1);
+ },
+
+ _createButton: function (html, title, className, container, fn, context) {
+ var link = L.DomUtil.create('a', className, container);
+ link.innerHTML = html;
+ link.href = '#';
+ link.title = title;
+
+ var stop = L.DomEvent.stopPropagation;
+
+ L.DomEvent
+ .on(link, 'click', stop)
+ .on(link, 'mousedown', stop)
+ .on(link, 'dblclick', stop)
+ .on(link, 'click', L.DomEvent.preventDefault)
+ .on(link, 'click', fn, context)
+ .on(link, 'click', this._refocusOnMap, context);
+
+ return link;
+ },
+
+ _updateDisabled: function () {
+ var map = this._map,
+ className = 'leaflet-disabled';
+
+ L.DomUtil.removeClass(this._zoomInButton, className);
+ L.DomUtil.removeClass(this._zoomOutButton, className);
+
+ if (map._zoom === map.getMinZoom()) {
+ L.DomUtil.addClass(this._zoomOutButton, className);
+ }
+ if (map._zoom === map.getMaxZoom()) {
+ L.DomUtil.addClass(this._zoomInButton, className);
+ }
+ }
+});
+
+L.Map.mergeOptions({
+ zoomControl: true
+});
+
+L.Map.addInitHook(function () {
+ if (this.options.zoomControl) {
+ this.zoomControl = new L.Control.Zoom();
+ this.addControl(this.zoomControl);
+ }
+});
+
+L.control.zoom = function (options) {
+ return new L.Control.Zoom(options);
+};
+
+
+
+/*
+ * L.Control.Attribution is used for displaying attribution on the map (added by default).
+ */
+
+L.Control.Attribution = L.Control.extend({
+ options: {
+ position: 'bottomright',
+ prefix: '<a href="http://leafletjs.com" title="A JS library for interactive maps">Leaflet</a>'
+ },
+
+ initialize: function (options) {
+ L.setOptions(this, options);
+
+ this._attributions = {};
+ },
+
+ onAdd: function (map) {
+ this._container = L.DomUtil.create('div', 'leaflet-control-attribution');
+ L.DomEvent.disableClickPropagation(this._container);
+
+ for (var i in map._layers) {
+ if (map._layers[i].getAttribution) {
+ this.addAttribution(map._layers[i].getAttribution());
+ }
+ }
+
+ map
+ .on('layeradd', this._onLayerAdd, this)
+ .on('layerremove', this._onLayerRemove, this);
+
+ this._update();
+
+ return this._container;
+ },
+
+ onRemove: function (map) {
+ map
+ .off('layeradd', this._onLayerAdd)
+ .off('layerremove', this._onLayerRemove);
+
+ },
+
+ setPrefix: function (prefix) {
+ this.options.prefix = prefix;
+ this._update();
+ return this;
+ },
+
+ addAttribution: function (text) {
+ if (!text) { return; }
+
+ if (!this._attributions[text]) {
+ this._attributions[text] = 0;
+ }
+ this._attributions[text]++;
+
+ this._update();
+
+ return this;
+ },
+
+ removeAttribution: function (text) {
+ if (!text) { return; }
+
+ if (this._attributions[text]) {
+ this._attributions[text]--;
+ this._update();
+ }
+
+ return this;
+ },
+
+ _update: function () {
+ if (!this._map) { return; }
+
+ var attribs = [];
+
+ for (var i in this._attributions) {
+ if (this._attributions[i]) {
+ attribs.push(i);
+ }
+ }
+
+ var prefixAndAttribs = [];
+
+ if (this.options.prefix) {
+ prefixAndAttribs.push(this.options.prefix);
+ }
+ if (attribs.length) {
+ prefixAndAttribs.push(attribs.join(', '));
+ }
+
+ this._container.innerHTML = prefixAndAttribs.join(' | ');
+ },
+
+ _onLayerAdd: function (e) {
+ if (e.layer.getAttribution) {
+ this.addAttribution(e.layer.getAttribution());
+ }
+ },
+
+ _onLayerRemove: function (e) {
+ if (e.layer.getAttribution) {
+ this.removeAttribution(e.layer.getAttribution());
+ }
+ }
+});
+
+L.Map.mergeOptions({
+ attributionControl: true
+});
+
+L.Map.addInitHook(function () {
+ if (this.options.attributionControl) {
+ this.attributionControl = (new L.Control.Attribution()).addTo(this);
+ }
+});
+
+L.control.attribution = function (options) {
+ return new L.Control.Attribution(options);
+};
+
+
+/*
+ * L.Control.Scale is used for displaying metric/imperial scale on the map.
+ */
+
+L.Control.Scale = L.Control.extend({
+ options: {
+ position: 'bottomleft',
+ maxWidth: 100,
+ metric: true,
+ imperial: true,
+ updateWhenIdle: false
+ },
+
+ onAdd: function (map) {
+ this._map = map;
+
+ var className = 'leaflet-control-scale',
+ container = L.DomUtil.create('div', className),
+ options = this.options;
+
+ this._addScales(options, className, container);
+
+ map.on(options.updateWhenIdle ? 'moveend' : 'move', this._update, this);
+ map.whenReady(this._update, this);
+
+ return container;
+ },
+
+ onRemove: function (map) {
+ map.off(this.options.updateWhenIdle ? 'moveend' : 'move', this._update, this);
+ },
+
+ _addScales: function (options, className, container) {
+ if (options.metric) {
+ this._mScale = L.DomUtil.create('div', className + '-line', container);
+ }
+ if (options.imperial) {
+ this._iScale = L.DomUtil.create('div', className + '-line', container);
+ }
+ },
+
+ _update: function () {
+ var bounds = this._map.getBounds(),
+ centerLat = bounds.getCenter().lat,
+ halfWorldMeters = 6378137 * Math.PI * Math.cos(centerLat * Math.PI / 180),
+ dist = halfWorldMeters * (bounds.getNorthEast().lng - bounds.getSouthWest().lng) / 180,
+
+ size = this._map.getSize(),
+ options = this.options,
+ maxMeters = 0;
+
+ if (size.x > 0) {
+ maxMeters = dist * (options.maxWidth / size.x);
+ }
+
+ this._updateScales(options, maxMeters);
+ },
+
+ _updateScales: function (options, maxMeters) {
+ if (options.metric && maxMeters) {
+ this._updateMetric(maxMeters);
+ }
+
+ if (options.imperial && maxMeters) {
+ this._updateImperial(maxMeters);
+ }
+ },
+
+ _updateMetric: function (maxMeters) {
+ var meters = this._getRoundNum(maxMeters);
+
+ this._mScale.style.width = this._getScaleWidth(meters / maxMeters) + 'px';
+ this._mScale.innerHTML = meters < 1000 ? meters + ' m' : (meters / 1000) + ' km';
+ },
+
+ _updateImperial: function (maxMeters) {
+ var maxFeet = maxMeters * 3.2808399,
+ scale = this._iScale,
+ maxMiles, miles, feet;
+
+ if (maxFeet > 5280) {
+ maxMiles = maxFeet / 5280;
+ miles = this._getRoundNum(maxMiles);
+
+ scale.style.width = this._getScaleWidth(miles / maxMiles) + 'px';
+ scale.innerHTML = miles + ' mi';
+
+ } else {
+ feet = this._getRoundNum(maxFeet);
+
+ scale.style.width = this._getScaleWidth(feet / maxFeet) + 'px';
+ scale.innerHTML = feet + ' ft';
+ }
+ },
+
+ _getScaleWidth: function (ratio) {
+ return Math.round(this.options.maxWidth * ratio) - 10;
+ },
+
+ _getRoundNum: function (num) {
+ var pow10 = Math.pow(10, (Math.floor(num) + '').length - 1),
+ d = num / pow10;
+
+ d = d >= 10 ? 10 : d >= 5 ? 5 : d >= 3 ? 3 : d >= 2 ? 2 : 1;
+
+ return pow10 * d;
+ }
+});
+
+L.control.scale = function (options) {
+ return new L.Control.Scale(options);
+};
+
+
+/*
+ * L.Control.Layers is a control to allow users to switch between different layers on the map.
+ */
+
+L.Control.Layers = L.Control.extend({
+ options: {
+ collapsed: true,
+ position: 'topright',
+ autoZIndex: true
+ },
+
+ initialize: function (baseLayers, overlays, options) {
+ L.setOptions(this, options);
+
+ this._layers = {};
+ this._lastZIndex = 0;
+ this._handlingClick = false;
+
+ for (var i in baseLayers) {
+ this._addLayer(baseLayers[i], i);
+ }
+
+ for (i in overlays) {
+ this._addLayer(overlays[i], i, true);
+ }
+ },
+
+ onAdd: function (map) {
+ this._initLayout();
+ this._update();
+
+ map
+ .on('layeradd', this._onLayerChange, this)
+ .on('layerremove', this._onLayerChange, this);
+
+ return this._container;
+ },
+
+ onRemove: function (map) {
+ map
+ .off('layeradd', this._onLayerChange, this)
+ .off('layerremove', this._onLayerChange, this);
+ },
+
+ addBaseLayer: function (layer, name) {
+ this._addLayer(layer, name);
+ this._update();
+ return this;
+ },
+
+ addOverlay: function (layer, name) {
+ this._addLayer(layer, name, true);
+ this._update();
+ return this;
+ },
+
+ removeLayer: function (layer) {
+ var id = L.stamp(layer);
+ delete this._layers[id];
+ this._update();
+ return this;
+ },
+
+ _initLayout: function () {
+ var className = 'leaflet-control-layers',
+ container = this._container = L.DomUtil.create('div', className);
+
+ //Makes this work on IE10 Touch devices by stopping it from firing a mouseout event when the touch is released
+ container.setAttribute('aria-haspopup', true);
+
+ if (!L.Browser.touch) {
+ L.DomEvent
+ .disableClickPropagation(container)
+ .disableScrollPropagation(container);
+ } else {
+ L.DomEvent.on(container, 'click', L.DomEvent.stopPropagation);
+ }
+
+ var form = this._form = L.DomUtil.create('form', className + '-list');
+
+ if (this.options.collapsed) {
+ if (!L.Browser.android) {
+ L.DomEvent
+ .on(container, 'mouseover', this._expand, this)
+ .on(container, 'mouseout', this._collapse, this);
+ }
+ var link = this._layersLink = L.DomUtil.create('a', className + '-toggle', container);
+ link.href = '#';
+ link.title = 'Layers';
+
+ if (L.Browser.touch) {
+ L.DomEvent
+ .on(link, 'click', L.DomEvent.stop)
+ .on(link, 'click', this._expand, this);
+ }
+ else {
+ L.DomEvent.on(link, 'focus', this._expand, this);
+ }
+ //Work around for Firefox android issue https://github.com/Leaflet/Leaflet/issues/2033
+ L.DomEvent.on(form, 'click', function () {
+ setTimeout(L.bind(this._onInputClick, this), 0);
+ }, this);
+
+ this._map.on('click', this._collapse, this);
+ // TODO keyboard accessibility
+ } else {
+ this._expand();
+ }
+
+ this._baseLayersList = L.DomUtil.create('div', className + '-base', form);
+ this._separator = L.DomUtil.create('div', className + '-separator', form);
+ this._overlaysList = L.DomUtil.create('div', className + '-overlays', form);
+
+ container.appendChild(form);
+ },
+
+ _addLayer: function (layer, name, overlay) {
+ var id = L.stamp(layer);
+
+ this._layers[id] = {
+ layer: layer,
+ name: name,
+ overlay: overlay
+ };
+
+ if (this.options.autoZIndex && layer.setZIndex) {
+ this._lastZIndex++;
+ layer.setZIndex(this._lastZIndex);
+ }
+ },
+
+ _update: function () {
+ if (!this._container) {
+ return;
+ }
+
+ this._baseLayersList.innerHTML = '';
+ this._overlaysList.innerHTML = '';
+
+ var baseLayersPresent = false,
+ overlaysPresent = false,
+ i, obj;
+
+ for (i in this._layers) {
+ obj = this._layers[i];
+ this._addItem(obj);
+ overlaysPresent = overlaysPresent || obj.overlay;
+ baseLayersPresent = baseLayersPresent || !obj.overlay;
+ }
+
+ this._separator.style.display = overlaysPresent && baseLayersPresent ? '' : 'none';
+ },
+
+ _onLayerChange: function (e) {
+ var obj = this._layers[L.stamp(e.layer)];
+
+ if (!obj) { return; }
+
+ if (!this._handlingClick) {
+ this._update();
+ }
+
+ var type = obj.overlay ?
+ (e.type === 'layeradd' ? 'overlayadd' : 'overlayremove') :
+ (e.type === 'layeradd' ? 'baselayerchange' : null);
+
+ if (type) {
+ this._map.fire(type, obj);
+ }
+ },
+
+ // IE7 bugs out if you create a radio dynamically, so you have to do it this hacky way (see http://bit.ly/PqYLBe)
+ _createRadioElement: function (name, checked) {
+
+ var radioHtml = '<input type="radio" class="leaflet-control-layers-selector" name="' + name + '"';
+ if (checked) {
+ radioHtml += ' checked="checked"';
+ }
+ radioHtml += '/>';
+
+ var radioFragment = document.createElement('div');
+ radioFragment.innerHTML = radioHtml;
+
+ return radioFragment.firstChild;
+ },
+
+ _addItem: function (obj) {
+ var label = document.createElement('label'),
+ input,
+ checked = this._map.hasLayer(obj.layer);
+
+ if (obj.overlay) {
+ input = document.createElement('input');
+ input.type = 'checkbox';
+ input.className = 'leaflet-control-layers-selector';
+ input.defaultChecked = checked;
+ } else {
+ input = this._createRadioElement('leaflet-base-layers', checked);
+ }
+
+ input.layerId = L.stamp(obj.layer);
+
+ L.DomEvent.on(input, 'click', this._onInputClick, this);
+
+ var name = document.createElement('span');
+ name.innerHTML = ' ' + obj.name;
+
+ label.appendChild(input);
+ label.appendChild(name);
+
+ var container = obj.overlay ? this._overlaysList : this._baseLayersList;
+ container.appendChild(label);
+
+ return label;
+ },
+
+ _onInputClick: function () {
+ var i, input, obj,
+ inputs = this._form.getElementsByTagName('input'),
+ inputsLen = inputs.length;
+
+ this._handlingClick = true;
+
+ for (i = 0; i < inputsLen; i++) {
+ input = inputs[i];
+ obj = this._layers[input.layerId];
+
+ if (input.checked && !this._map.hasLayer(obj.layer)) {
+ this._map.addLayer(obj.layer);
+
+ } else if (!input.checked && this._map.hasLayer(obj.layer)) {
+ this._map.removeLayer(obj.layer);
+ }
+ }
+
+ this._handlingClick = false;
+
+ this._refocusOnMap();
+ },
+
+ _expand: function () {
+ L.DomUtil.addClass(this._container, 'leaflet-control-layers-expanded');
+ },
+
+ _collapse: function () {
+ this._container.className = this._container.className.replace(' leaflet-control-layers-expanded', '');
+ }
+});
+
+L.control.layers = function (baseLayers, overlays, options) {
+ return new L.Control.Layers(baseLayers, overlays, options);
+};
+
+
+/*
+ * L.PosAnimation is used by Leaflet internally for pan animations.
+ */
+
+L.PosAnimation = L.Class.extend({
+ includes: L.Mixin.Events,
+
+ run: function (el, newPos, duration, easeLinearity) { // (HTMLElement, Point[, Number, Number])
+ this.stop();
+
+ this._el = el;
+ this._inProgress = true;
+ this._newPos = newPos;
+
+ this.fire('start');
+
+ el.style[L.DomUtil.TRANSITION] = 'all ' + (duration || 0.25) +
+ 's cubic-bezier(0,0,' + (easeLinearity || 0.5) + ',1)';
+
+ L.DomEvent.on(el, L.DomUtil.TRANSITION_END, this._onTransitionEnd, this);
+ L.DomUtil.setPosition(el, newPos);
+
+ // toggle reflow, Chrome flickers for some reason if you don't do this
+ L.Util.falseFn(el.offsetWidth);
+
+ // there's no native way to track value updates of transitioned properties, so we imitate this
+ this._stepTimer = setInterval(L.bind(this._onStep, this), 50);
+ },
+
+ stop: function () {
+ if (!this._inProgress) { return; }
+
+ // if we just removed the transition property, the element would jump to its final position,
+ // so we need to make it stay at the current position
+
+ L.DomUtil.setPosition(this._el, this._getPos());
+ this._onTransitionEnd();
+ L.Util.falseFn(this._el.offsetWidth); // force reflow in case we are about to start a new animation
+ },
+
+ _onStep: function () {
+ var stepPos = this._getPos();
+ if (!stepPos) {
+ this._onTransitionEnd();
+ return;
+ }
+ // jshint camelcase: false
+ // make L.DomUtil.getPosition return intermediate position value during animation
+ this._el._leaflet_pos = stepPos;
+
+ this.fire('step');
+ },
+
+ // you can't easily get intermediate values of properties animated with CSS3 Transitions,
+ // we need to parse computed style (in case of transform it returns matrix string)
+
+ _transformRe: /([-+]?(?:\d*\.)?\d+)\D*, ([-+]?(?:\d*\.)?\d+)\D*\)/,
+
+ _getPos: function () {
+ var left, top, matches,
+ el = this._el,
+ style = window.getComputedStyle(el);
+
+ if (L.Browser.any3d) {
+ matches = style[L.DomUtil.TRANSFORM].match(this._transformRe);
+ if (!matches) { return; }
+ left = parseFloat(matches[1]);
+ top = parseFloat(matches[2]);
+ } else {
+ left = parseFloat(style.left);
+ top = parseFloat(style.top);
+ }
+
+ return new L.Point(left, top, true);
+ },
+
+ _onTransitionEnd: function () {
+ L.DomEvent.off(this._el, L.DomUtil.TRANSITION_END, this._onTransitionEnd, this);
+
+ if (!this._inProgress) { return; }
+ this._inProgress = false;
+
+ this._el.style[L.DomUtil.TRANSITION] = '';
+
+ // jshint camelcase: false
+ // make sure L.DomUtil.getPosition returns the final position value after animation
+ this._el._leaflet_pos = this._newPos;
+
+ clearInterval(this._stepTimer);
+
+ this.fire('step').fire('end');
+ }
+
+});
+
+
+/*
+ * Extends L.Map to handle panning animations.
+ */
+
+L.Map.include({
+
+ setView: function (center, zoom, options) {
+
+ zoom = zoom === undefined ? this._zoom : this._limitZoom(zoom);
+ center = this._limitCenter(L.latLng(center), zoom, this.options.maxBounds);
+ options = options || {};
+
+ if (this._panAnim) {
+ this._panAnim.stop();
+ }
+
+ if (this._loaded && !options.reset && options !== true) {
+
+ if (options.animate !== undefined) {
+ options.zoom = L.extend({animate: options.animate}, options.zoom);
+ options.pan = L.extend({animate: options.animate}, options.pan);
+ }
+
+ // try animating pan or zoom
+ var animated = (this._zoom !== zoom) ?
+ this._tryAnimatedZoom && this._tryAnimatedZoom(center, zoom, options.zoom) :
+ this._tryAnimatedPan(center, options.pan);
+
+ if (animated) {
+ // prevent resize handler call, the view will refresh after animation anyway
+ clearTimeout(this._sizeTimer);
+ return this;
+ }
+ }
+
+ // animation didn't start, just reset the map view
+ this._resetView(center, zoom);
+
+ return this;
+ },
+
+ panBy: function (offset, options) {
+ offset = L.point(offset).round();
+ options = options || {};
+
+ if (!offset.x && !offset.y) {
+ return this;
+ }
+
+ if (!this._panAnim) {
+ this._panAnim = new L.PosAnimation();
+
+ this._panAnim.on({
+ 'step': this._onPanTransitionStep,
+ 'end': this._onPanTransitionEnd
+ }, this);
+ }
+
+ // don't fire movestart if animating inertia
+ if (!options.noMoveStart) {
+ this.fire('movestart');
+ }
+
+ // animate pan unless animate: false specified
+ if (options.animate !== false) {
+ L.DomUtil.addClass(this._mapPane, 'leaflet-pan-anim');
+
+ var newPos = this._getMapPanePos().subtract(offset);
+ this._panAnim.run(this._mapPane, newPos, options.duration || 0.25, options.easeLinearity);
+ } else {
+ this._rawPanBy(offset);
+ this.fire('move').fire('moveend');
+ }
+
+ return this;
+ },
+
+ _onPanTransitionStep: function () {
+ this.fire('move');
+ },
+
+ _onPanTransitionEnd: function () {
+ L.DomUtil.removeClass(this._mapPane, 'leaflet-pan-anim');
+ this.fire('moveend');
+ },
+
+ _tryAnimatedPan: function (center, options) {
+ // difference between the new and current centers in pixels
+ var offset = this._getCenterOffset(center)._floor();
+
+ // don't animate too far unless animate: true specified in options
+ if ((options && options.animate) !== true && !this.getSize().contains(offset)) { return false; }
+
+ this.panBy(offset, options);
+
+ return true;
+ }
+});
+
+
+/*
+ * L.PosAnimation fallback implementation that powers Leaflet pan animations
+ * in browsers that don't support CSS3 Transitions.
+ */
+
+L.PosAnimation = L.DomUtil.TRANSITION ? L.PosAnimation : L.PosAnimation.extend({
+
+ run: function (el, newPos, duration, easeLinearity) { // (HTMLElement, Point[, Number, Number])
+ this.stop();
+
+ this._el = el;
+ this._inProgress = true;
+ this._duration = duration || 0.25;
+ this._easeOutPower = 1 / Math.max(easeLinearity || 0.5, 0.2);
+
+ this._startPos = L.DomUtil.getPosition(el);
+ this._offset = newPos.subtract(this._startPos);
+ this._startTime = +new Date();
+
+ this.fire('start');
+
+ this._animate();
+ },
+
+ stop: function () {
+ if (!this._inProgress) { return; }
+
+ this._step();
+ this._complete();
+ },
+
+ _animate: function () {
+ // animation loop
+ this._animId = L.Util.requestAnimFrame(this._animate, this);
+ this._step();
+ },
+
+ _step: function () {
+ var elapsed = (+new Date()) - this._startTime,
+ duration = this._duration * 1000;
+
+ if (elapsed < duration) {
+ this._runFrame(this._easeOut(elapsed / duration));
+ } else {
+ this._runFrame(1);
+ this._complete();
+ }
+ },
+
+ _runFrame: function (progress) {
+ var pos = this._startPos.add(this._offset.multiplyBy(progress));
+ L.DomUtil.setPosition(this._el, pos);
+
+ this.fire('step');
+ },
+
+ _complete: function () {
+ L.Util.cancelAnimFrame(this._animId);
+
+ this._inProgress = false;
+ this.fire('end');
+ },
+
+ _easeOut: function (t) {
+ return 1 - Math.pow(1 - t, this._easeOutPower);
+ }
+});
+
+
+/*
+ * Extends L.Map to handle zoom animations.
+ */
+
+L.Map.mergeOptions({
+ zoomAnimation: true,
+ zoomAnimationThreshold: 4
+});
+
+if (L.DomUtil.TRANSITION) {
+
+ L.Map.addInitHook(function () {
+ // don't animate on browsers without hardware-accelerated transitions or old Android/Opera
+ this._zoomAnimated = this.options.zoomAnimation && L.DomUtil.TRANSITION &&
+ L.Browser.any3d && !L.Browser.android23 && !L.Browser.mobileOpera;
+
+ // zoom transitions run with the same duration for all layers, so if one of transitionend events
+ // happens after starting zoom animation (propagating to the map pane), we know that it ended globally
+ if (this._zoomAnimated) {
+ L.DomEvent.on(this._mapPane, L.DomUtil.TRANSITION_END, this._catchTransitionEnd, this);
+ }
+ });
+}
+
+L.Map.include(!L.DomUtil.TRANSITION ? {} : {
+
+ _catchTransitionEnd: function (e) {
+ if (this._animatingZoom && e.propertyName.indexOf('transform') >= 0) {
+ this._onZoomTransitionEnd();
+ }
+ },
+
+ _nothingToAnimate: function () {
+ return !this._container.getElementsByClassName('leaflet-zoom-animated').length;
+ },
+
+ _tryAnimatedZoom: function (center, zoom, options) {
+
+ if (this._animatingZoom) { return true; }
+
+ options = options || {};
+
+ // don't animate if disabled, not supported or zoom difference is too large
+ if (!this._zoomAnimated || options.animate === false || this._nothingToAnimate() ||
+ Math.abs(zoom - this._zoom) > this.options.zoomAnimationThreshold) { return false; }
+
+ // offset is the pixel coords of the zoom origin relative to the current center
+ var scale = this.getZoomScale(zoom),
+ offset = this._getCenterOffset(center)._divideBy(1 - 1 / scale),
+ origin = this._getCenterLayerPoint()._add(offset);
+
+ // don't animate if the zoom origin isn't within one screen from the current center, unless forced
+ if (options.animate !== true && !this.getSize().contains(offset)) { return false; }
+
+ this
+ .fire('movestart')
+ .fire('zoomstart');
+
+ this._animateZoom(center, zoom, origin, scale, null, true);
+
+ return true;
+ },
+
+ _animateZoom: function (center, zoom, origin, scale, delta, backwards, forTouchZoom) {
+
+ if (!forTouchZoom) {
+ this._animatingZoom = true;
+ }
+
+ // put transform transition on all layers with leaflet-zoom-animated class
+ L.DomUtil.addClass(this._mapPane, 'leaflet-zoom-anim');
+
+ // remember what center/zoom to set after animation
+ this._animateToCenter = center;
+ this._animateToZoom = zoom;
+
+ // disable any dragging during animation
+ if (L.Draggable) {
+ L.Draggable._disabled = true;
+ }
+
+ L.Util.requestAnimFrame(function () {
+ this.fire('zoomanim', {
+ center: center,
+ zoom: zoom,
+ origin: origin,
+ scale: scale,
+ delta: delta,
+ backwards: backwards
+ });
+ // horrible hack to work around a Chrome bug https://github.com/Leaflet/Leaflet/issues/3689
+ setTimeout(L.bind(this._onZoomTransitionEnd, this), 250);
+ }, this);
+ },
+
+ _onZoomTransitionEnd: function () {
+ if (!this._animatingZoom) { return; }
+
+ this._animatingZoom = false;
+
+ L.DomUtil.removeClass(this._mapPane, 'leaflet-zoom-anim');
+
+ L.Util.requestAnimFrame(function () {
+ this._resetView(this._animateToCenter, this._animateToZoom, true, true);
+
+ if (L.Draggable) {
+ L.Draggable._disabled = false;
+ }
+ }, this);
+ }
+});
+
+
+/*
+ Zoom animation logic for L.TileLayer.
+*/
+
+L.TileLayer.include({
+ _animateZoom: function (e) {
+ if (!this._animating) {
+ this._animating = true;
+ this._prepareBgBuffer();
+ }
+
+ var bg = this._bgBuffer,
+ transform = L.DomUtil.TRANSFORM,
+ initialTransform = e.delta ? L.DomUtil.getTranslateString(e.delta) : bg.style[transform],
+ scaleStr = L.DomUtil.getScaleString(e.scale, e.origin);
+
+ bg.style[transform] = e.backwards ?
+ scaleStr + ' ' + initialTransform :
+ initialTransform + ' ' + scaleStr;
+ },
+
+ _endZoomAnim: function () {
+ var front = this._tileContainer,
+ bg = this._bgBuffer;
+
+ front.style.visibility = '';
+ front.parentNode.appendChild(front); // Bring to fore
+
+ // force reflow
+ L.Util.falseFn(bg.offsetWidth);
+
+ var zoom = this._map.getZoom();
+ if (zoom > this.options.maxZoom || zoom < this.options.minZoom) {
+ this._clearBgBuffer();
+ }
+
+ this._animating = false;
+ },
+
+ _clearBgBuffer: function () {
+ var map = this._map;
+
+ if (map && !map._animatingZoom && !map.touchZoom._zooming) {
+ this._bgBuffer.innerHTML = '';
+ this._bgBuffer.style[L.DomUtil.TRANSFORM] = '';
+ }
+ },
+
+ _prepareBgBuffer: function () {
+
+ var front = this._tileContainer,
+ bg = this._bgBuffer;
+
+ // if foreground layer doesn't have many tiles but bg layer does,
+ // keep the existing bg layer and just zoom it some more
+
+ var bgLoaded = this._getLoadedTilesPercentage(bg),
+ frontLoaded = this._getLoadedTilesPercentage(front);
+
+ if (bg && bgLoaded > 0.5 && frontLoaded < 0.5) {
+
+ front.style.visibility = 'hidden';
+ this._stopLoadingImages(front);
+ return;
+ }
+
+ // prepare the buffer to become the front tile pane
+ bg.style.visibility = 'hidden';
+ bg.style[L.DomUtil.TRANSFORM] = '';
+
+ // switch out the current layer to be the new bg layer (and vice-versa)
+ this._tileContainer = bg;
+ bg = this._bgBuffer = front;
+
+ this._stopLoadingImages(bg);
+
+ //prevent bg buffer from clearing right after zoom
+ clearTimeout(this._clearBgBufferTimer);
+ },
+
+ _getLoadedTilesPercentage: function (container) {
+ var tiles = container.getElementsByTagName('img'),
+ i, len, count = 0;
+
+ for (i = 0, len = tiles.length; i < len; i++) {
+ if (tiles[i].complete) {
+ count++;
+ }
+ }
+ return count / len;
+ },
+
+ // stops loading all tiles in the background layer
+ _stopLoadingImages: function (container) {
+ var tiles = Array.prototype.slice.call(container.getElementsByTagName('img')),
+ i, len, tile;
+
+ for (i = 0, len = tiles.length; i < len; i++) {
+ tile = tiles[i];
+
+ if (!tile.complete) {
+ tile.onload = L.Util.falseFn;
+ tile.onerror = L.Util.falseFn;
+ tile.src = L.Util.emptyImageUrl;
+
+ tile.parentNode.removeChild(tile);
+ }
+ }
+ }
+});
+
+
+/*
+ * Provides L.Map with convenient shortcuts for using browser geolocation features.
+ */
+
+L.Map.include({
+ _defaultLocateOptions: {
+ watch: false,
+ setView: false,
+ maxZoom: Infinity,
+ timeout: 10000,
+ maximumAge: 0,
+ enableHighAccuracy: false
+ },
+
+ locate: function (/*Object*/ options) {
+
+ options = this._locateOptions = L.extend(this._defaultLocateOptions, options);
+
+ if (!navigator.geolocation) {
+ this._handleGeolocationError({
+ code: 0,
+ message: 'Geolocation not supported.'
+ });
+ return this;
+ }
+
+ var onResponse = L.bind(this._handleGeolocationResponse, this),
+ onError = L.bind(this._handleGeolocationError, this);
+
+ if (options.watch) {
+ this._locationWatchId =
+ navigator.geolocation.watchPosition(onResponse, onError, options);
+ } else {
+ navigator.geolocation.getCurrentPosition(onResponse, onError, options);
+ }
+ return this;
+ },
+
+ stopLocate: function () {
+ if (navigator.geolocation) {
+ navigator.geolocation.clearWatch(this._locationWatchId);
+ }
+ if (this._locateOptions) {
+ this._locateOptions.setView = false;
+ }
+ return this;
+ },
+
+ _handleGeolocationError: function (error) {
+ var c = error.code,
+ message = error.message ||
+ (c === 1 ? 'permission denied' :
+ (c === 2 ? 'position unavailable' : 'timeout'));
+
+ if (this._locateOptions.setView && !this._loaded) {
+ this.fitWorld();
+ }
+
+ this.fire('locationerror', {
+ code: c,
+ message: 'Geolocation error: ' + message + '.'
+ });
+ },
+
+ _handleGeolocationResponse: function (pos) {
+ var lat = pos.coords.latitude,
+ lng = pos.coords.longitude,
+ latlng = new L.LatLng(lat, lng),
+
+ latAccuracy = 180 * pos.coords.accuracy / 40075017,
+ lngAccuracy = latAccuracy / Math.cos(L.LatLng.DEG_TO_RAD * lat),
+
+ bounds = L.latLngBounds(
+ [lat - latAccuracy, lng - lngAccuracy],
+ [lat + latAccuracy, lng + lngAccuracy]),
+
+ options = this._locateOptions;
+
+ if (options.setView) {
+ var zoom = Math.min(this.getBoundsZoom(bounds), options.maxZoom);
+ this.setView(latlng, zoom);
+ }
+
+ var data = {
+ latlng: latlng,
+ bounds: bounds,
+ timestamp: pos.timestamp
+ };
+
+ for (var i in pos.coords) {
+ if (typeof pos.coords[i] === 'number') {
+ data[i] = pos.coords[i];
+ }
+ }
+
+ this.fire('locationfound', data);
+ }
+});
+
+
+}(window, document));
\ No newline at end of file
diff --git a/webapp/org.eclipse.sensinact.studio.webapp.outdoor/webapp/js/leaflet.js b/webapp/org.eclipse.sensinact.studio.webapp.outdoor/webapp/js/leaflet.js
new file mode 100644
index 0000000..ee5ff5a
--- /dev/null
+++ b/webapp/org.eclipse.sensinact.studio.webapp.outdoor/webapp/js/leaflet.js
@@ -0,0 +1,9 @@
+/*
+ Leaflet, a JavaScript library for mobile-friendly interactive maps. http://leafletjs.com
+ (c) 2010-2013, Vladimir Agafonkin
+ (c) 2010-2011, CloudMade
+*/
+!function(t,e,i){var n=t.L,o={};o.version="0.7.7","object"==typeof module&&"object"==typeof module.exports?module.exports=o:"function"==typeof define&&define.amd&&define(o),o.noConflict=function(){return t.L=n,this},t.L=o,o.Util={extend:function(t){var e,i,n,o,s=Array.prototype.slice.call(arguments,1);for(i=0,n=s.length;n>i;i++){o=s[i]||{};for(e in o)o.hasOwnProperty(e)&&(t[e]=o[e])}return t},bind:function(t,e){var i=arguments.length>2?Array.prototype.slice.call(arguments,2):null;return function(){return t.apply(e,i||arguments)}},stamp:function(){var t=0,e="_leaflet_id";return function(i){return i[e]=i[e]||++t,i[e]}}(),invokeEach:function(t,e,i){var n,o;if("object"==typeof t){o=Array.prototype.slice.call(arguments,3);for(n in t)e.apply(i,[n,t[n]].concat(o));return!0}return!1},limitExecByInterval:function(t,e,i){var n,o;return function s(){var a=arguments;return n?void(o=!0):(n=!0,setTimeout(function(){n=!1,o&&(s.apply(i,a),o=!1)},e),void t.apply(i,a))}},falseFn:function(){return!1},formatNum:function(t,e){var i=Math.pow(10,e||5);return Math.round(t*i)/i},trim:function(t){return t.trim?t.trim():t.replace(/^\s+|\s+$/g,"")},splitWords:function(t){return o.Util.trim(t).split(/\s+/)},setOptions:function(t,e){return t.options=o.extend({},t.options,e),t.options},getParamString:function(t,e,i){var n=[];for(var o in t)n.push(encodeURIComponent(i?o.toUpperCase():o)+"="+encodeURIComponent(t[o]));return(e&&-1!==e.indexOf("?")?"&":"?")+n.join("&")},template:function(t,e){return t.replace(/\{ *([\w_]+) *\}/g,function(t,n){var o=e[n];if(o===i)throw new Error("No value provided for variable "+t);return"function"==typeof o&&(o=o(e)),o})},isArray:Array.isArray||function(t){return"[object Array]"===Object.prototype.toString.call(t)},emptyImageUrl:"data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs="},function(){function e(e){var i,n,o=["webkit","moz","o","ms"];for(i=0;i<o.length&&!n;i++)n=t[o[i]+e];return n}function i(e){var i=+new Date,o=Math.max(0,16-(i-n));return n=i+o,t.setTimeout(e,o)}var n=0,s=t.requestAnimationFrame||e("RequestAnimationFrame")||i,a=t.cancelAnimationFrame||e("CancelAnimationFrame")||e("CancelRequestAnimationFrame")||function(e){t.clearTimeout(e)};o.Util.requestAnimFrame=function(e,n,a,r){return e=o.bind(e,n),a&&s===i?void e():s.call(t,e,r)},o.Util.cancelAnimFrame=function(e){e&&a.call(t,e)}}(),o.extend=o.Util.extend,o.bind=o.Util.bind,o.stamp=o.Util.stamp,o.setOptions=o.Util.setOptions,o.Class=function(){},o.Class.extend=function(t){var e=function(){this.initialize&&this.initialize.apply(this,arguments),this._initHooks&&this.callInitHooks()},i=function(){};i.prototype=this.prototype;var n=new i;n.constructor=e,e.prototype=n;for(var s in this)this.hasOwnProperty(s)&&"prototype"!==s&&(e[s]=this[s]);t.statics&&(o.extend(e,t.statics),delete t.statics),t.includes&&(o.Util.extend.apply(null,[n].concat(t.includes)),delete t.includes),t.options&&n.options&&(t.options=o.extend({},n.options,t.options)),o.extend(n,t),n._initHooks=[];var a=this;return e.__super__=a.prototype,n.callInitHooks=function(){if(!this._initHooksCalled){a.prototype.callInitHooks&&a.prototype.callInitHooks.call(this),this._initHooksCalled=!0;for(var t=0,e=n._initHooks.length;e>t;t++)n._initHooks[t].call(this)}},e},o.Class.include=function(t){o.extend(this.prototype,t)},o.Class.mergeOptions=function(t){o.extend(this.prototype.options,t)},o.Class.addInitHook=function(t){var e=Array.prototype.slice.call(arguments,1),i="function"==typeof t?t:function(){this[t].apply(this,e)};this.prototype._initHooks=this.prototype._initHooks||[],this.prototype._initHooks.push(i)};var s="_leaflet_events";o.Mixin={},o.Mixin.Events={addEventListener:function(t,e,i){if(o.Util.invokeEach(t,this.addEventListener,this,e,i))return this;var n,a,r,h,l,u,c,d=this[s]=this[s]||{},p=i&&i!==this&&o.stamp(i);for(t=o.Util.splitWords(t),n=0,a=t.length;a>n;n++)r={action:e,context:i||this},h=t[n],p?(l=h+"_idx",u=l+"_len",c=d[l]=d[l]||{},c[p]||(c[p]=[],d[u]=(d[u]||0)+1),c[p].push(r)):(d[h]=d[h]||[],d[h].push(r));return this},hasEventListeners:function(t){var e=this[s];return!!e&&(t in e&&e[t].length>0||t+"_idx"in e&&e[t+"_idx_len"]>0)},removeEventListener:function(t,e,i){if(!this[s])return this;if(!t)return this.clearAllEventListeners();if(o.Util.invokeEach(t,this.removeEventListener,this,e,i))return this;var n,a,r,h,l,u,c,d,p,_=this[s],m=i&&i!==this&&o.stamp(i);for(t=o.Util.splitWords(t),n=0,a=t.length;a>n;n++)if(r=t[n],u=r+"_idx",c=u+"_len",d=_[u],e){if(h=m&&d?d[m]:_[r]){for(l=h.length-1;l>=0;l--)h[l].action!==e||i&&h[l].context!==i||(p=h.splice(l,1),p[0].action=o.Util.falseFn);i&&d&&0===h.length&&(delete d[m],_[c]--)}}else delete _[r],delete _[u],delete _[c];return this},clearAllEventListeners:function(){return delete this[s],this},fireEvent:function(t,e){if(!this.hasEventListeners(t))return this;var i,n,a,r,h,l=o.Util.extend({},e,{type:t,target:this}),u=this[s];if(u[t])for(i=u[t].slice(),n=0,a=i.length;a>n;n++)i[n].action.call(i[n].context,l);r=u[t+"_idx"];for(h in r)if(i=r[h].slice())for(n=0,a=i.length;a>n;n++)i[n].action.call(i[n].context,l);return this},addOneTimeEventListener:function(t,e,i){if(o.Util.invokeEach(t,this.addOneTimeEventListener,this,e,i))return this;var n=o.bind(function(){this.removeEventListener(t,e,i).removeEventListener(t,n,i)},this);return this.addEventListener(t,e,i).addEventListener(t,n,i)}},o.Mixin.Events.on=o.Mixin.Events.addEventListener,o.Mixin.Events.off=o.Mixin.Events.removeEventListener,o.Mixin.Events.once=o.Mixin.Events.addOneTimeEventListener,o.Mixin.Events.fire=o.Mixin.Events.fireEvent,function(){var n="ActiveXObject"in t,s=n&&!e.addEventListener,a=navigator.userAgent.toLowerCase(),r=-1!==a.indexOf("webkit"),h=-1!==a.indexOf("chrome"),l=-1!==a.indexOf("phantom"),u=-1!==a.indexOf("android"),c=-1!==a.search("android [23]"),d=-1!==a.indexOf("gecko"),p=typeof orientation!=i+"",_=!t.PointerEvent&&t.MSPointerEvent,m=t.PointerEvent&&t.navigator.pointerEnabled||_,f="devicePixelRatio"in t&&t.devicePixelRatio>1||"matchMedia"in t&&t.matchMedia("(min-resolution:144dpi)")&&t.matchMedia("(min-resolution:144dpi)").matches,g=e.documentElement,v=n&&"transition"in g.style,y="WebKitCSSMatrix"in t&&"m11"in new t.WebKitCSSMatrix&&!c,P="MozPerspective"in g.style,L="OTransition"in g.style,x=!t.L_DISABLE_3D&&(v||y||P||L)&&!l,w=!t.L_NO_TOUCH&&!l&&(m||"ontouchstart"in t||t.DocumentTouch&&e instanceof t.DocumentTouch);o.Browser={ie:n,ielt9:s,webkit:r,gecko:d&&!r&&!t.opera&&!n,android:u,android23:c,chrome:h,ie3d:v,webkit3d:y,gecko3d:P,opera3d:L,any3d:x,mobile:p,mobileWebkit:p&&r,mobileWebkit3d:p&&y,mobileOpera:p&&t.opera,touch:w,msPointer:_,pointer:m,retina:f}}(),o.Point=function(t,e,i){this.x=i?Math.round(t):t,this.y=i?Math.round(e):e},o.Point.prototype={clone:function(){return new o.Point(this.x,this.y)},add:function(t){return this.clone()._add(o.point(t))},_add:function(t){return this.x+=t.x,this.y+=t.y,this},subtract:function(t){return this.clone()._subtract(o.point(t))},_subtract:function(t){return this.x-=t.x,this.y-=t.y,this},divideBy:function(t){return this.clone()._divideBy(t)},_divideBy:function(t){return this.x/=t,this.y/=t,this},multiplyBy:function(t){return this.clone()._multiplyBy(t)},_multiplyBy:function(t){return this.x*=t,this.y*=t,this},round:function(){return this.clone()._round()},_round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this},floor:function(){return this.clone()._floor()},_floor:function(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this},distanceTo:function(t){t=o.point(t);var e=t.x-this.x,i=t.y-this.y;return Math.sqrt(e*e+i*i)},equals:function(t){return t=o.point(t),t.x===this.x&&t.y===this.y},contains:function(t){return t=o.point(t),Math.abs(t.x)<=Math.abs(this.x)&&Math.abs(t.y)<=Math.abs(this.y)},toString:function(){return"Point("+o.Util.formatNum(this.x)+", "+o.Util.formatNum(this.y)+")"}},o.point=function(t,e,n){return t instanceof o.Point?t:o.Util.isArray(t)?new o.Point(t[0],t[1]):t===i||null===t?t:new o.Point(t,e,n)},o.Bounds=function(t,e){if(t)for(var i=e?[t,e]:t,n=0,o=i.length;o>n;n++)this.extend(i[n])},o.Bounds.prototype={extend:function(t){return t=o.point(t),this.min||this.max?(this.min.x=Math.min(t.x,this.min.x),this.max.x=Math.max(t.x,this.max.x),this.min.y=Math.min(t.y,this.min.y),this.max.y=Math.max(t.y,this.max.y)):(this.min=t.clone(),this.max=t.clone()),this},getCenter:function(t){return new o.Point((this.min.x+this.max.x)/2,(this.min.y+this.max.y)/2,t)},getBottomLeft:function(){return new o.Point(this.min.x,this.max.y)},getTopRight:function(){return new o.Point(this.max.x,this.min.y)},getSize:function(){return this.max.subtract(this.min)},contains:function(t){var e,i;return t="number"==typeof t[0]||t instanceof o.Point?o.point(t):o.bounds(t),t instanceof o.Bounds?(e=t.min,i=t.max):e=i=t,e.x>=this.min.x&&i.x<=this.max.x&&e.y>=this.min.y&&i.y<=this.max.y},intersects:function(t){t=o.bounds(t);var e=this.min,i=this.max,n=t.min,s=t.max,a=s.x>=e.x&&n.x<=i.x,r=s.y>=e.y&&n.y<=i.y;return a&&r},isValid:function(){return!(!this.min||!this.max)}},o.bounds=function(t,e){return!t||t instanceof o.Bounds?t:new o.Bounds(t,e)},o.Transformation=function(t,e,i,n){this._a=t,this._b=e,this._c=i,this._d=n},o.Transformation.prototype={transform:function(t,e){return this._transform(t.clone(),e)},_transform:function(t,e){return e=e||1,t.x=e*(this._a*t.x+this._b),t.y=e*(this._c*t.y+this._d),t},untransform:function(t,e){return e=e||1,new o.Point((t.x/e-this._b)/this._a,(t.y/e-this._d)/this._c)}},o.DomUtil={get:function(t){return"string"==typeof t?e.getElementById(t):t},getStyle:function(t,i){var n=t.style[i];if(!n&&t.currentStyle&&(n=t.currentStyle[i]),(!n||"auto"===n)&&e.defaultView){var o=e.defaultView.getComputedStyle(t,null);n=o?o[i]:null}return"auto"===n?null:n},getViewportOffset:function(t){var i,n=0,s=0,a=t,r=e.body,h=e.documentElement;do{if(n+=a.offsetTop||0,s+=a.offsetLeft||0,n+=parseInt(o.DomUtil.getStyle(a,"borderTopWidth"),10)||0,s+=parseInt(o.DomUtil.getStyle(a,"borderLeftWidth"),10)||0,i=o.DomUtil.getStyle(a,"position"),a.offsetParent===r&&"absolute"===i)break;if("fixed"===i){n+=r.scrollTop||h.scrollTop||0,s+=r.scrollLeft||h.scrollLeft||0;break}if("relative"===i&&!a.offsetLeft){var l=o.DomUtil.getStyle(a,"width"),u=o.DomUtil.getStyle(a,"max-width"),c=a.getBoundingClientRect();("none"!==l||"none"!==u)&&(s+=c.left+a.clientLeft),n+=c.top+(r.scrollTop||h.scrollTop||0);break}a=a.offsetParent}while(a);a=t;do{if(a===r)break;n-=a.scrollTop||0,s-=a.scrollLeft||0,a=a.parentNode}while(a);return new o.Point(s,n)},documentIsLtr:function(){return o.DomUtil._docIsLtrCached||(o.DomUtil._docIsLtrCached=!0,o.DomUtil._docIsLtr="ltr"===o.DomUtil.getStyle(e.body,"direction")),o.DomUtil._docIsLtr},create:function(t,i,n){var o=e.createElement(t);return o.className=i,n&&n.appendChild(o),o},hasClass:function(t,e){if(t.classList!==i)return t.classList.contains(e);var n=o.DomUtil._getClass(t);return n.length>0&&new RegExp("(^|\\s)"+e+"(\\s|$)").test(n)},addClass:function(t,e){if(t.classList!==i)for(var n=o.Util.splitWords(e),s=0,a=n.length;a>s;s++)t.classList.add(n[s]);else if(!o.DomUtil.hasClass(t,e)){var r=o.DomUtil._getClass(t);o.DomUtil._setClass(t,(r?r+" ":"")+e)}},removeClass:function(t,e){t.classList!==i?t.classList.remove(e):o.DomUtil._setClass(t,o.Util.trim((" "+o.DomUtil._getClass(t)+" ").replace(" "+e+" "," ")))},_setClass:function(t,e){t.className.baseVal===i?t.className=e:t.className.baseVal=e},_getClass:function(t){return t.className.baseVal===i?t.className:t.className.baseVal},setOpacity:function(t,e){if("opacity"in t.style)t.style.opacity=e;else if("filter"in t.style){var i=!1,n="DXImageTransform.Microsoft.Alpha";try{i=t.filters.item(n)}catch(o){if(1===e)return}e=Math.round(100*e),i?(i.Enabled=100!==e,i.Opacity=e):t.style.filter+=" progid:"+n+"(opacity="+e+")"}},testProp:function(t){for(var i=e.documentElement.style,n=0;n<t.length;n++)if(t[n]in i)return t[n];return!1},getTranslateString:function(t){var e=o.Browser.webkit3d,i="translate"+(e?"3d":"")+"(",n=(e?",0":"")+")";return i+t.x+"px,"+t.y+"px"+n},getScaleString:function(t,e){var i=o.DomUtil.getTranslateString(e.add(e.multiplyBy(-1*t))),n=" scale("+t+") ";return i+n},setPosition:function(t,e,i){t._leaflet_pos=e,!i&&o.Browser.any3d?t.style[o.DomUtil.TRANSFORM]=o.DomUtil.getTranslateString(e):(t.style.left=e.x+"px",t.style.top=e.y+"px")},getPosition:function(t){return t._leaflet_pos}},o.DomUtil.TRANSFORM=o.DomUtil.testProp(["transform","WebkitTransform","OTransform","MozTransform","msTransform"]),o.DomUtil.TRANSITION=o.DomUtil.testProp(["webkitTransition","transition","OTransition","MozTransition","msTransition"]),o.DomUtil.TRANSITION_END="webkitTransition"===o.DomUtil.TRANSITION||"OTransition"===o.DomUtil.TRANSITION?o.DomUtil.TRANSITION+"End":"transitionend",function(){if("onselectstart"in e)o.extend(o.DomUtil,{disableTextSelection:function(){o.DomEvent.on(t,"selectstart",o.DomEvent.preventDefault)},enableTextSelection:function(){o.DomEvent.off(t,"selectstart",o.DomEvent.preventDefault)}});else{var i=o.DomUtil.testProp(["userSelect","WebkitUserSelect","OUserSelect","MozUserSelect","msUserSelect"]);o.extend(o.DomUtil,{disableTextSelection:function(){if(i){var t=e.documentElement.style;this._userSelect=t[i],t[i]="none"}},enableTextSelection:function(){i&&(e.documentElement.style[i]=this._userSelect,delete this._userSelect)}})}o.extend(o.DomUtil,{disableImageDrag:function(){o.DomEvent.on(t,"dragstart",o.DomEvent.preventDefault)},enableImageDrag:function(){o.DomEvent.off(t,"dragstart",o.DomEvent.preventDefault)}})}(),o.LatLng=function(t,e,n){if(t=parseFloat(t),e=parseFloat(e),isNaN(t)||isNaN(e))throw new Error("Invalid LatLng object: ("+t+", "+e+")");this.lat=t,this.lng=e,n!==i&&(this.alt=parseFloat(n))},o.extend(o.LatLng,{DEG_TO_RAD:Math.PI/180,RAD_TO_DEG:180/Math.PI,MAX_MARGIN:1e-9}),o.LatLng.prototype={equals:function(t){if(!t)return!1;t=o.latLng(t);var e=Math.max(Math.abs(this.lat-t.lat),Math.abs(this.lng-t.lng));return e<=o.LatLng.MAX_MARGIN},toString:function(t){return"LatLng("+o.Util.formatNum(this.lat,t)+", "+o.Util.formatNum(this.lng,t)+")"},distanceTo:function(t){t=o.latLng(t);var e=6378137,i=o.LatLng.DEG_TO_RAD,n=(t.lat-this.lat)*i,s=(t.lng-this.lng)*i,a=this.lat*i,r=t.lat*i,h=Math.sin(n/2),l=Math.sin(s/2),u=h*h+l*l*Math.cos(a)*Math.cos(r);return 2*e*Math.atan2(Math.sqrt(u),Math.sqrt(1-u))},wrap:function(t,e){var i=this.lng;return t=t||-180,e=e||180,i=(i+e)%(e-t)+(t>i||i===e?e:t),new o.LatLng(this.lat,i)}},o.latLng=function(t,e){return t instanceof o.LatLng?t:o.Util.isArray(t)?"number"==typeof t[0]||"string"==typeof t[0]?new o.LatLng(t[0],t[1],t[2]):null:t===i||null===t?t:"object"==typeof t&&"lat"in t?new o.LatLng(t.lat,"lng"in t?t.lng:t.lon):e===i?null:new o.LatLng(t,e)},o.LatLngBounds=function(t,e){if(t)for(var i=e?[t,e]:t,n=0,o=i.length;o>n;n++)this.extend(i[n])},o.LatLngBounds.prototype={extend:function(t){if(!t)return this;var e=o.latLng(t);return t=null!==e?e:o.latLngBounds(t),t instanceof o.LatLng?this._southWest||this._northEast?(this._southWest.lat=Math.min(t.lat,this._southWest.lat),this._southWest.lng=Math.min(t.lng,this._southWest.lng),this._northEast.lat=Math.max(t.lat,this._northEast.lat),this._northEast.lng=Math.max(t.lng,this._northEast.lng)):(this._southWest=new o.LatLng(t.lat,t.lng),this._northEast=new o.LatLng(t.lat,t.lng)):t instanceof o.LatLngBounds&&(this.extend(t._southWest),this.extend(t._northEast)),this},pad:function(t){var e=this._southWest,i=this._northEast,n=Math.abs(e.lat-i.lat)*t,s=Math.abs(e.lng-i.lng)*t;return new o.LatLngBounds(new o.LatLng(e.lat-n,e.lng-s),new o.LatLng(i.lat+n,i.lng+s))},getCenter:function(){return new o.LatLng((this._southWest.lat+this._northEast.lat)/2,(this._southWest.lng+this._northEast.lng)/2)},getSouthWest:function(){return this._southWest},getNorthEast:function(){return this._northEast},getNorthWest:function(){return new o.LatLng(this.getNorth(),this.getWest())},getSouthEast:function(){return new o.LatLng(this.getSouth(),this.getEast())},getWest:function(){return this._southWest.lng},getSouth:function(){return this._southWest.lat},getEast:function(){return this._northEast.lng},getNorth:function(){return this._northEast.lat},contains:function(t){t="number"==typeof t[0]||t instanceof o.LatLng?o.latLng(t):o.latLngBounds(t);var e,i,n=this._southWest,s=this._northEast;return t instanceof o.LatLngBounds?(e=t.getSouthWest(),i=t.getNorthEast()):e=i=t,e.lat>=n.lat&&i.lat<=s.lat&&e.lng>=n.lng&&i.lng<=s.lng},intersects:function(t){t=o.latLngBounds(t);var e=this._southWest,i=this._northEast,n=t.getSouthWest(),s=t.getNorthEast(),a=s.lat>=e.lat&&n.lat<=i.lat,r=s.lng>=e.lng&&n.lng<=i.lng;return a&&r},toBBoxString:function(){return[this.getWest(),this.getSouth(),this.getEast(),this.getNorth()].join(",")},equals:function(t){return t?(t=o.latLngBounds(t),this._southWest.equals(t.getSouthWest())&&this._northEast.equals(t.getNorthEast())):!1},isValid:function(){return!(!this._southWest||!this._northEast)}},o.latLngBounds=function(t,e){return!t||t instanceof o.LatLngBounds?t:new o.LatLngBounds(t,e)},o.Projection={},o.Projection.SphericalMercator={MAX_LATITUDE:85.0511287798,project:function(t){var e=o.LatLng.DEG_TO_RAD,i=this.MAX_LATITUDE,n=Math.max(Math.min(i,t.lat),-i),s=t.lng*e,a=n*e;return a=Math.log(Math.tan(Math.PI/4+a/2)),new o.Point(s,a)},unproject:function(t){var e=o.LatLng.RAD_TO_DEG,i=t.x*e,n=(2*Math.atan(Math.exp(t.y))-Math.PI/2)*e;return new o.LatLng(n,i)}},o.Projection.LonLat={project:function(t){return new o.Point(t.lng,t.lat)},unproject:function(t){return new o.LatLng(t.y,t.x)}},o.CRS={latLngToPoint:function(t,e){var i=this.projection.project(t),n=this.scale(e);return this.transformation._transform(i,n)},pointToLatLng:function(t,e){var i=this.scale(e),n=this.transformation.untransform(t,i);return this.projection.unproject(n)},project:function(t){return this.projection.project(t)},scale:function(t){return 256*Math.pow(2,t)},getSize:function(t){var e=this.scale(t);return o.point(e,e)}},o.CRS.Simple=o.extend({},o.CRS,{projection:o.Projection.LonLat,transformation:new o.Transformation(1,0,-1,0),scale:function(t){return Math.pow(2,t)}}),o.CRS.EPSG3857=o.extend({},o.CRS,{code:"EPSG:3857",projection:o.Projection.SphericalMercator,transformation:new o.Transformation(.5/Math.PI,.5,-.5/Math.PI,.5),project:function(t){var e=this.projection.project(t),i=6378137;return e.multiplyBy(i)}}),o.CRS.EPSG900913=o.extend({},o.CRS.EPSG3857,{code:"EPSG:900913"}),o.CRS.EPSG4326=o.extend({},o.CRS,{code:"EPSG:4326",projection:o.Projection.LonLat,transformation:new o.Transformation(1/360,.5,-1/360,.5)}),o.Map=o.Class.extend({includes:o.Mixin.Events,options:{crs:o.CRS.EPSG3857,fadeAnimation:o.DomUtil.TRANSITION&&!o.Browser.android23,trackResize:!0,markerZoomAnimation:o.DomUtil.TRANSITION&&o.Browser.any3d},initialize:function(t,e){e=o.setOptions(this,e),this._initContainer(t),this._initLayout(),this._onResize=o.bind(this._onResize,this),this._initEvents(),e.maxBounds&&this.setMaxBounds(e.maxBounds),e.center&&e.zoom!==i&&this.setView(o.latLng(e.center),e.zoom,{reset:!0}),this._handlers=[],this._layers={},this._zoomBoundLayers={},this._tileLayersNum=0,this.callInitHooks(),this._addLayers(e.layers)},setView:function(t,e){return e=e===i?this.getZoom():e,this._resetView(o.latLng(t),this._limitZoom(e)),this},setZoom:function(t,e){return this._loaded?this.setView(this.getCenter(),t,{zoom:e}):(this._zoom=this._limitZoom(t),this)},zoomIn:function(t,e){return this.setZoom(this._zoom+(t||1),e)},zoomOut:function(t,e){return this.setZoom(this._zoom-(t||1),e)},setZoomAround:function(t,e,i){var n=this.getZoomScale(e),s=this.getSize().divideBy(2),a=t instanceof o.Point?t:this.latLngToContainerPoint(t),r=a.subtract(s).multiplyBy(1-1/n),h=this.containerPointToLatLng(s.add(r));return this.setView(h,e,{zoom:i})},fitBounds:function(t,e){e=e||{},t=t.getBounds?t.getBounds():o.latLngBounds(t);var i=o.point(e.paddingTopLeft||e.padding||[0,0]),n=o.point(e.paddingBottomRight||e.padding||[0,0]),s=this.getBoundsZoom(t,!1,i.add(n));s=e.maxZoom?Math.min(e.maxZoom,s):s;var a=n.subtract(i).divideBy(2),r=this.project(t.getSouthWest(),s),h=this.project(t.getNorthEast(),s),l=this.unproject(r.add(h).divideBy(2).add(a),s);return this.setView(l,s,e)},fitWorld:function(t){return this.fitBounds([[-90,-180],[90,180]],t)},panTo:function(t,e){return this.setView(t,this._zoom,{pan:e})},panBy:function(t){return this.fire("movestart"),this._rawPanBy(o.point(t)),this.fire("move"),this.fire("moveend")},setMaxBounds:function(t){return t=o.latLngBounds(t),this.options.maxBounds=t,t?(this._loaded&&this._panInsideMaxBounds(),this.on("moveend",this._panInsideMaxBounds,this)):this.off("moveend",this._panInsideMaxBounds,this)},panInsideBounds:function(t,e){var i=this.getCenter(),n=this._limitCenter(i,this._zoom,t);return i.equals(n)?this:this.panTo(n,e)},addLayer:function(t){var e=o.stamp(t);return this._layers[e]?this:(this._layers[e]=t,!t.options||isNaN(t.options.maxZoom)&&isNaN(t.options.minZoom)||(this._zoomBoundLayers[e]=t,this._updateZoomLevels()),this.options.zoomAnimation&&o.TileLayer&&t instanceof o.TileLayer&&(this._tileLayersNum++,this._tileLayersToLoad++,t.on("load",this._onTileLayerLoad,this)),this._loaded&&this._layerAdd(t),this)},removeLayer:function(t){var e=o.stamp(t);return this._layers[e]?(this._loaded&&t.onRemove(this),delete this._layers[e],this._loaded&&this.fire("layerremove",{layer:t}),this._zoomBoundLayers[e]&&(delete this._zoomBoundLayers[e],this._updateZoomLevels()),this.options.zoomAnimation&&o.TileLayer&&t instanceof o.TileLayer&&(this._tileLayersNum--,this._tileLayersToLoad--,t.off("load",this._onTileLayerLoad,this)),this):this},hasLayer:function(t){return t?o.stamp(t)in this._layers:!1},eachLayer:function(t,e){for(var i in this._layers)t.call(e,this._layers[i]);return this},invalidateSize:function(t){if(!this._loaded)return this;t=o.extend({animate:!1,pan:!0},t===!0?{animate:!0}:t);var e=this.getSize();this._sizeChanged=!0,this._initialCenter=null;var i=this.getSize(),n=e.divideBy(2).round(),s=i.divideBy(2).round(),a=n.subtract(s);return a.x||a.y?(t.animate&&t.pan?this.panBy(a):(t.pan&&this._rawPanBy(a),this.fire("move"),t.debounceMoveend?(clearTimeout(this._sizeTimer),this._sizeTimer=setTimeout(o.bind(this.fire,this,"moveend"),200)):this.fire("moveend")),this.fire("resize",{oldSize:e,newSize:i})):this},addHandler:function(t,e){if(!e)return this;var i=this[t]=new e(this);return this._handlers.push(i),this.options[t]&&i.enable(),this},remove:function(){this._loaded&&this.fire("unload"),this._initEvents("off");try{delete this._container._leaflet}catch(t){this._container._leaflet=i}return this._clearPanes(),this._clearControlPos&&this._clearControlPos(),this._clearHandlers(),this},getCenter:function(){return this._checkIfLoaded(),this._initialCenter&&!this._moved()?this._initialCenter:this.layerPointToLatLng(this._getCenterLayerPoint())},getZoom:function(){return this._zoom},getBounds:function(){var t=this.getPixelBounds(),e=this.unproject(t.getBottomLeft()),i=this.unproject(t.getTopRight());return new o.LatLngBounds(e,i)},getMinZoom:function(){return this.options.minZoom===i?this._layersMinZoom===i?0:this._layersMinZoom:this.options.minZoom},getMaxZoom:function(){return this.options.maxZoom===i?this._layersMaxZoom===i?1/0:this._layersMaxZoom:this.options.maxZoom},getBoundsZoom:function(t,e,i){t=o.latLngBounds(t);var n,s=this.getMinZoom()-(e?1:0),a=this.getMaxZoom(),r=this.getSize(),h=t.getNorthWest(),l=t.getSouthEast(),u=!0;i=o.point(i||[0,0]);do s++,n=this.project(l,s).subtract(this.project(h,s)).add(i),u=e?n.x<r.x||n.y<r.y:r.contains(n);while(u&&a>=s);return u&&e?null:e?s:s-1},getSize:function(){return(!this._size||this._sizeChanged)&&(this._size=new o.Point(this._container.clientWidth,this._container.clientHeight),this._sizeChanged=!1),this._size.clone()},getPixelBounds:function(){var t=this._getTopLeftPoint();return new o.Bounds(t,t.add(this.getSize()))},getPixelOrigin:function(){return this._checkIfLoaded(),this._initialTopLeftPoint},getPanes:function(){return this._panes},getContainer:function(){return this._container},getZoomScale:function(t){var e=this.options.crs;return e.scale(t)/e.scale(this._zoom)},getScaleZoom:function(t){return this._zoom+Math.log(t)/Math.LN2},project:function(t,e){return e=e===i?this._zoom:e,this.options.crs.latLngToPoint(o.latLng(t),e)},unproject:function(t,e){return e=e===i?this._zoom:e,this.options.crs.pointToLatLng(o.point(t),e)},layerPointToLatLng:function(t){var e=o.point(t).add(this.getPixelOrigin());return this.unproject(e)},latLngToLayerPoint:function(t){var e=this.project(o.latLng(t))._round();return e._subtract(this.getPixelOrigin())},containerPointToLayerPoint:function(t){return o.point(t).subtract(this._getMapPanePos())},layerPointToContainerPoint:function(t){return o.point(t).add(this._getMapPanePos())},containerPointToLatLng:function(t){var e=this.containerPointToLayerPoint(o.point(t));return this.layerPointToLatLng(e)},latLngToContainerPoint:function(t){return this.layerPointToContainerPoint(this.latLngToLayerPoint(o.latLng(t)))},mouseEventToContainerPoint:function(t){return o.DomEvent.getMousePosition(t,this._container)},mouseEventToLayerPoint:function(t){return this.containerPointToLayerPoint(this.mouseEventToContainerPoint(t))},mouseEventToLatLng:function(t){return this.layerPointToLatLng(this.mouseEventToLayerPoint(t))},_initContainer:function(t){var e=this._container=o.DomUtil.get(t);if(!e)throw new Error("Map container not found.");if(e._leaflet)throw new Error("Map container is already initialized.");e._leaflet=!0},_initLayout:function(){var t=this._container;o.DomUtil.addClass(t,"leaflet-container"+(o.Browser.touch?" leaflet-touch":"")+(o.Browser.retina?" leaflet-retina":"")+(o.Browser.ielt9?" leaflet-oldie":"")+(this.options.fadeAnimation?" leaflet-fade-anim":""));var e=o.DomUtil.getStyle(t,"position");"absolute"!==e&&"relative"!==e&&"fixed"!==e&&(t.style.position="relative"),this._initPanes(),this._initControlPos&&this._initControlPos()},_initPanes:function(){var t=this._panes={};this._mapPane=t.mapPane=this._createPane("leaflet-map-pane",this._container),this._tilePane=t.tilePane=this._createPane("leaflet-tile-pane",this._mapPane),t.objectsPane=this._createPane("leaflet-objects-pane",this._mapPane),t.shadowPane=this._createPane("leaflet-shadow-pane"),t.overlayPane=this._createPane("leaflet-overlay-pane"),t.markerPane=this._createPane("leaflet-marker-pane"),t.popupPane=this._createPane("leaflet-popup-pane");var e=" leaflet-zoom-hide";this.options.markerZoomAnimation||(o.DomUtil.addClass(t.markerPane,e),o.DomUtil.addClass(t.shadowPane,e),o.DomUtil.addClass(t.popupPane,e))},_createPane:function(t,e){return o.DomUtil.create("div",t,e||this._panes.objectsPane)},_clearPanes:function(){this._container.removeChild(this._mapPane)},_addLayers:function(t){t=t?o.Util.isArray(t)?t:[t]:[];for(var e=0,i=t.length;i>e;e++)this.addLayer(t[e])},_resetView:function(t,e,i,n){var s=this._zoom!==e;n||(this.fire("movestart"),s&&this.fire("zoomstart")),this._zoom=e,this._initialCenter=t,this._initialTopLeftPoint=this._getNewTopLeftPoint(t),i?this._initialTopLeftPoint._add(this._getMapPanePos()):o.DomUtil.setPosition(this._mapPane,new o.Point(0,0)),this._tileLayersToLoad=this._tileLayersNum;var a=!this._loaded;this._loaded=!0,this.fire("viewreset",{hard:!i}),a&&(this.fire("load"),this.eachLayer(this._layerAdd,this)),this.fire("move"),(s||n)&&this.fire("zoomend"),this.fire("moveend",{hard:!i})},_rawPanBy:function(t){o.DomUtil.setPosition(this._mapPane,this._getMapPanePos().subtract(t))},_getZoomSpan:function(){return this.getMaxZoom()-this.getMinZoom()},_updateZoomLevels:function(){var t,e=1/0,n=-(1/0),o=this._getZoomSpan();for(t in this._zoomBoundLayers){var s=this._zoomBoundLayers[t];isNaN(s.options.minZoom)||(e=Math.min(e,s.options.minZoom)),isNaN(s.options.maxZoom)||(n=Math.max(n,s.options.maxZoom))}t===i?this._layersMaxZoom=this._layersMinZoom=i:(this._layersMaxZoom=n,this._layersMinZoom=e),o!==this._getZoomSpan()&&this.fire("zoomlevelschange")},_panInsideMaxBounds:function(){this.panInsideBounds(this.options.maxBounds)},_checkIfLoaded:function(){if(!this._loaded)throw new Error("Set map center and zoom first.")},_initEvents:function(e){if(o.DomEvent){e=e||"on",o.DomEvent[e](this._container,"click",this._onMouseClick,this);var i,n,s=["dblclick","mousedown","mouseup","mouseenter","mouseleave","mousemove","contextmenu"];for(i=0,n=s.length;n>i;i++)o.DomEvent[e](this._container,s[i],this._fireMouseEvent,this);this.options.trackResize&&o.DomEvent[e](t,"resize",this._onResize,this)}},_onResize:function(){o.Util.cancelAnimFrame(this._resizeRequest),this._resizeRequest=o.Util.requestAnimFrame(function(){this.invalidateSize({debounceMoveend:!0})},this,!1,this._container)},_onMouseClick:function(t){!this._loaded||!t._simulated&&(this.dragging&&this.dragging.moved()||this.boxZoom&&this.boxZoom.moved())||o.DomEvent._skipped(t)||(this.fire("preclick"),this._fireMouseEvent(t))},_fireMouseEvent:function(t){if(this._loaded&&!o.DomEvent._skipped(t)){var e=t.type;if(e="mouseenter"===e?"mouseover":"mouseleave"===e?"mouseout":e,this.hasEventListeners(e)){"contextmenu"===e&&o.DomEvent.preventDefault(t);var i=this.mouseEventToContainerPoint(t),n=this.containerPointToLayerPoint(i),s=this.layerPointToLatLng(n);this.fire(e,{latlng:s,layerPoint:n,containerPoint:i,originalEvent:t})}}},_onTileLayerLoad:function(){this._tileLayersToLoad--,this._tileLayersNum&&!this._tileLayersToLoad&&this.fire("tilelayersload")},_clearHandlers:function(){for(var t=0,e=this._handlers.length;e>t;t++)this._handlers[t].disable()},whenReady:function(t,e){return this._loaded?t.call(e||this,this):this.on("load",t,e),this},_layerAdd:function(t){t.onAdd(this),this.fire("layeradd",{layer:t})},_getMapPanePos:function(){return o.DomUtil.getPosition(this._mapPane)},_moved:function(){var t=this._getMapPanePos();return t&&!t.equals([0,0])},_getTopLeftPoint:function(){return this.getPixelOrigin().subtract(this._getMapPanePos())},_getNewTopLeftPoint:function(t,e){var i=this.getSize()._divideBy(2);return this.project(t,e)._subtract(i)._round()},_latLngToNewLayerPoint:function(t,e,i){var n=this._getNewTopLeftPoint(i,e).add(this._getMapPanePos());return this.project(t,e)._subtract(n)},_getCenterLayerPoint:function(){return this.containerPointToLayerPoint(this.getSize()._divideBy(2))},_getCenterOffset:function(t){return this.latLngToLayerPoint(t).subtract(this._getCenterLayerPoint())},_limitCenter:function(t,e,i){if(!i)return t;var n=this.project(t,e),s=this.getSize().divideBy(2),a=new o.Bounds(n.subtract(s),n.add(s)),r=this._getBoundsOffset(a,i,e);return this.unproject(n.add(r),e)},_limitOffset:function(t,e){if(!e)return t;var i=this.getPixelBounds(),n=new o.Bounds(i.min.add(t),i.max.add(t));return t.add(this._getBoundsOffset(n,e))},_getBoundsOffset:function(t,e,i){var n=this.project(e.getNorthWest(),i).subtract(t.min),s=this.project(e.getSouthEast(),i).subtract(t.max),a=this._rebound(n.x,-s.x),r=this._rebound(n.y,-s.y);return new o.Point(a,r)},_rebound:function(t,e){return t+e>0?Math.round(t-e)/2:Math.max(0,Math.ceil(t))-Math.max(0,Math.floor(e))},_limitZoom:function(t){var e=this.getMinZoom(),i=this.getMaxZoom();return Math.max(e,Math.min(i,t))}}),o.map=function(t,e){return new o.Map(t,e)},o.Projection.Mercator={MAX_LATITUDE:85.0840591556,R_MINOR:6356752.314245179,R_MAJOR:6378137,project:function(t){var e=o.LatLng.DEG_TO_RAD,i=this.MAX_LATITUDE,n=Math.max(Math.min(i,t.lat),-i),s=this.R_MAJOR,a=this.R_MINOR,r=t.lng*e*s,h=n*e,l=a/s,u=Math.sqrt(1-l*l),c=u*Math.sin(h);c=Math.pow((1-c)/(1+c),.5*u);var d=Math.tan(.5*(.5*Math.PI-h))/c;return h=-s*Math.log(d),new o.Point(r,h)},unproject:function(t){for(var e,i=o.LatLng.RAD_TO_DEG,n=this.R_MAJOR,s=this.R_MINOR,a=t.x*i/n,r=s/n,h=Math.sqrt(1-r*r),l=Math.exp(-t.y/n),u=Math.PI/2-2*Math.atan(l),c=15,d=1e-7,p=c,_=.1;Math.abs(_)>d&&--p>0;)e=h*Math.sin(u),_=Math.PI/2-2*Math.atan(l*Math.pow((1-e)/(1+e),.5*h))-u,u+=_;return new o.LatLng(u*i,a)}},o.CRS.EPSG3395=o.extend({},o.CRS,{code:"EPSG:3395",projection:o.Projection.Mercator,
+transformation:function(){var t=o.Projection.Mercator,e=t.R_MAJOR,i=.5/(Math.PI*e);return new o.Transformation(i,.5,-i,.5)}()}),o.TileLayer=o.Class.extend({includes:o.Mixin.Events,options:{minZoom:0,maxZoom:18,tileSize:256,subdomains:"abc",errorTileUrl:"",attribution:"",zoomOffset:0,opacity:1,unloadInvisibleTiles:o.Browser.mobile,updateWhenIdle:o.Browser.mobile},initialize:function(t,e){e=o.setOptions(this,e),e.detectRetina&&o.Browser.retina&&e.maxZoom>0&&(e.tileSize=Math.floor(e.tileSize/2),e.zoomOffset++,e.minZoom>0&&e.minZoom--,this.options.maxZoom--),e.bounds&&(e.bounds=o.latLngBounds(e.bounds)),this._url=t;var i=this.options.subdomains;"string"==typeof i&&(this.options.subdomains=i.split(""))},onAdd:function(t){this._map=t,this._animated=t._zoomAnimated,this._initContainer(),t.on({viewreset:this._reset,moveend:this._update},this),this._animated&&t.on({zoomanim:this._animateZoom,zoomend:this._endZoomAnim},this),this.options.updateWhenIdle||(this._limitedUpdate=o.Util.limitExecByInterval(this._update,150,this),t.on("move",this._limitedUpdate,this)),this._reset(),this._update()},addTo:function(t){return t.addLayer(this),this},onRemove:function(t){this._container.parentNode.removeChild(this._container),t.off({viewreset:this._reset,moveend:this._update},this),this._animated&&t.off({zoomanim:this._animateZoom,zoomend:this._endZoomAnim},this),this.options.updateWhenIdle||t.off("move",this._limitedUpdate,this),this._container=null,this._map=null},bringToFront:function(){var t=this._map._panes.tilePane;return this._container&&(t.appendChild(this._container),this._setAutoZIndex(t,Math.max)),this},bringToBack:function(){var t=this._map._panes.tilePane;return this._container&&(t.insertBefore(this._container,t.firstChild),this._setAutoZIndex(t,Math.min)),this},getAttribution:function(){return this.options.attribution},getContainer:function(){return this._container},setOpacity:function(t){return this.options.opacity=t,this._map&&this._updateOpacity(),this},setZIndex:function(t){return this.options.zIndex=t,this._updateZIndex(),this},setUrl:function(t,e){return this._url=t,e||this.redraw(),this},redraw:function(){return this._map&&(this._reset({hard:!0}),this._update()),this},_updateZIndex:function(){this._container&&this.options.zIndex!==i&&(this._container.style.zIndex=this.options.zIndex)},_setAutoZIndex:function(t,e){var i,n,o,s=t.children,a=-e(1/0,-(1/0));for(n=0,o=s.length;o>n;n++)s[n]!==this._container&&(i=parseInt(s[n].style.zIndex,10),isNaN(i)||(a=e(a,i)));this.options.zIndex=this._container.style.zIndex=(isFinite(a)?a:0)+e(1,-1)},_updateOpacity:function(){var t,e=this._tiles;if(o.Browser.ielt9)for(t in e)o.DomUtil.setOpacity(e[t],this.options.opacity);else o.DomUtil.setOpacity(this._container,this.options.opacity)},_initContainer:function(){var t=this._map._panes.tilePane;if(!this._container){if(this._container=o.DomUtil.create("div","leaflet-layer"),this._updateZIndex(),this._animated){var e="leaflet-tile-container";this._bgBuffer=o.DomUtil.create("div",e,this._container),this._tileContainer=o.DomUtil.create("div",e,this._container)}else this._tileContainer=this._container;t.appendChild(this._container),this.options.opacity<1&&this._updateOpacity()}},_reset:function(t){for(var e in this._tiles)this.fire("tileunload",{tile:this._tiles[e]});this._tiles={},this._tilesToLoad=0,this.options.reuseTiles&&(this._unusedTiles=[]),this._tileContainer.innerHTML="",this._animated&&t&&t.hard&&this._clearBgBuffer(),this._initContainer()},_getTileSize:function(){var t=this._map,e=t.getZoom()+this.options.zoomOffset,i=this.options.maxNativeZoom,n=this.options.tileSize;return i&&e>i&&(n=Math.round(t.getZoomScale(e)/t.getZoomScale(i)*n)),n},_update:function(){if(this._map){var t=this._map,e=t.getPixelBounds(),i=t.getZoom(),n=this._getTileSize();if(!(i>this.options.maxZoom||i<this.options.minZoom)){var s=o.bounds(e.min.divideBy(n)._floor(),e.max.divideBy(n)._floor());this._addTilesFromCenterOut(s),(this.options.unloadInvisibleTiles||this.options.reuseTiles)&&this._removeOtherTiles(s)}}},_addTilesFromCenterOut:function(t){var i,n,s,a=[],r=t.getCenter();for(i=t.min.y;i<=t.max.y;i++)for(n=t.min.x;n<=t.max.x;n++)s=new o.Point(n,i),this._tileShouldBeLoaded(s)&&a.push(s);var h=a.length;if(0!==h){a.sort(function(t,e){return t.distanceTo(r)-e.distanceTo(r)});var l=e.createDocumentFragment();for(this._tilesToLoad||this.fire("loading"),this._tilesToLoad+=h,n=0;h>n;n++)this._addTile(a[n],l);this._tileContainer.appendChild(l)}},_tileShouldBeLoaded:function(t){if(t.x+":"+t.y in this._tiles)return!1;var e=this.options;if(!e.continuousWorld){var i=this._getWrapTileNum();if(e.noWrap&&(t.x<0||t.x>=i.x)||t.y<0||t.y>=i.y)return!1}if(e.bounds){var n=this._getTileSize(),o=t.multiplyBy(n),s=o.add([n,n]),a=this._map.unproject(o),r=this._map.unproject(s);if(e.continuousWorld||e.noWrap||(a=a.wrap(),r=r.wrap()),!e.bounds.intersects([a,r]))return!1}return!0},_removeOtherTiles:function(t){var e,i,n,o;for(o in this._tiles)e=o.split(":"),i=parseInt(e[0],10),n=parseInt(e[1],10),(i<t.min.x||i>t.max.x||n<t.min.y||n>t.max.y)&&this._removeTile(o)},_removeTile:function(t){var e=this._tiles[t];this.fire("tileunload",{tile:e,url:e.src}),this.options.reuseTiles?(o.DomUtil.removeClass(e,"leaflet-tile-loaded"),this._unusedTiles.push(e)):e.parentNode===this._tileContainer&&this._tileContainer.removeChild(e),o.Browser.android||(e.onload=null,e.src=o.Util.emptyImageUrl),delete this._tiles[t]},_addTile:function(t,e){var i=this._getTilePos(t),n=this._getTile();o.DomUtil.setPosition(n,i,o.Browser.chrome),this._tiles[t.x+":"+t.y]=n,this._loadTile(n,t),n.parentNode!==this._tileContainer&&e.appendChild(n)},_getZoomForUrl:function(){var t=this.options,e=this._map.getZoom();return t.zoomReverse&&(e=t.maxZoom-e),e+=t.zoomOffset,t.maxNativeZoom?Math.min(e,t.maxNativeZoom):e},_getTilePos:function(t){var e=this._map.getPixelOrigin(),i=this._getTileSize();return t.multiplyBy(i).subtract(e)},getTileUrl:function(t){return o.Util.template(this._url,o.extend({s:this._getSubdomain(t),z:t.z,x:t.x,y:t.y},this.options))},_getWrapTileNum:function(){var t=this._map.options.crs,e=t.getSize(this._map.getZoom());return e.divideBy(this._getTileSize())._floor()},_adjustTilePoint:function(t){var e=this._getWrapTileNum();this.options.continuousWorld||this.options.noWrap||(t.x=(t.x%e.x+e.x)%e.x),this.options.tms&&(t.y=e.y-t.y-1),t.z=this._getZoomForUrl()},_getSubdomain:function(t){var e=Math.abs(t.x+t.y)%this.options.subdomains.length;return this.options.subdomains[e]},_getTile:function(){if(this.options.reuseTiles&&this._unusedTiles.length>0){var t=this._unusedTiles.pop();return this._resetTile(t),t}return this._createTile()},_resetTile:function(){},_createTile:function(){var t=o.DomUtil.create("img","leaflet-tile");return t.style.width=t.style.height=this._getTileSize()+"px",t.galleryimg="no",t.onselectstart=t.onmousemove=o.Util.falseFn,o.Browser.ielt9&&this.options.opacity!==i&&o.DomUtil.setOpacity(t,this.options.opacity),o.Browser.mobileWebkit3d&&(t.style.WebkitBackfaceVisibility="hidden"),t},_loadTile:function(t,e){t._layer=this,t.onload=this._tileOnLoad,t.onerror=this._tileOnError,this._adjustTilePoint(e),t.src=this.getTileUrl(e),this.fire("tileloadstart",{tile:t,url:t.src})},_tileLoaded:function(){this._tilesToLoad--,this._animated&&o.DomUtil.addClass(this._tileContainer,"leaflet-zoom-animated"),this._tilesToLoad||(this.fire("load"),this._animated&&(clearTimeout(this._clearBgBufferTimer),this._clearBgBufferTimer=setTimeout(o.bind(this._clearBgBuffer,this),500)))},_tileOnLoad:function(){var t=this._layer;this.src!==o.Util.emptyImageUrl&&(o.DomUtil.addClass(this,"leaflet-tile-loaded"),t.fire("tileload",{tile:this,url:this.src})),t._tileLoaded()},_tileOnError:function(){var t=this._layer;t.fire("tileerror",{tile:this,url:this.src});var e=t.options.errorTileUrl;e&&(this.src=e),t._tileLoaded()}}),o.tileLayer=function(t,e){return new o.TileLayer(t,e)},o.TileLayer.WMS=o.TileLayer.extend({defaultWmsParams:{service:"WMS",request:"GetMap",version:"1.1.1",layers:"",styles:"",format:"image/jpeg",transparent:!1},initialize:function(t,e){this._url=t;var i=o.extend({},this.defaultWmsParams),n=e.tileSize||this.options.tileSize;e.detectRetina&&o.Browser.retina?i.width=i.height=2*n:i.width=i.height=n;for(var s in e)this.options.hasOwnProperty(s)||"crs"===s||(i[s]=e[s]);this.wmsParams=i,o.setOptions(this,e)},onAdd:function(t){this._crs=this.options.crs||t.options.crs,this._wmsVersion=parseFloat(this.wmsParams.version);var e=this._wmsVersion>=1.3?"crs":"srs";this.wmsParams[e]=this._crs.code,o.TileLayer.prototype.onAdd.call(this,t)},getTileUrl:function(t){var e=this._map,i=this.options.tileSize,n=t.multiplyBy(i),s=n.add([i,i]),a=this._crs.project(e.unproject(n,t.z)),r=this._crs.project(e.unproject(s,t.z)),h=this._wmsVersion>=1.3&&this._crs===o.CRS.EPSG4326?[r.y,a.x,a.y,r.x].join(","):[a.x,r.y,r.x,a.y].join(","),l=o.Util.template(this._url,{s:this._getSubdomain(t)});return l+o.Util.getParamString(this.wmsParams,l,!0)+"&BBOX="+h},setParams:function(t,e){return o.extend(this.wmsParams,t),e||this.redraw(),this}}),o.tileLayer.wms=function(t,e){return new o.TileLayer.WMS(t,e)},o.TileLayer.Canvas=o.TileLayer.extend({options:{async:!1},initialize:function(t){o.setOptions(this,t)},redraw:function(){this._map&&(this._reset({hard:!0}),this._update());for(var t in this._tiles)this._redrawTile(this._tiles[t]);return this},_redrawTile:function(t){this.drawTile(t,t._tilePoint,this._map._zoom)},_createTile:function(){var t=o.DomUtil.create("canvas","leaflet-tile");return t.width=t.height=this.options.tileSize,t.onselectstart=t.onmousemove=o.Util.falseFn,t},_loadTile:function(t,e){t._layer=this,t._tilePoint=e,this._redrawTile(t),this.options.async||this.tileDrawn(t)},drawTile:function(){},tileDrawn:function(t){this._tileOnLoad.call(t)}}),o.tileLayer.canvas=function(t){return new o.TileLayer.Canvas(t)},o.ImageOverlay=o.Class.extend({includes:o.Mixin.Events,options:{opacity:1},initialize:function(t,e,i){this._url=t,this._bounds=o.latLngBounds(e),o.setOptions(this,i)},onAdd:function(t){this._map=t,this._image||this._initImage(),t._panes.overlayPane.appendChild(this._image),t.on("viewreset",this._reset,this),t.options.zoomAnimation&&o.Browser.any3d&&t.on("zoomanim",this._animateZoom,this),this._reset()},onRemove:function(t){t.getPanes().overlayPane.removeChild(this._image),t.off("viewreset",this._reset,this),t.options.zoomAnimation&&t.off("zoomanim",this._animateZoom,this)},addTo:function(t){return t.addLayer(this),this},setOpacity:function(t){return this.options.opacity=t,this._updateOpacity(),this},bringToFront:function(){return this._image&&this._map._panes.overlayPane.appendChild(this._image),this},bringToBack:function(){var t=this._map._panes.overlayPane;return this._image&&t.insertBefore(this._image,t.firstChild),this},setUrl:function(t){this._url=t,this._image.src=this._url},getAttribution:function(){return this.options.attribution},_initImage:function(){this._image=o.DomUtil.create("img","leaflet-image-layer"),this._map.options.zoomAnimation&&o.Browser.any3d?o.DomUtil.addClass(this._image,"leaflet-zoom-animated"):o.DomUtil.addClass(this._image,"leaflet-zoom-hide"),this._updateOpacity(),o.extend(this._image,{galleryimg:"no",onselectstart:o.Util.falseFn,onmousemove:o.Util.falseFn,onload:o.bind(this._onImageLoad,this),src:this._url})},_animateZoom:function(t){var e=this._map,i=this._image,n=e.getZoomScale(t.zoom),s=this._bounds.getNorthWest(),a=this._bounds.getSouthEast(),r=e._latLngToNewLayerPoint(s,t.zoom,t.center),h=e._latLngToNewLayerPoint(a,t.zoom,t.center)._subtract(r),l=r._add(h._multiplyBy(.5*(1-1/n)));i.style[o.DomUtil.TRANSFORM]=o.DomUtil.getTranslateString(l)+" scale("+n+") "},_reset:function(){var t=this._image,e=this._map.latLngToLayerPoint(this._bounds.getNorthWest()),i=this._map.latLngToLayerPoint(this._bounds.getSouthEast())._subtract(e);o.DomUtil.setPosition(t,e),t.style.width=i.x+"px",t.style.height=i.y+"px"},_onImageLoad:function(){this.fire("load")},_updateOpacity:function(){o.DomUtil.setOpacity(this._image,this.options.opacity)}}),o.imageOverlay=function(t,e,i){return new o.ImageOverlay(t,e,i)},o.Icon=o.Class.extend({options:{className:""},initialize:function(t){o.setOptions(this,t)},createIcon:function(t){return this._createIcon("icon",t)},createShadow:function(t){return this._createIcon("shadow",t)},_createIcon:function(t,e){var i=this._getIconUrl(t);if(!i){if("icon"===t)throw new Error("iconUrl not set in Icon options (see the docs).");return null}var n;return n=e&&"IMG"===e.tagName?this._createImg(i,e):this._createImg(i),this._setIconStyles(n,t),n},_setIconStyles:function(t,e){var i,n=this.options,s=o.point(n[e+"Size"]);i="shadow"===e?o.point(n.shadowAnchor||n.iconAnchor):o.point(n.iconAnchor),!i&&s&&(i=s.divideBy(2,!0)),t.className="leaflet-marker-"+e+" "+n.className,i&&(t.style.marginLeft=-i.x+"px",t.style.marginTop=-i.y+"px"),s&&(t.style.width=s.x+"px",t.style.height=s.y+"px")},_createImg:function(t,i){return i=i||e.createElement("img"),i.src=t,i},_getIconUrl:function(t){return o.Browser.retina&&this.options[t+"RetinaUrl"]?this.options[t+"RetinaUrl"]:this.options[t+"Url"]}}),o.icon=function(t){return new o.Icon(t)},o.Icon.Default=o.Icon.extend({options:{iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]},_getIconUrl:function(t){var e=t+"Url";if(this.options[e])return this.options[e];o.Browser.retina&&"icon"===t&&(t+="-2x");var i=o.Icon.Default.imagePath;if(!i)throw new Error("Couldn't autodetect L.Icon.Default.imagePath, set it manually.");return i+"/marker-"+t+".png"}}),o.Icon.Default.imagePath=function(){var t,i,n,o,s,a=e.getElementsByTagName("script"),r=/[\/^]leaflet[\-\._]?([\w\-\._]*)\.js\??/;for(t=0,i=a.length;i>t;t++)if(n=a[t].src,o=n.match(r))return s=n.split(r)[0],(s?s+"/":"")+"images"}(),o.Marker=o.Class.extend({includes:o.Mixin.Events,options:{icon:new o.Icon.Default,title:"",alt:"",clickable:!0,draggable:!1,keyboard:!0,zIndexOffset:0,opacity:1,riseOnHover:!1,riseOffset:250},initialize:function(t,e){o.setOptions(this,e),this._latlng=o.latLng(t)},onAdd:function(t){this._map=t,t.on("viewreset",this.update,this),this._initIcon(),this.update(),this.fire("add"),t.options.zoomAnimation&&t.options.markerZoomAnimation&&t.on("zoomanim",this._animateZoom,this)},addTo:function(t){return t.addLayer(this),this},onRemove:function(t){this.dragging&&this.dragging.disable(),this._removeIcon(),this._removeShadow(),this.fire("remove"),t.off({viewreset:this.update,zoomanim:this._animateZoom},this),this._map=null},getLatLng:function(){return this._latlng},setLatLng:function(t){return this._latlng=o.latLng(t),this.update(),this.fire("move",{latlng:this._latlng})},setZIndexOffset:function(t){return this.options.zIndexOffset=t,this.update(),this},setIcon:function(t){return this.options.icon=t,this._map&&(this._initIcon(),this.update()),this._popup&&this.bindPopup(this._popup),this},update:function(){return this._icon&&this._setPos(this._map.latLngToLayerPoint(this._latlng).round()),this},_initIcon:function(){var t=this.options,e=this._map,i=e.options.zoomAnimation&&e.options.markerZoomAnimation,n=i?"leaflet-zoom-animated":"leaflet-zoom-hide",s=t.icon.createIcon(this._icon),a=!1;s!==this._icon&&(this._icon&&this._removeIcon(),a=!0,t.title&&(s.title=t.title),t.alt&&(s.alt=t.alt)),o.DomUtil.addClass(s,n),t.keyboard&&(s.tabIndex="0"),this._icon=s,this._initInteraction(),t.riseOnHover&&o.DomEvent.on(s,"mouseover",this._bringToFront,this).on(s,"mouseout",this._resetZIndex,this);var r=t.icon.createShadow(this._shadow),h=!1;r!==this._shadow&&(this._removeShadow(),h=!0),r&&o.DomUtil.addClass(r,n),this._shadow=r,t.opacity<1&&this._updateOpacity();var l=this._map._panes;a&&l.markerPane.appendChild(this._icon),r&&h&&l.shadowPane.appendChild(this._shadow)},_removeIcon:function(){this.options.riseOnHover&&o.DomEvent.off(this._icon,"mouseover",this._bringToFront).off(this._icon,"mouseout",this._resetZIndex),this._map._panes.markerPane.removeChild(this._icon),this._icon=null},_removeShadow:function(){this._shadow&&this._map._panes.shadowPane.removeChild(this._shadow),this._shadow=null},_setPos:function(t){o.DomUtil.setPosition(this._icon,t),this._shadow&&o.DomUtil.setPosition(this._shadow,t),this._zIndex=t.y+this.options.zIndexOffset,this._resetZIndex()},_updateZIndex:function(t){this._icon.style.zIndex=this._zIndex+t},_animateZoom:function(t){var e=this._map._latLngToNewLayerPoint(this._latlng,t.zoom,t.center).round();this._setPos(e)},_initInteraction:function(){if(this.options.clickable){var t=this._icon,e=["dblclick","mousedown","mouseover","mouseout","contextmenu"];o.DomUtil.addClass(t,"leaflet-clickable"),o.DomEvent.on(t,"click",this._onMouseClick,this),o.DomEvent.on(t,"keypress",this._onKeyPress,this);for(var i=0;i<e.length;i++)o.DomEvent.on(t,e[i],this._fireMouseEvent,this);o.Handler.MarkerDrag&&(this.dragging=new o.Handler.MarkerDrag(this),this.options.draggable&&this.dragging.enable())}},_onMouseClick:function(t){var e=this.dragging&&this.dragging.moved();(this.hasEventListeners(t.type)||e)&&o.DomEvent.stopPropagation(t),e||(this.dragging&&this.dragging._enabled||!this._map.dragging||!this._map.dragging.moved())&&this.fire(t.type,{originalEvent:t,latlng:this._latlng})},_onKeyPress:function(t){13===t.keyCode&&this.fire("click",{originalEvent:t,latlng:this._latlng})},_fireMouseEvent:function(t){this.fire(t.type,{originalEvent:t,latlng:this._latlng}),"contextmenu"===t.type&&this.hasEventListeners(t.type)&&o.DomEvent.preventDefault(t),"mousedown"!==t.type?o.DomEvent.stopPropagation(t):o.DomEvent.preventDefault(t)},setOpacity:function(t){return this.options.opacity=t,this._map&&this._updateOpacity(),this},_updateOpacity:function(){o.DomUtil.setOpacity(this._icon,this.options.opacity),this._shadow&&o.DomUtil.setOpacity(this._shadow,this.options.opacity)},_bringToFront:function(){this._updateZIndex(this.options.riseOffset)},_resetZIndex:function(){this._updateZIndex(0)}}),o.marker=function(t,e){return new o.Marker(t,e)},o.DivIcon=o.Icon.extend({options:{iconSize:[12,12],className:"leaflet-div-icon",html:!1},createIcon:function(t){var i=t&&"DIV"===t.tagName?t:e.createElement("div"),n=this.options;return n.html!==!1?i.innerHTML=n.html:i.innerHTML="",n.bgPos&&(i.style.backgroundPosition=-n.bgPos.x+"px "+-n.bgPos.y+"px"),this._setIconStyles(i,"icon"),i},createShadow:function(){return null}}),o.divIcon=function(t){return new o.DivIcon(t)},o.Map.mergeOptions({closePopupOnClick:!0}),o.Popup=o.Class.extend({includes:o.Mixin.Events,options:{minWidth:50,maxWidth:300,autoPan:!0,closeButton:!0,offset:[0,7],autoPanPadding:[5,5],keepInView:!1,className:"",zoomAnimation:!0},initialize:function(t,e){o.setOptions(this,t),this._source=e,this._animated=o.Browser.any3d&&this.options.zoomAnimation,this._isOpen=!1},onAdd:function(t){this._map=t,this._container||this._initLayout();var e=t.options.fadeAnimation;e&&o.DomUtil.setOpacity(this._container,0),t._panes.popupPane.appendChild(this._container),t.on(this._getEvents(),this),this.update(),e&&o.DomUtil.setOpacity(this._container,1),this.fire("open"),t.fire("popupopen",{popup:this}),this._source&&this._source.fire("popupopen",{popup:this})},addTo:function(t){return t.addLayer(this),this},openOn:function(t){return t.openPopup(this),this},onRemove:function(t){t._panes.popupPane.removeChild(this._container),o.Util.falseFn(this._container.offsetWidth),t.off(this._getEvents(),this),t.options.fadeAnimation&&o.DomUtil.setOpacity(this._container,0),this._map=null,this.fire("close"),t.fire("popupclose",{popup:this}),this._source&&this._source.fire("popupclose",{popup:this})},getLatLng:function(){return this._latlng},setLatLng:function(t){return this._latlng=o.latLng(t),this._map&&(this._updatePosition(),this._adjustPan()),this},getContent:function(){return this._content},setContent:function(t){return this._content=t,this.update(),this},update:function(){this._map&&(this._container.style.visibility="hidden",this._updateContent(),this._updateLayout(),this._updatePosition(),this._container.style.visibility="",this._adjustPan())},_getEvents:function(){var t={viewreset:this._updatePosition};return this._animated&&(t.zoomanim=this._zoomAnimation),("closeOnClick"in this.options?this.options.closeOnClick:this._map.options.closePopupOnClick)&&(t.preclick=this._close),this.options.keepInView&&(t.moveend=this._adjustPan),t},_close:function(){this._map&&this._map.closePopup(this)},_initLayout:function(){var t,e="leaflet-popup",i=e+" "+this.options.className+" leaflet-zoom-"+(this._animated?"animated":"hide"),n=this._container=o.DomUtil.create("div",i);this.options.closeButton&&(t=this._closeButton=o.DomUtil.create("a",e+"-close-button",n),t.href="#close",t.innerHTML="×",o.DomEvent.disableClickPropagation(t),o.DomEvent.on(t,"click",this._onCloseButtonClick,this));var s=this._wrapper=o.DomUtil.create("div",e+"-content-wrapper",n);o.DomEvent.disableClickPropagation(s),this._contentNode=o.DomUtil.create("div",e+"-content",s),o.DomEvent.disableScrollPropagation(this._contentNode),o.DomEvent.on(s,"contextmenu",o.DomEvent.stopPropagation),this._tipContainer=o.DomUtil.create("div",e+"-tip-container",n),this._tip=o.DomUtil.create("div",e+"-tip",this._tipContainer)},_updateContent:function(){if(this._content){if("string"==typeof this._content)this._contentNode.innerHTML=this._content;else{for(;this._contentNode.hasChildNodes();)this._contentNode.removeChild(this._contentNode.firstChild);this._contentNode.appendChild(this._content)}this.fire("contentupdate")}},_updateLayout:function(){var t=this._contentNode,e=t.style;e.width="",e.whiteSpace="nowrap";var i=t.offsetWidth;i=Math.min(i,this.options.maxWidth),i=Math.max(i,this.options.minWidth),e.width=i+1+"px",e.whiteSpace="",e.height="";var n=t.offsetHeight,s=this.options.maxHeight,a="leaflet-popup-scrolled";s&&n>s?(e.height=s+"px",o.DomUtil.addClass(t,a)):o.DomUtil.removeClass(t,a),this._containerWidth=this._container.offsetWidth},_updatePosition:function(){if(this._map){var t=this._map.latLngToLayerPoint(this._latlng),e=this._animated,i=o.point(this.options.offset);e&&o.DomUtil.setPosition(this._container,t),this._containerBottom=-i.y-(e?0:t.y),this._containerLeft=-Math.round(this._containerWidth/2)+i.x+(e?0:t.x),this._container.style.bottom=this._containerBottom+"px",this._container.style.left=this._containerLeft+"px"}},_zoomAnimation:function(t){var e=this._map._latLngToNewLayerPoint(this._latlng,t.zoom,t.center);o.DomUtil.setPosition(this._container,e)},_adjustPan:function(){if(this.options.autoPan){var t=this._map,e=this._container.offsetHeight,i=this._containerWidth,n=new o.Point(this._containerLeft,-e-this._containerBottom);this._animated&&n._add(o.DomUtil.getPosition(this._container));var s=t.layerPointToContainerPoint(n),a=o.point(this.options.autoPanPadding),r=o.point(this.options.autoPanPaddingTopLeft||a),h=o.point(this.options.autoPanPaddingBottomRight||a),l=t.getSize(),u=0,c=0;s.x+i+h.x>l.x&&(u=s.x+i-l.x+h.x),s.x-u-r.x<0&&(u=s.x-r.x),s.y+e+h.y>l.y&&(c=s.y+e-l.y+h.y),s.y-c-r.y<0&&(c=s.y-r.y),(u||c)&&t.fire("autopanstart").panBy([u,c])}},_onCloseButtonClick:function(t){this._close(),o.DomEvent.stop(t)}}),o.popup=function(t,e){return new o.Popup(t,e)},o.Map.include({openPopup:function(t,e,i){if(this.closePopup(),!(t instanceof o.Popup)){var n=t;t=new o.Popup(i).setLatLng(e).setContent(n)}return t._isOpen=!0,this._popup=t,this.addLayer(t)},closePopup:function(t){return t&&t!==this._popup||(t=this._popup,this._popup=null),t&&(this.removeLayer(t),t._isOpen=!1),this}}),o.Marker.include({openPopup:function(){return this._popup&&this._map&&!this._map.hasLayer(this._popup)&&(this._popup.setLatLng(this._latlng),this._map.openPopup(this._popup)),this},closePopup:function(){return this._popup&&this._popup._close(),this},togglePopup:function(){return this._popup&&(this._popup._isOpen?this.closePopup():this.openPopup()),this},bindPopup:function(t,e){var i=o.point(this.options.icon.options.popupAnchor||[0,0]);return i=i.add(o.Popup.prototype.options.offset),e&&e.offset&&(i=i.add(e.offset)),e=o.extend({offset:i},e),this._popupHandlersAdded||(this.on("click",this.togglePopup,this).on("remove",this.closePopup,this).on("move",this._movePopup,this),this._popupHandlersAdded=!0),t instanceof o.Popup?(o.setOptions(t,e),this._popup=t,t._source=this):this._popup=new o.Popup(e,this).setContent(t),this},setPopupContent:function(t){return this._popup&&this._popup.setContent(t),this},unbindPopup:function(){return this._popup&&(this._popup=null,this.off("click",this.togglePopup,this).off("remove",this.closePopup,this).off("move",this._movePopup,this),this._popupHandlersAdded=!1),this},getPopup:function(){return this._popup},_movePopup:function(t){this._popup.setLatLng(t.latlng)}}),o.LayerGroup=o.Class.extend({initialize:function(t){this._layers={};var e,i;if(t)for(e=0,i=t.length;i>e;e++)this.addLayer(t[e])},addLayer:function(t){var e=this.getLayerId(t);return this._layers[e]=t,this._map&&this._map.addLayer(t),this},removeLayer:function(t){var e=t in this._layers?t:this.getLayerId(t);return this._map&&this._layers[e]&&this._map.removeLayer(this._layers[e]),delete this._layers[e],this},hasLayer:function(t){return t?t in this._layers||this.getLayerId(t)in this._layers:!1},clearLayers:function(){return this.eachLayer(this.removeLayer,this),this},invoke:function(t){var e,i,n=Array.prototype.slice.call(arguments,1);for(e in this._layers)i=this._layers[e],i[t]&&i[t].apply(i,n);return this},onAdd:function(t){this._map=t,this.eachLayer(t.addLayer,t)},onRemove:function(t){this.eachLayer(t.removeLayer,t),this._map=null},addTo:function(t){return t.addLayer(this),this},eachLayer:function(t,e){for(var i in this._layers)t.call(e,this._layers[i]);return this},getLayer:function(t){return this._layers[t]},getLayers:function(){var t=[];for(var e in this._layers)t.push(this._layers[e]);return t},setZIndex:function(t){return this.invoke("setZIndex",t)},getLayerId:function(t){return o.stamp(t)}}),o.layerGroup=function(t){return new o.LayerGroup(t)},o.FeatureGroup=o.LayerGroup.extend({includes:o.Mixin.Events,statics:{EVENTS:"click dblclick mouseover mouseout mousemove contextmenu popupopen popupclose"},addLayer:function(t){return this.hasLayer(t)?this:("on"in t&&t.on(o.FeatureGroup.EVENTS,this._propagateEvent,this),o.LayerGroup.prototype.addLayer.call(this,t),this._popupContent&&t.bindPopup&&t.bindPopup(this._popupContent,this._popupOptions),this.fire("layeradd",{layer:t}))},removeLayer:function(t){return this.hasLayer(t)?(t in this._layers&&(t=this._layers[t]),"off"in t&&t.off(o.FeatureGroup.EVENTS,this._propagateEvent,this),o.LayerGroup.prototype.removeLayer.call(this,t),this._popupContent&&this.invoke("unbindPopup"),this.fire("layerremove",{layer:t})):this},bindPopup:function(t,e){return this._popupContent=t,this._popupOptions=e,this.invoke("bindPopup",t,e)},openPopup:function(t){for(var e in this._layers){this._layers[e].openPopup(t);break}return this},setStyle:function(t){return this.invoke("setStyle",t)},bringToFront:function(){return this.invoke("bringToFront")},bringToBack:function(){return this.invoke("bringToBack")},getBounds:function(){var t=new o.LatLngBounds;return this.eachLayer(function(e){t.extend(e instanceof o.Marker?e.getLatLng():e.getBounds())}),t},_propagateEvent:function(t){t=o.extend({layer:t.target,target:this},t),this.fire(t.type,t)}}),o.featureGroup=function(t){return new o.FeatureGroup(t)},o.Path=o.Class.extend({includes:[o.Mixin.Events],statics:{CLIP_PADDING:function(){var e=o.Browser.mobile?1280:2e3,i=(e/Math.max(t.outerWidth,t.outerHeight)-1)/2;return Math.max(0,Math.min(.5,i))}()},options:{stroke:!0,color:"#0033ff",dashArray:null,lineCap:null,lineJoin:null,weight:5,opacity:.5,fill:!1,fillColor:null,fillOpacity:.2,clickable:!0},initialize:function(t){o.setOptions(this,t)},onAdd:function(t){this._map=t,this._container||(this._initElements(),this._initEvents()),this.projectLatlngs(),this._updatePath(),this._container&&this._map._pathRoot.appendChild(this._container),this.fire("add"),t.on({viewreset:this.projectLatlngs,moveend:this._updatePath},this)},addTo:function(t){return t.addLayer(this),this},onRemove:function(t){t._pathRoot.removeChild(this._container),this.fire("remove"),this._map=null,o.Browser.vml&&(this._container=null,this._stroke=null,this._fill=null),t.off({viewreset:this.projectLatlngs,moveend:this._updatePath},this)},projectLatlngs:function(){},setStyle:function(t){return o.setOptions(this,t),this._container&&this._updateStyle(),this},redraw:function(){return this._map&&(this.projectLatlngs(),this._updatePath()),this}}),o.Map.include({_updatePathViewport:function(){var t=o.Path.CLIP_PADDING,e=this.getSize(),i=o.DomUtil.getPosition(this._mapPane),n=i.multiplyBy(-1)._subtract(e.multiplyBy(t)._round()),s=n.add(e.multiplyBy(1+2*t)._round());this._pathViewport=new o.Bounds(n,s)}}),o.Path.SVG_NS="http://www.w3.org/2000/svg",o.Browser.svg=!(!e.createElementNS||!e.createElementNS(o.Path.SVG_NS,"svg").createSVGRect),o.Path=o.Path.extend({statics:{SVG:o.Browser.svg},bringToFront:function(){var t=this._map._pathRoot,e=this._container;return e&&t.lastChild!==e&&t.appendChild(e),this},bringToBack:function(){var t=this._map._pathRoot,e=this._container,i=t.firstChild;return e&&i!==e&&t.insertBefore(e,i),this},getPathString:function(){},_createElement:function(t){return e.createElementNS(o.Path.SVG_NS,t)},_initElements:function(){this._map._initPathRoot(),this._initPath(),this._initStyle()},_initPath:function(){this._container=this._createElement("g"),this._path=this._createElement("path"),this.options.className&&o.DomUtil.addClass(this._path,this.options.className),this._container.appendChild(this._path)},_initStyle:function(){this.options.stroke&&(this._path.setAttribute("stroke-linejoin","round"),this._path.setAttribute("stroke-linecap","round")),this.options.fill&&this._path.setAttribute("fill-rule","evenodd"),this.options.pointerEvents&&this._path.setAttribute("pointer-events",this.options.pointerEvents),this.options.clickable||this.options.pointerEvents||this._path.setAttribute("pointer-events","none"),this._updateStyle()},_updateStyle:function(){this.options.stroke?(this._path.setAttribute("stroke",this.options.color),this._path.setAttribute("stroke-opacity",this.options.opacity),this._path.setAttribute("stroke-width",this.options.weight),this.options.dashArray?this._path.setAttribute("stroke-dasharray",this.options.dashArray):this._path.removeAttribute("stroke-dasharray"),this.options.lineCap&&this._path.setAttribute("stroke-linecap",this.options.lineCap),this.options.lineJoin&&this._path.setAttribute("stroke-linejoin",this.options.lineJoin)):this._path.setAttribute("stroke","none"),this.options.fill?(this._path.setAttribute("fill",this.options.fillColor||this.options.color),this._path.setAttribute("fill-opacity",this.options.fillOpacity)):this._path.setAttribute("fill","none")},_updatePath:function(){var t=this.getPathString();t||(t="M0 0"),this._path.setAttribute("d",t)},_initEvents:function(){if(this.options.clickable){(o.Browser.svg||!o.Browser.vml)&&o.DomUtil.addClass(this._path,"leaflet-clickable"),o.DomEvent.on(this._container,"click",this._onMouseClick,this);for(var t=["dblclick","mousedown","mouseover","mouseout","mousemove","contextmenu"],e=0;e<t.length;e++)o.DomEvent.on(this._container,t[e],this._fireMouseEvent,this)}},_onMouseClick:function(t){this._map.dragging&&this._map.dragging.moved()||this._fireMouseEvent(t)},_fireMouseEvent:function(t){if(this._map&&this.hasEventListeners(t.type)){var e=this._map,i=e.mouseEventToContainerPoint(t),n=e.containerPointToLayerPoint(i),s=e.layerPointToLatLng(n);this.fire(t.type,{latlng:s,layerPoint:n,containerPoint:i,originalEvent:t}),"contextmenu"===t.type&&o.DomEvent.preventDefault(t),"mousemove"!==t.type&&o.DomEvent.stopPropagation(t)}}}),o.Map.include({_initPathRoot:function(){this._pathRoot||(this._pathRoot=o.Path.prototype._createElement("svg"),this._panes.overlayPane.appendChild(this._pathRoot),this.options.zoomAnimation&&o.Browser.any3d?(o.DomUtil.addClass(this._pathRoot,"leaflet-zoom-animated"),
+this.on({zoomanim:this._animatePathZoom,zoomend:this._endPathZoom})):o.DomUtil.addClass(this._pathRoot,"leaflet-zoom-hide"),this.on("moveend",this._updateSvgViewport),this._updateSvgViewport())},_animatePathZoom:function(t){var e=this.getZoomScale(t.zoom),i=this._getCenterOffset(t.center)._multiplyBy(-e)._add(this._pathViewport.min);this._pathRoot.style[o.DomUtil.TRANSFORM]=o.DomUtil.getTranslateString(i)+" scale("+e+") ",this._pathZooming=!0},_endPathZoom:function(){this._pathZooming=!1},_updateSvgViewport:function(){if(!this._pathZooming){this._updatePathViewport();var t=this._pathViewport,e=t.min,i=t.max,n=i.x-e.x,s=i.y-e.y,a=this._pathRoot,r=this._panes.overlayPane;o.Browser.mobileWebkit&&r.removeChild(a),o.DomUtil.setPosition(a,e),a.setAttribute("width",n),a.setAttribute("height",s),a.setAttribute("viewBox",[e.x,e.y,n,s].join(" ")),o.Browser.mobileWebkit&&r.appendChild(a)}}}),o.Path.include({bindPopup:function(t,e){return t instanceof o.Popup?this._popup=t:((!this._popup||e)&&(this._popup=new o.Popup(e,this)),this._popup.setContent(t)),this._popupHandlersAdded||(this.on("click",this._openPopup,this).on("remove",this.closePopup,this),this._popupHandlersAdded=!0),this},unbindPopup:function(){return this._popup&&(this._popup=null,this.off("click",this._openPopup).off("remove",this.closePopup),this._popupHandlersAdded=!1),this},openPopup:function(t){return this._popup&&(t=t||this._latlng||this._latlngs[Math.floor(this._latlngs.length/2)],this._openPopup({latlng:t})),this},closePopup:function(){return this._popup&&this._popup._close(),this},_openPopup:function(t){this._popup.setLatLng(t.latlng),this._map.openPopup(this._popup)}}),o.Browser.vml=!o.Browser.svg&&function(){try{var t=e.createElement("div");t.innerHTML='<v:shape adj="1"/>';var i=t.firstChild;return i.style.behavior="url(#default#VML)",i&&"object"==typeof i.adj}catch(n){return!1}}(),o.Path=o.Browser.svg||!o.Browser.vml?o.Path:o.Path.extend({statics:{VML:!0,CLIP_PADDING:.02},_createElement:function(){try{return e.namespaces.add("lvml","urn:schemas-microsoft-com:vml"),function(t){return e.createElement("<lvml:"+t+' class="lvml">')}}catch(t){return function(t){return e.createElement("<"+t+' xmlns="urn:schemas-microsoft.com:vml" class="lvml">')}}}(),_initPath:function(){var t=this._container=this._createElement("shape");o.DomUtil.addClass(t,"leaflet-vml-shape"+(this.options.className?" "+this.options.className:"")),this.options.clickable&&o.DomUtil.addClass(t,"leaflet-clickable"),t.coordsize="1 1",this._path=this._createElement("path"),t.appendChild(this._path),this._map._pathRoot.appendChild(t)},_initStyle:function(){this._updateStyle()},_updateStyle:function(){var t=this._stroke,e=this._fill,i=this.options,n=this._container;n.stroked=i.stroke,n.filled=i.fill,i.stroke?(t||(t=this._stroke=this._createElement("stroke"),t.endcap="round",n.appendChild(t)),t.weight=i.weight+"px",t.color=i.color,t.opacity=i.opacity,i.dashArray?t.dashStyle=o.Util.isArray(i.dashArray)?i.dashArray.join(" "):i.dashArray.replace(/( *, *)/g," "):t.dashStyle="",i.lineCap&&(t.endcap=i.lineCap.replace("butt","flat")),i.lineJoin&&(t.joinstyle=i.lineJoin)):t&&(n.removeChild(t),this._stroke=null),i.fill?(e||(e=this._fill=this._createElement("fill"),n.appendChild(e)),e.color=i.fillColor||i.color,e.opacity=i.fillOpacity):e&&(n.removeChild(e),this._fill=null)},_updatePath:function(){var t=this._container.style;t.display="none",this._path.v=this.getPathString()+" ",t.display=""}}),o.Map.include(o.Browser.svg||!o.Browser.vml?{}:{_initPathRoot:function(){if(!this._pathRoot){var t=this._pathRoot=e.createElement("div");t.className="leaflet-vml-container",this._panes.overlayPane.appendChild(t),this.on("moveend",this._updatePathViewport),this._updatePathViewport()}}}),o.Browser.canvas=function(){return!!e.createElement("canvas").getContext}(),o.Path=o.Path.SVG&&!t.L_PREFER_CANVAS||!o.Browser.canvas?o.Path:o.Path.extend({statics:{CANVAS:!0,SVG:!1},redraw:function(){return this._map&&(this.projectLatlngs(),this._requestUpdate()),this},setStyle:function(t){return o.setOptions(this,t),this._map&&(this._updateStyle(),this._requestUpdate()),this},onRemove:function(t){t.off("viewreset",this.projectLatlngs,this).off("moveend",this._updatePath,this),this.options.clickable&&(this._map.off("click",this._onClick,this),this._map.off("mousemove",this._onMouseMove,this)),this._requestUpdate(),this.fire("remove"),this._map=null},_requestUpdate:function(){this._map&&!o.Path._updateRequest&&(o.Path._updateRequest=o.Util.requestAnimFrame(this._fireMapMoveEnd,this._map))},_fireMapMoveEnd:function(){o.Path._updateRequest=null,this.fire("moveend")},_initElements:function(){this._map._initPathRoot(),this._ctx=this._map._canvasCtx},_updateStyle:function(){var t=this.options;t.stroke&&(this._ctx.lineWidth=t.weight,this._ctx.strokeStyle=t.color),t.fill&&(this._ctx.fillStyle=t.fillColor||t.color),t.lineCap&&(this._ctx.lineCap=t.lineCap),t.lineJoin&&(this._ctx.lineJoin=t.lineJoin)},_drawPath:function(){var t,e,i,n,s,a;for(this._ctx.beginPath(),t=0,i=this._parts.length;i>t;t++){for(e=0,n=this._parts[t].length;n>e;e++)s=this._parts[t][e],a=(0===e?"move":"line")+"To",this._ctx[a](s.x,s.y);this instanceof o.Polygon&&this._ctx.closePath()}},_checkIfEmpty:function(){return!this._parts.length},_updatePath:function(){if(!this._checkIfEmpty()){var t=this._ctx,e=this.options;this._drawPath(),t.save(),this._updateStyle(),e.fill&&(t.globalAlpha=e.fillOpacity,t.fill(e.fillRule||"evenodd")),e.stroke&&(t.globalAlpha=e.opacity,t.stroke()),t.restore()}},_initEvents:function(){this.options.clickable&&(this._map.on("mousemove",this._onMouseMove,this),this._map.on("click dblclick contextmenu",this._fireMouseEvent,this))},_fireMouseEvent:function(t){this._containsPoint(t.layerPoint)&&this.fire(t.type,t)},_onMouseMove:function(t){this._map&&!this._map._animatingZoom&&(this._containsPoint(t.layerPoint)?(this._ctx.canvas.style.cursor="pointer",this._mouseInside=!0,this.fire("mouseover",t)):this._mouseInside&&(this._ctx.canvas.style.cursor="",this._mouseInside=!1,this.fire("mouseout",t)))}}),o.Map.include(o.Path.SVG&&!t.L_PREFER_CANVAS||!o.Browser.canvas?{}:{_initPathRoot:function(){var t,i=this._pathRoot;i||(i=this._pathRoot=e.createElement("canvas"),i.style.position="absolute",t=this._canvasCtx=i.getContext("2d"),t.lineCap="round",t.lineJoin="round",this._panes.overlayPane.appendChild(i),this.options.zoomAnimation&&(this._pathRoot.className="leaflet-zoom-animated",this.on("zoomanim",this._animatePathZoom),this.on("zoomend",this._endPathZoom)),this.on("moveend",this._updateCanvasViewport),this._updateCanvasViewport())},_updateCanvasViewport:function(){if(!this._pathZooming){this._updatePathViewport();var t=this._pathViewport,e=t.min,i=t.max.subtract(e),n=this._pathRoot;o.DomUtil.setPosition(n,e),n.width=i.x,n.height=i.y,n.getContext("2d").translate(-e.x,-e.y)}}}),o.LineUtil={simplify:function(t,e){if(!e||!t.length)return t.slice();var i=e*e;return t=this._reducePoints(t,i),t=this._simplifyDP(t,i)},pointToSegmentDistance:function(t,e,i){return Math.sqrt(this._sqClosestPointOnSegment(t,e,i,!0))},closestPointOnSegment:function(t,e,i){return this._sqClosestPointOnSegment(t,e,i)},_simplifyDP:function(t,e){var n=t.length,o=typeof Uint8Array!=i+""?Uint8Array:Array,s=new o(n);s[0]=s[n-1]=1,this._simplifyDPStep(t,s,e,0,n-1);var a,r=[];for(a=0;n>a;a++)s[a]&&r.push(t[a]);return r},_simplifyDPStep:function(t,e,i,n,o){var s,a,r,h=0;for(a=n+1;o-1>=a;a++)r=this._sqClosestPointOnSegment(t[a],t[n],t[o],!0),r>h&&(s=a,h=r);h>i&&(e[s]=1,this._simplifyDPStep(t,e,i,n,s),this._simplifyDPStep(t,e,i,s,o))},_reducePoints:function(t,e){for(var i=[t[0]],n=1,o=0,s=t.length;s>n;n++)this._sqDist(t[n],t[o])>e&&(i.push(t[n]),o=n);return s-1>o&&i.push(t[s-1]),i},clipSegment:function(t,e,i,n){var o,s,a,r=n?this._lastCode:this._getBitCode(t,i),h=this._getBitCode(e,i);for(this._lastCode=h;;){if(!(r|h))return[t,e];if(r&h)return!1;o=r||h,s=this._getEdgeIntersection(t,e,o,i),a=this._getBitCode(s,i),o===r?(t=s,r=a):(e=s,h=a)}},_getEdgeIntersection:function(t,e,i,n){var s=e.x-t.x,a=e.y-t.y,r=n.min,h=n.max;return 8&i?new o.Point(t.x+s*(h.y-t.y)/a,h.y):4&i?new o.Point(t.x+s*(r.y-t.y)/a,r.y):2&i?new o.Point(h.x,t.y+a*(h.x-t.x)/s):1&i?new o.Point(r.x,t.y+a*(r.x-t.x)/s):void 0},_getBitCode:function(t,e){var i=0;return t.x<e.min.x?i|=1:t.x>e.max.x&&(i|=2),t.y<e.min.y?i|=4:t.y>e.max.y&&(i|=8),i},_sqDist:function(t,e){var i=e.x-t.x,n=e.y-t.y;return i*i+n*n},_sqClosestPointOnSegment:function(t,e,i,n){var s,a=e.x,r=e.y,h=i.x-a,l=i.y-r,u=h*h+l*l;return u>0&&(s=((t.x-a)*h+(t.y-r)*l)/u,s>1?(a=i.x,r=i.y):s>0&&(a+=h*s,r+=l*s)),h=t.x-a,l=t.y-r,n?h*h+l*l:new o.Point(a,r)}},o.Polyline=o.Path.extend({initialize:function(t,e){o.Path.prototype.initialize.call(this,e),this._latlngs=this._convertLatLngs(t)},options:{smoothFactor:1,noClip:!1},projectLatlngs:function(){this._originalPoints=[];for(var t=0,e=this._latlngs.length;e>t;t++)this._originalPoints[t]=this._map.latLngToLayerPoint(this._latlngs[t])},getPathString:function(){for(var t=0,e=this._parts.length,i="";e>t;t++)i+=this._getPathPartStr(this._parts[t]);return i},getLatLngs:function(){return this._latlngs},setLatLngs:function(t){return this._latlngs=this._convertLatLngs(t),this.redraw()},addLatLng:function(t){return this._latlngs.push(o.latLng(t)),this.redraw()},spliceLatLngs:function(){var t=[].splice.apply(this._latlngs,arguments);return this._convertLatLngs(this._latlngs,!0),this.redraw(),t},closestLayerPoint:function(t){for(var e,i,n=1/0,s=this._parts,a=null,r=0,h=s.length;h>r;r++)for(var l=s[r],u=1,c=l.length;c>u;u++){e=l[u-1],i=l[u];var d=o.LineUtil._sqClosestPointOnSegment(t,e,i,!0);n>d&&(n=d,a=o.LineUtil._sqClosestPointOnSegment(t,e,i))}return a&&(a.distance=Math.sqrt(n)),a},getBounds:function(){return new o.LatLngBounds(this.getLatLngs())},_convertLatLngs:function(t,e){var i,n,s=e?t:[];for(i=0,n=t.length;n>i;i++){if(o.Util.isArray(t[i])&&"number"!=typeof t[i][0])return;s[i]=o.latLng(t[i])}return s},_initEvents:function(){o.Path.prototype._initEvents.call(this)},_getPathPartStr:function(t){for(var e,i=o.Path.VML,n=0,s=t.length,a="";s>n;n++)e=t[n],i&&e._round(),a+=(n?"L":"M")+e.x+" "+e.y;return a},_clipPoints:function(){var t,e,i,n=this._originalPoints,s=n.length;if(this.options.noClip)return void(this._parts=[n]);this._parts=[];var a=this._parts,r=this._map._pathViewport,h=o.LineUtil;for(t=0,e=0;s-1>t;t++)i=h.clipSegment(n[t],n[t+1],r,t),i&&(a[e]=a[e]||[],a[e].push(i[0]),(i[1]!==n[t+1]||t===s-2)&&(a[e].push(i[1]),e++))},_simplifyPoints:function(){for(var t=this._parts,e=o.LineUtil,i=0,n=t.length;n>i;i++)t[i]=e.simplify(t[i],this.options.smoothFactor)},_updatePath:function(){this._map&&(this._clipPoints(),this._simplifyPoints(),o.Path.prototype._updatePath.call(this))}}),o.polyline=function(t,e){return new o.Polyline(t,e)},o.PolyUtil={},o.PolyUtil.clipPolygon=function(t,e){var i,n,s,a,r,h,l,u,c,d=[1,4,2,8],p=o.LineUtil;for(n=0,l=t.length;l>n;n++)t[n]._code=p._getBitCode(t[n],e);for(a=0;4>a;a++){for(u=d[a],i=[],n=0,l=t.length,s=l-1;l>n;s=n++)r=t[n],h=t[s],r._code&u?h._code&u||(c=p._getEdgeIntersection(h,r,u,e),c._code=p._getBitCode(c,e),i.push(c)):(h._code&u&&(c=p._getEdgeIntersection(h,r,u,e),c._code=p._getBitCode(c,e),i.push(c)),i.push(r));t=i}return t},o.Polygon=o.Polyline.extend({options:{fill:!0},initialize:function(t,e){o.Polyline.prototype.initialize.call(this,t,e),this._initWithHoles(t)},_initWithHoles:function(t){var e,i,n;if(t&&o.Util.isArray(t[0])&&"number"!=typeof t[0][0])for(this._latlngs=this._convertLatLngs(t[0]),this._holes=t.slice(1),e=0,i=this._holes.length;i>e;e++)n=this._holes[e]=this._convertLatLngs(this._holes[e]),n[0].equals(n[n.length-1])&&n.pop();t=this._latlngs,t.length>=2&&t[0].equals(t[t.length-1])&&t.pop()},projectLatlngs:function(){if(o.Polyline.prototype.projectLatlngs.call(this),this._holePoints=[],this._holes){var t,e,i,n;for(t=0,i=this._holes.length;i>t;t++)for(this._holePoints[t]=[],e=0,n=this._holes[t].length;n>e;e++)this._holePoints[t][e]=this._map.latLngToLayerPoint(this._holes[t][e])}},setLatLngs:function(t){return t&&o.Util.isArray(t[0])&&"number"!=typeof t[0][0]?(this._initWithHoles(t),this.redraw()):o.Polyline.prototype.setLatLngs.call(this,t)},_clipPoints:function(){var t=this._originalPoints,e=[];if(this._parts=[t].concat(this._holePoints),!this.options.noClip){for(var i=0,n=this._parts.length;n>i;i++){var s=o.PolyUtil.clipPolygon(this._parts[i],this._map._pathViewport);s.length&&e.push(s)}this._parts=e}},_getPathPartStr:function(t){var e=o.Polyline.prototype._getPathPartStr.call(this,t);return e+(o.Browser.svg?"z":"x")}}),o.polygon=function(t,e){return new o.Polygon(t,e)},function(){function t(t){return o.FeatureGroup.extend({initialize:function(t,e){this._layers={},this._options=e,this.setLatLngs(t)},setLatLngs:function(e){var i=0,n=e.length;for(this.eachLayer(function(t){n>i?t.setLatLngs(e[i++]):this.removeLayer(t)},this);n>i;)this.addLayer(new t(e[i++],this._options));return this},getLatLngs:function(){var t=[];return this.eachLayer(function(e){t.push(e.getLatLngs())}),t}})}o.MultiPolyline=t(o.Polyline),o.MultiPolygon=t(o.Polygon),o.multiPolyline=function(t,e){return new o.MultiPolyline(t,e)},o.multiPolygon=function(t,e){return new o.MultiPolygon(t,e)}}(),o.Rectangle=o.Polygon.extend({initialize:function(t,e){o.Polygon.prototype.initialize.call(this,this._boundsToLatLngs(t),e)},setBounds:function(t){this.setLatLngs(this._boundsToLatLngs(t))},_boundsToLatLngs:function(t){return t=o.latLngBounds(t),[t.getSouthWest(),t.getNorthWest(),t.getNorthEast(),t.getSouthEast()]}}),o.rectangle=function(t,e){return new o.Rectangle(t,e)},o.Circle=o.Path.extend({initialize:function(t,e,i){o.Path.prototype.initialize.call(this,i),this._latlng=o.latLng(t),this._mRadius=e},options:{fill:!0},setLatLng:function(t){return this._latlng=o.latLng(t),this.redraw()},setRadius:function(t){return this._mRadius=t,this.redraw()},projectLatlngs:function(){var t=this._getLngRadius(),e=this._latlng,i=this._map.latLngToLayerPoint([e.lat,e.lng-t]);this._point=this._map.latLngToLayerPoint(e),this._radius=Math.max(this._point.x-i.x,1)},getBounds:function(){var t=this._getLngRadius(),e=this._mRadius/40075017*360,i=this._latlng;return new o.LatLngBounds([i.lat-e,i.lng-t],[i.lat+e,i.lng+t])},getLatLng:function(){return this._latlng},getPathString:function(){var t=this._point,e=this._radius;return this._checkIfEmpty()?"":o.Browser.svg?"M"+t.x+","+(t.y-e)+"A"+e+","+e+",0,1,1,"+(t.x-.1)+","+(t.y-e)+" z":(t._round(),e=Math.round(e),"AL "+t.x+","+t.y+" "+e+","+e+" 0,23592600")},getRadius:function(){return this._mRadius},_getLatRadius:function(){return this._mRadius/40075017*360},_getLngRadius:function(){return this._getLatRadius()/Math.cos(o.LatLng.DEG_TO_RAD*this._latlng.lat)},_checkIfEmpty:function(){if(!this._map)return!1;var t=this._map._pathViewport,e=this._radius,i=this._point;return i.x-e>t.max.x||i.y-e>t.max.y||i.x+e<t.min.x||i.y+e<t.min.y}}),o.circle=function(t,e,i){return new o.Circle(t,e,i)},o.CircleMarker=o.Circle.extend({options:{radius:10,weight:2},initialize:function(t,e){o.Circle.prototype.initialize.call(this,t,null,e),this._radius=this.options.radius},projectLatlngs:function(){this._point=this._map.latLngToLayerPoint(this._latlng)},_updateStyle:function(){o.Circle.prototype._updateStyle.call(this),this.setRadius(this.options.radius)},setLatLng:function(t){return o.Circle.prototype.setLatLng.call(this,t),this._popup&&this._popup._isOpen&&this._popup.setLatLng(t),this},setRadius:function(t){return this.options.radius=this._radius=t,this.redraw()},getRadius:function(){return this._radius}}),o.circleMarker=function(t,e){return new o.CircleMarker(t,e)},o.Polyline.include(o.Path.CANVAS?{_containsPoint:function(t,e){var i,n,s,a,r,h,l,u=this.options.weight/2;for(o.Browser.touch&&(u+=10),i=0,a=this._parts.length;a>i;i++)for(l=this._parts[i],n=0,r=l.length,s=r-1;r>n;s=n++)if((e||0!==n)&&(h=o.LineUtil.pointToSegmentDistance(t,l[s],l[n]),u>=h))return!0;return!1}}:{}),o.Polygon.include(o.Path.CANVAS?{_containsPoint:function(t){var e,i,n,s,a,r,h,l,u=!1;if(o.Polyline.prototype._containsPoint.call(this,t,!0))return!0;for(s=0,h=this._parts.length;h>s;s++)for(e=this._parts[s],a=0,l=e.length,r=l-1;l>a;r=a++)i=e[a],n=e[r],i.y>t.y!=n.y>t.y&&t.x<(n.x-i.x)*(t.y-i.y)/(n.y-i.y)+i.x&&(u=!u);return u}}:{}),o.Circle.include(o.Path.CANVAS?{_drawPath:function(){var t=this._point;this._ctx.beginPath(),this._ctx.arc(t.x,t.y,this._radius,0,2*Math.PI,!1)},_containsPoint:function(t){var e=this._point,i=this.options.stroke?this.options.weight/2:0;return t.distanceTo(e)<=this._radius+i}}:{}),o.CircleMarker.include(o.Path.CANVAS?{_updateStyle:function(){o.Path.prototype._updateStyle.call(this)}}:{}),o.GeoJSON=o.FeatureGroup.extend({initialize:function(t,e){o.setOptions(this,e),this._layers={},t&&this.addData(t)},addData:function(t){var e,i,n,s=o.Util.isArray(t)?t:t.features;if(s){for(e=0,i=s.length;i>e;e++)n=s[e],(n.geometries||n.geometry||n.features||n.coordinates)&&this.addData(s[e]);return this}var a=this.options;if(!a.filter||a.filter(t)){var r=o.GeoJSON.geometryToLayer(t,a.pointToLayer,a.coordsToLatLng,a);return r.feature=o.GeoJSON.asFeature(t),r.defaultOptions=r.options,this.resetStyle(r),a.onEachFeature&&a.onEachFeature(t,r),this.addLayer(r)}},resetStyle:function(t){var e=this.options.style;e&&(o.Util.extend(t.options,t.defaultOptions),this._setLayerStyle(t,e))},setStyle:function(t){this.eachLayer(function(e){this._setLayerStyle(e,t)},this)},_setLayerStyle:function(t,e){"function"==typeof e&&(e=e(t.feature)),t.setStyle&&t.setStyle(e)}}),o.extend(o.GeoJSON,{geometryToLayer:function(t,e,i,n){var s,a,r,h,l="Feature"===t.type?t.geometry:t,u=l.coordinates,c=[];switch(i=i||this.coordsToLatLng,l.type){case"Point":return s=i(u),e?e(t,s):new o.Marker(s);case"MultiPoint":for(r=0,h=u.length;h>r;r++)s=i(u[r]),c.push(e?e(t,s):new o.Marker(s));return new o.FeatureGroup(c);case"LineString":return a=this.coordsToLatLngs(u,0,i),new o.Polyline(a,n);case"Polygon":if(2===u.length&&!u[1].length)throw new Error("Invalid GeoJSON object.");return a=this.coordsToLatLngs(u,1,i),new o.Polygon(a,n);case"MultiLineString":return a=this.coordsToLatLngs(u,1,i),new o.MultiPolyline(a,n);case"MultiPolygon":return a=this.coordsToLatLngs(u,2,i),new o.MultiPolygon(a,n);case"GeometryCollection":for(r=0,h=l.geometries.length;h>r;r++)c.push(this.geometryToLayer({geometry:l.geometries[r],type:"Feature",properties:t.properties},e,i,n));return new o.FeatureGroup(c);default:throw new Error("Invalid GeoJSON object.")}},coordsToLatLng:function(t){return new o.LatLng(t[1],t[0],t[2])},coordsToLatLngs:function(t,e,i){var n,o,s,a=[];for(o=0,s=t.length;s>o;o++)n=e?this.coordsToLatLngs(t[o],e-1,i):(i||this.coordsToLatLng)(t[o]),a.push(n);return a},latLngToCoords:function(t){var e=[t.lng,t.lat];return t.alt!==i&&e.push(t.alt),e},latLngsToCoords:function(t){for(var e=[],i=0,n=t.length;n>i;i++)e.push(o.GeoJSON.latLngToCoords(t[i]));return e},getFeature:function(t,e){return t.feature?o.extend({},t.feature,{geometry:e}):o.GeoJSON.asFeature(e)},asFeature:function(t){return"Feature"===t.type?t:{type:"Feature",properties:{},geometry:t}}});var a={toGeoJSON:function(){return o.GeoJSON.getFeature(this,{type:"Point",coordinates:o.GeoJSON.latLngToCoords(this.getLatLng())})}};o.Marker.include(a),o.Circle.include(a),o.CircleMarker.include(a),o.Polyline.include({toGeoJSON:function(){return o.GeoJSON.getFeature(this,{type:"LineString",coordinates:o.GeoJSON.latLngsToCoords(this.getLatLngs())})}}),o.Polygon.include({toGeoJSON:function(){var t,e,i,n=[o.GeoJSON.latLngsToCoords(this.getLatLngs())];if(n[0].push(n[0][0]),this._holes)for(t=0,e=this._holes.length;e>t;t++)i=o.GeoJSON.latLngsToCoords(this._holes[t]),i.push(i[0]),n.push(i);return o.GeoJSON.getFeature(this,{type:"Polygon",coordinates:n})}}),function(){function t(t){return function(){var e=[];return this.eachLayer(function(t){e.push(t.toGeoJSON().geometry.coordinates)}),o.GeoJSON.getFeature(this,{type:t,coordinates:e})}}o.MultiPolyline.include({toGeoJSON:t("MultiLineString")}),o.MultiPolygon.include({toGeoJSON:t("MultiPolygon")}),o.LayerGroup.include({toGeoJSON:function(){var e,i=this.feature&&this.feature.geometry,n=[];if(i&&"MultiPoint"===i.type)return t("MultiPoint").call(this);var s=i&&"GeometryCollection"===i.type;return this.eachLayer(function(t){t.toGeoJSON&&(e=t.toGeoJSON(),n.push(s?e.geometry:o.GeoJSON.asFeature(e)))}),s?o.GeoJSON.getFeature(this,{geometries:n,type:"GeometryCollection"}):{type:"FeatureCollection",features:n}}})}(),o.geoJson=function(t,e){return new o.GeoJSON(t,e)},o.DomEvent={addListener:function(t,e,i,n){var s,a,r,h=o.stamp(i),l="_leaflet_"+e+h;return t[l]?this:(s=function(e){return i.call(n||t,e||o.DomEvent._getEvent())},o.Browser.pointer&&0===e.indexOf("touch")?this.addPointerListener(t,e,s,h):(o.Browser.touch&&"dblclick"===e&&this.addDoubleTapListener&&this.addDoubleTapListener(t,s,h),"addEventListener"in t?"mousewheel"===e?(t.addEventListener("DOMMouseScroll",s,!1),t.addEventListener(e,s,!1)):"mouseenter"===e||"mouseleave"===e?(a=s,r="mouseenter"===e?"mouseover":"mouseout",s=function(e){return o.DomEvent._checkMouse(t,e)?a(e):void 0},t.addEventListener(r,s,!1)):"click"===e&&o.Browser.android?(a=s,s=function(t){return o.DomEvent._filterClick(t,a)},t.addEventListener(e,s,!1)):t.addEventListener(e,s,!1):"attachEvent"in t&&t.attachEvent("on"+e,s),t[l]=s,this))},removeListener:function(t,e,i){var n=o.stamp(i),s="_leaflet_"+e+n,a=t[s];return a?(o.Browser.pointer&&0===e.indexOf("touch")?this.removePointerListener(t,e,n):o.Browser.touch&&"dblclick"===e&&this.removeDoubleTapListener?this.removeDoubleTapListener(t,n):"removeEventListener"in t?"mousewheel"===e?(t.removeEventListener("DOMMouseScroll",a,!1),t.removeEventListener(e,a,!1)):"mouseenter"===e||"mouseleave"===e?t.removeEventListener("mouseenter"===e?"mouseover":"mouseout",a,!1):t.removeEventListener(e,a,!1):"detachEvent"in t&&t.detachEvent("on"+e,a),t[s]=null,this):this},stopPropagation:function(t){return t.stopPropagation?t.stopPropagation():t.cancelBubble=!0,o.DomEvent._skipped(t),this},disableScrollPropagation:function(t){var e=o.DomEvent.stopPropagation;return o.DomEvent.on(t,"mousewheel",e).on(t,"MozMousePixelScroll",e)},disableClickPropagation:function(t){for(var e=o.DomEvent.stopPropagation,i=o.Draggable.START.length-1;i>=0;i--)o.DomEvent.on(t,o.Draggable.START[i],e);return o.DomEvent.on(t,"click",o.DomEvent._fakeStop).on(t,"dblclick",e)},preventDefault:function(t){return t.preventDefault?t.preventDefault():t.returnValue=!1,this},stop:function(t){return o.DomEvent.preventDefault(t).stopPropagation(t)},getMousePosition:function(t,e){if(!e)return new o.Point(t.clientX,t.clientY);var i=e.getBoundingClientRect();return new o.Point(t.clientX-i.left-e.clientLeft,t.clientY-i.top-e.clientTop)},getWheelDelta:function(t){var e=0;return t.wheelDelta&&(e=t.wheelDelta/120),t.detail&&(e=-t.detail/3),e},_skipEvents:{},_fakeStop:function(t){o.DomEvent._skipEvents[t.type]=!0},_skipped:function(t){var e=this._skipEvents[t.type];return this._skipEvents[t.type]=!1,e},_checkMouse:function(t,e){var i=e.relatedTarget;if(!i)return!0;try{for(;i&&i!==t;)i=i.parentNode}catch(n){return!1}return i!==t},_getEvent:function(){var e=t.event;if(!e)for(var i=arguments.callee.caller;i&&(e=i.arguments[0],!e||t.Event!==e.constructor);)i=i.caller;return e},_filterClick:function(t,e){var i=t.timeStamp||t.originalEvent.timeStamp,n=o.DomEvent._lastClick&&i-o.DomEvent._lastClick;return n&&n>100&&500>n||t.target._simulatedClick&&!t._simulated?void o.DomEvent.stop(t):(o.DomEvent._lastClick=i,e(t))}},o.DomEvent.on=o.DomEvent.addListener,o.DomEvent.off=o.DomEvent.removeListener,o.Draggable=o.Class.extend({includes:o.Mixin.Events,statics:{START:o.Browser.touch?["touchstart","mousedown"]:["mousedown"],END:{mousedown:"mouseup",touchstart:"touchend",pointerdown:"touchend",MSPointerDown:"touchend"},MOVE:{mousedown:"mousemove",touchstart:"touchmove",pointerdown:"touchmove",MSPointerDown:"touchmove"}},initialize:function(t,e){this._element=t,this._dragStartTarget=e||t},enable:function(){if(!this._enabled){for(var t=o.Draggable.START.length-1;t>=0;t--)o.DomEvent.on(this._dragStartTarget,o.Draggable.START[t],this._onDown,this);this._enabled=!0}},disable:function(){if(this._enabled){for(var t=o.Draggable.START.length-1;t>=0;t--)o.DomEvent.off(this._dragStartTarget,o.Draggable.START[t],this._onDown,this);this._enabled=!1,this._moved=!1}},_onDown:function(t){if(this._moved=!1,!t.shiftKey&&(1===t.which||1===t.button||t.touches)&&(o.DomEvent.stopPropagation(t),!o.Draggable._disabled&&(o.DomUtil.disableImageDrag(),o.DomUtil.disableTextSelection(),!this._moving))){var i=t.touches?t.touches[0]:t;this._startPoint=new o.Point(i.clientX,i.clientY),this._startPos=this._newPos=o.DomUtil.getPosition(this._element),o.DomEvent.on(e,o.Draggable.MOVE[t.type],this._onMove,this).on(e,o.Draggable.END[t.type],this._onUp,this)}},_onMove:function(t){if(t.touches&&t.touches.length>1)return void(this._moved=!0);var i=t.touches&&1===t.touches.length?t.touches[0]:t,n=new o.Point(i.clientX,i.clientY),s=n.subtract(this._startPoint);(s.x||s.y)&&(o.Browser.touch&&Math.abs(s.x)+Math.abs(s.y)<3||(o.DomEvent.preventDefault(t),this._moved||(this.fire("dragstart"),this._moved=!0,this._startPos=o.DomUtil.getPosition(this._element).subtract(s),o.DomUtil.addClass(e.body,"leaflet-dragging"),this._lastTarget=t.target||t.srcElement,o.DomUtil.addClass(this._lastTarget,"leaflet-drag-target")),this._newPos=this._startPos.add(s),this._moving=!0,o.Util.cancelAnimFrame(this._animRequest),this._animRequest=o.Util.requestAnimFrame(this._updatePosition,this,!0,this._dragStartTarget)))},_updatePosition:function(){this.fire("predrag"),o.DomUtil.setPosition(this._element,this._newPos),this.fire("drag")},_onUp:function(){o.DomUtil.removeClass(e.body,"leaflet-dragging"),this._lastTarget&&(o.DomUtil.removeClass(this._lastTarget,"leaflet-drag-target"),this._lastTarget=null);for(var t in o.Draggable.MOVE)o.DomEvent.off(e,o.Draggable.MOVE[t],this._onMove).off(e,o.Draggable.END[t],this._onUp);o.DomUtil.enableImageDrag(),o.DomUtil.enableTextSelection(),this._moved&&this._moving&&(o.Util.cancelAnimFrame(this._animRequest),this.fire("dragend",{distance:this._newPos.distanceTo(this._startPos)})),this._moving=!1}}),o.Handler=o.Class.extend({initialize:function(t){this._map=t},enable:function(){this._enabled||(this._enabled=!0,this.addHooks())},disable:function(){this._enabled&&(this._enabled=!1,this.removeHooks())},enabled:function(){return!!this._enabled}}),o.Map.mergeOptions({dragging:!0,inertia:!o.Browser.android23,inertiaDeceleration:3400,inertiaMaxSpeed:1/0,inertiaThreshold:o.Browser.touch?32:18,easeLinearity:.25,worldCopyJump:!1}),o.Map.Drag=o.Handler.extend({addHooks:function(){if(!this._draggable){var t=this._map;this._draggable=new o.Draggable(t._mapPane,t._container),this._draggable.on({dragstart:this._onDragStart,drag:this._onDrag,dragend:this._onDragEnd},this),t.options.worldCopyJump&&(this._draggable.on("predrag",this._onPreDrag,this),t.on("viewreset",this._onViewReset,this),t.whenReady(this._onViewReset,this))}this._draggable.enable()},removeHooks:function(){this._draggable.disable()},moved:function(){return this._draggable&&this._draggable._moved},_onDragStart:function(){var t=this._map;t._panAnim&&t._panAnim.stop(),t.fire("movestart").fire("dragstart"),t.options.inertia&&(this._positions=[],this._times=[])},_onDrag:function(){if(this._map.options.inertia){var t=this._lastTime=+new Date,e=this._lastPos=this._draggable._newPos;this._positions.push(e),this._times.push(t),t-this._times[0]>200&&(this._positions.shift(),this._times.shift())}this._map.fire("move").fire("drag")},_onViewReset:function(){var t=this._map.getSize()._divideBy(2),e=this._map.latLngToLayerPoint([0,0]);this._initialWorldOffset=e.subtract(t).x,this._worldWidth=this._map.project([0,180]).x},_onPreDrag:function(){var t=this._worldWidth,e=Math.round(t/2),i=this._initialWorldOffset,n=this._draggable._newPos.x,o=(n-e+i)%t+e-i,s=(n+e+i)%t-e-i,a=Math.abs(o+i)<Math.abs(s+i)?o:s;this._draggable._newPos.x=a},_onDragEnd:function(t){var e=this._map,i=e.options,n=+new Date-this._lastTime,s=!i.inertia||n>i.inertiaThreshold||!this._positions[0];if(e.fire("dragend",t),s)e.fire("moveend");else{var a=this._lastPos.subtract(this._positions[0]),r=(this._lastTime+n-this._times[0])/1e3,h=i.easeLinearity,l=a.multiplyBy(h/r),u=l.distanceTo([0,0]),c=Math.min(i.inertiaMaxSpeed,u),d=l.multiplyBy(c/u),p=c/(i.inertiaDeceleration*h),_=d.multiplyBy(-p/2).round();_.x&&_.y?(_=e._limitOffset(_,e.options.maxBounds),o.Util.requestAnimFrame(function(){e.panBy(_,{duration:p,easeLinearity:h,noMoveStart:!0})})):e.fire("moveend")}}}),o.Map.addInitHook("addHandler","dragging",o.Map.Drag),o.Map.mergeOptions({doubleClickZoom:!0}),o.Map.DoubleClickZoom=o.Handler.extend({addHooks:function(){this._map.on("dblclick",this._onDoubleClick,this)},removeHooks:function(){this._map.off("dblclick",this._onDoubleClick,this)},_onDoubleClick:function(t){var e=this._map,i=e.getZoom()+(t.originalEvent.shiftKey?-1:1);"center"===e.options.doubleClickZoom?e.setZoom(i):e.setZoomAround(t.containerPoint,i)}}),o.Map.addInitHook("addHandler","doubleClickZoom",o.Map.DoubleClickZoom),o.Map.mergeOptions({scrollWheelZoom:!0}),o.Map.ScrollWheelZoom=o.Handler.extend({addHooks:function(){o.DomEvent.on(this._map._container,"mousewheel",this._onWheelScroll,this),o.DomEvent.on(this._map._container,"MozMousePixelScroll",o.DomEvent.preventDefault),this._delta=0},removeHooks:function(){o.DomEvent.off(this._map._container,"mousewheel",this._onWheelScroll),o.DomEvent.off(this._map._container,"MozMousePixelScroll",o.DomEvent.preventDefault)},_onWheelScroll:function(t){var e=o.DomEvent.getWheelDelta(t);this._delta+=e,this._lastMousePos=this._map.mouseEventToContainerPoint(t),this._startTime||(this._startTime=+new Date);var i=Math.max(40-(+new Date-this._startTime),0);clearTimeout(this._timer),this._timer=setTimeout(o.bind(this._performZoom,this),i),o.DomEvent.preventDefault(t),o.DomEvent.stopPropagation(t)},_performZoom:function(){var t=this._map,e=this._delta,i=t.getZoom();e=e>0?Math.ceil(e):Math.floor(e),e=Math.max(Math.min(e,4),-4),e=t._limitZoom(i+e)-i,this._delta=0,this._startTime=null,e&&("center"===t.options.scrollWheelZoom?t.setZoom(i+e):t.setZoomAround(this._lastMousePos,i+e))}}),o.Map.addInitHook("addHandler","scrollWheelZoom",o.Map.ScrollWheelZoom),o.extend(o.DomEvent,{_touchstart:o.Browser.msPointer?"MSPointerDown":o.Browser.pointer?"pointerdown":"touchstart",_touchend:o.Browser.msPointer?"MSPointerUp":o.Browser.pointer?"pointerup":"touchend",addDoubleTapListener:function(t,i,n){function s(t){var e;if(o.Browser.pointer?(_.push(t.pointerId),e=_.length):e=t.touches.length,!(e>1)){var i=Date.now(),n=i-(r||i);h=t.touches?t.touches[0]:t,l=n>0&&u>=n,r=i}}function a(t){if(o.Browser.pointer){var e=_.indexOf(t.pointerId);if(-1===e)return;_.splice(e,1)}if(l){if(o.Browser.pointer){var n,s={};for(var a in h)n=h[a],"function"==typeof n?s[a]=n.bind(h):s[a]=n;h=s}h.type="dblclick",i(h),r=null}}var r,h,l=!1,u=250,c="_leaflet_",d=this._touchstart,p=this._touchend,_=[];t[c+d+n]=s,t[c+p+n]=a;var m=o.Browser.pointer?e.documentElement:t;return t.addEventListener(d,s,!1),m.addEventListener(p,a,!1),o.Browser.pointer&&m.addEventListener(o.DomEvent.POINTER_CANCEL,a,!1),this},removeDoubleTapListener:function(t,i){var n="_leaflet_";return t.removeEventListener(this._touchstart,t[n+this._touchstart+i],!1),(o.Browser.pointer?e.documentElement:t).removeEventListener(this._touchend,t[n+this._touchend+i],!1),o.Browser.pointer&&e.documentElement.removeEventListener(o.DomEvent.POINTER_CANCEL,t[n+this._touchend+i],!1),this}}),o.extend(o.DomEvent,{POINTER_DOWN:o.Browser.msPointer?"MSPointerDown":"pointerdown",POINTER_MOVE:o.Browser.msPointer?"MSPointerMove":"pointermove",POINTER_UP:o.Browser.msPointer?"MSPointerUp":"pointerup",POINTER_CANCEL:o.Browser.msPointer?"MSPointerCancel":"pointercancel",_pointers:[],_pointerDocumentListener:!1,addPointerListener:function(t,e,i,n){switch(e){case"touchstart":return this.addPointerListenerStart(t,e,i,n);
+case"touchend":return this.addPointerListenerEnd(t,e,i,n);case"touchmove":return this.addPointerListenerMove(t,e,i,n);default:throw"Unknown touch event type"}},addPointerListenerStart:function(t,i,n,s){var a="_leaflet_",r=this._pointers,h=function(t){"mouse"!==t.pointerType&&t.pointerType!==t.MSPOINTER_TYPE_MOUSE&&o.DomEvent.preventDefault(t);for(var e=!1,i=0;i<r.length;i++)if(r[i].pointerId===t.pointerId){e=!0;break}e||r.push(t),t.touches=r.slice(),t.changedTouches=[t],n(t)};if(t[a+"touchstart"+s]=h,t.addEventListener(this.POINTER_DOWN,h,!1),!this._pointerDocumentListener){var l=function(t){for(var e=0;e<r.length;e++)if(r[e].pointerId===t.pointerId){r.splice(e,1);break}};e.documentElement.addEventListener(this.POINTER_UP,l,!1),e.documentElement.addEventListener(this.POINTER_CANCEL,l,!1),this._pointerDocumentListener=!0}return this},addPointerListenerMove:function(t,e,i,n){function o(t){if(t.pointerType!==t.MSPOINTER_TYPE_MOUSE&&"mouse"!==t.pointerType||0!==t.buttons){for(var e=0;e<a.length;e++)if(a[e].pointerId===t.pointerId){a[e]=t;break}t.touches=a.slice(),t.changedTouches=[t],i(t)}}var s="_leaflet_",a=this._pointers;return t[s+"touchmove"+n]=o,t.addEventListener(this.POINTER_MOVE,o,!1),this},addPointerListenerEnd:function(t,e,i,n){var o="_leaflet_",s=this._pointers,a=function(t){for(var e=0;e<s.length;e++)if(s[e].pointerId===t.pointerId){s.splice(e,1);break}t.touches=s.slice(),t.changedTouches=[t],i(t)};return t[o+"touchend"+n]=a,t.addEventListener(this.POINTER_UP,a,!1),t.addEventListener(this.POINTER_CANCEL,a,!1),this},removePointerListener:function(t,e,i){var n="_leaflet_",o=t[n+e+i];switch(e){case"touchstart":t.removeEventListener(this.POINTER_DOWN,o,!1);break;case"touchmove":t.removeEventListener(this.POINTER_MOVE,o,!1);break;case"touchend":t.removeEventListener(this.POINTER_UP,o,!1),t.removeEventListener(this.POINTER_CANCEL,o,!1)}return this}}),o.Map.mergeOptions({touchZoom:o.Browser.touch&&!o.Browser.android23,bounceAtZoomLimits:!0}),o.Map.TouchZoom=o.Handler.extend({addHooks:function(){o.DomEvent.on(this._map._container,"touchstart",this._onTouchStart,this)},removeHooks:function(){o.DomEvent.off(this._map._container,"touchstart",this._onTouchStart,this)},_onTouchStart:function(t){var i=this._map;if(t.touches&&2===t.touches.length&&!i._animatingZoom&&!this._zooming){var n=i.mouseEventToLayerPoint(t.touches[0]),s=i.mouseEventToLayerPoint(t.touches[1]),a=i._getCenterLayerPoint();this._startCenter=n.add(s)._divideBy(2),this._startDist=n.distanceTo(s),this._moved=!1,this._zooming=!0,this._centerOffset=a.subtract(this._startCenter),i._panAnim&&i._panAnim.stop(),o.DomEvent.on(e,"touchmove",this._onTouchMove,this).on(e,"touchend",this._onTouchEnd,this),o.DomEvent.preventDefault(t)}},_onTouchMove:function(t){var e=this._map;if(t.touches&&2===t.touches.length&&this._zooming){var i=e.mouseEventToLayerPoint(t.touches[0]),n=e.mouseEventToLayerPoint(t.touches[1]);this._scale=i.distanceTo(n)/this._startDist,this._delta=i._add(n)._divideBy(2)._subtract(this._startCenter),1!==this._scale&&(e.options.bounceAtZoomLimits||!(e.getZoom()===e.getMinZoom()&&this._scale<1||e.getZoom()===e.getMaxZoom()&&this._scale>1))&&(this._moved||(o.DomUtil.addClass(e._mapPane,"leaflet-touching"),e.fire("movestart").fire("zoomstart"),this._moved=!0),o.Util.cancelAnimFrame(this._animRequest),this._animRequest=o.Util.requestAnimFrame(this._updateOnMove,this,!0,this._map._container),o.DomEvent.preventDefault(t))}},_updateOnMove:function(){var t=this._map,e=this._getScaleOrigin(),i=t.layerPointToLatLng(e),n=t.getScaleZoom(this._scale);t._animateZoom(i,n,this._startCenter,this._scale,this._delta,!1,!0)},_onTouchEnd:function(){if(!this._moved||!this._zooming)return void(this._zooming=!1);var t=this._map;this._zooming=!1,o.DomUtil.removeClass(t._mapPane,"leaflet-touching"),o.Util.cancelAnimFrame(this._animRequest),o.DomEvent.off(e,"touchmove",this._onTouchMove).off(e,"touchend",this._onTouchEnd);var i=this._getScaleOrigin(),n=t.layerPointToLatLng(i),s=t.getZoom(),a=t.getScaleZoom(this._scale)-s,r=a>0?Math.ceil(a):Math.floor(a),h=t._limitZoom(s+r),l=t.getZoomScale(h)/this._scale;t._animateZoom(n,h,i,l)},_getScaleOrigin:function(){var t=this._centerOffset.subtract(this._delta).divideBy(this._scale);return this._startCenter.add(t)}}),o.Map.addInitHook("addHandler","touchZoom",o.Map.TouchZoom),o.Map.mergeOptions({tap:!0,tapTolerance:15}),o.Map.Tap=o.Handler.extend({addHooks:function(){o.DomEvent.on(this._map._container,"touchstart",this._onDown,this)},removeHooks:function(){o.DomEvent.off(this._map._container,"touchstart",this._onDown,this)},_onDown:function(t){if(t.touches){if(o.DomEvent.preventDefault(t),this._fireClick=!0,t.touches.length>1)return this._fireClick=!1,void clearTimeout(this._holdTimeout);var i=t.touches[0],n=i.target;this._startPos=this._newPos=new o.Point(i.clientX,i.clientY),n.tagName&&"a"===n.tagName.toLowerCase()&&o.DomUtil.addClass(n,"leaflet-active"),this._holdTimeout=setTimeout(o.bind(function(){this._isTapValid()&&(this._fireClick=!1,this._onUp(),this._simulateEvent("contextmenu",i))},this),1e3),o.DomEvent.on(e,"touchmove",this._onMove,this).on(e,"touchend",this._onUp,this)}},_onUp:function(t){if(clearTimeout(this._holdTimeout),o.DomEvent.off(e,"touchmove",this._onMove,this).off(e,"touchend",this._onUp,this),this._fireClick&&t&&t.changedTouches){var i=t.changedTouches[0],n=i.target;n&&n.tagName&&"a"===n.tagName.toLowerCase()&&o.DomUtil.removeClass(n,"leaflet-active"),this._isTapValid()&&this._simulateEvent("click",i)}},_isTapValid:function(){return this._newPos.distanceTo(this._startPos)<=this._map.options.tapTolerance},_onMove:function(t){var e=t.touches[0];this._newPos=new o.Point(e.clientX,e.clientY)},_simulateEvent:function(i,n){var o=e.createEvent("MouseEvents");o._simulated=!0,n.target._simulatedClick=!0,o.initMouseEvent(i,!0,!0,t,1,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null),n.target.dispatchEvent(o)}}),o.Browser.touch&&!o.Browser.pointer&&o.Map.addInitHook("addHandler","tap",o.Map.Tap),o.Map.mergeOptions({boxZoom:!0}),o.Map.BoxZoom=o.Handler.extend({initialize:function(t){this._map=t,this._container=t._container,this._pane=t._panes.overlayPane,this._moved=!1},addHooks:function(){o.DomEvent.on(this._container,"mousedown",this._onMouseDown,this)},removeHooks:function(){o.DomEvent.off(this._container,"mousedown",this._onMouseDown),this._moved=!1},moved:function(){return this._moved},_onMouseDown:function(t){return this._moved=!1,!t.shiftKey||1!==t.which&&1!==t.button?!1:(o.DomUtil.disableTextSelection(),o.DomUtil.disableImageDrag(),this._startLayerPoint=this._map.mouseEventToLayerPoint(t),void o.DomEvent.on(e,"mousemove",this._onMouseMove,this).on(e,"mouseup",this._onMouseUp,this).on(e,"keydown",this._onKeyDown,this))},_onMouseMove:function(t){this._moved||(this._box=o.DomUtil.create("div","leaflet-zoom-box",this._pane),o.DomUtil.setPosition(this._box,this._startLayerPoint),this._container.style.cursor="crosshair",this._map.fire("boxzoomstart"));var e=this._startLayerPoint,i=this._box,n=this._map.mouseEventToLayerPoint(t),s=n.subtract(e),a=new o.Point(Math.min(n.x,e.x),Math.min(n.y,e.y));o.DomUtil.setPosition(i,a),this._moved=!0,i.style.width=Math.max(0,Math.abs(s.x)-4)+"px",i.style.height=Math.max(0,Math.abs(s.y)-4)+"px"},_finish:function(){this._moved&&(this._pane.removeChild(this._box),this._container.style.cursor=""),o.DomUtil.enableTextSelection(),o.DomUtil.enableImageDrag(),o.DomEvent.off(e,"mousemove",this._onMouseMove).off(e,"mouseup",this._onMouseUp).off(e,"keydown",this._onKeyDown)},_onMouseUp:function(t){this._finish();var e=this._map,i=e.mouseEventToLayerPoint(t);if(!this._startLayerPoint.equals(i)){var n=new o.LatLngBounds(e.layerPointToLatLng(this._startLayerPoint),e.layerPointToLatLng(i));e.fitBounds(n),e.fire("boxzoomend",{boxZoomBounds:n})}},_onKeyDown:function(t){27===t.keyCode&&this._finish()}}),o.Map.addInitHook("addHandler","boxZoom",o.Map.BoxZoom),o.Map.mergeOptions({keyboard:!0,keyboardPanOffset:80,keyboardZoomOffset:1}),o.Map.Keyboard=o.Handler.extend({keyCodes:{left:[37],right:[39],down:[40],up:[38],zoomIn:[187,107,61,171],zoomOut:[189,109,173]},initialize:function(t){this._map=t,this._setPanOffset(t.options.keyboardPanOffset),this._setZoomOffset(t.options.keyboardZoomOffset)},addHooks:function(){var t=this._map._container;-1===t.tabIndex&&(t.tabIndex="0"),o.DomEvent.on(t,"focus",this._onFocus,this).on(t,"blur",this._onBlur,this).on(t,"mousedown",this._onMouseDown,this),this._map.on("focus",this._addHooks,this).on("blur",this._removeHooks,this)},removeHooks:function(){this._removeHooks();var t=this._map._container;o.DomEvent.off(t,"focus",this._onFocus,this).off(t,"blur",this._onBlur,this).off(t,"mousedown",this._onMouseDown,this),this._map.off("focus",this._addHooks,this).off("blur",this._removeHooks,this)},_onMouseDown:function(){if(!this._focused){var i=e.body,n=e.documentElement,o=i.scrollTop||n.scrollTop,s=i.scrollLeft||n.scrollLeft;this._map._container.focus(),t.scrollTo(s,o)}},_onFocus:function(){this._focused=!0,this._map.fire("focus")},_onBlur:function(){this._focused=!1,this._map.fire("blur")},_setPanOffset:function(t){var e,i,n=this._panKeys={},o=this.keyCodes;for(e=0,i=o.left.length;i>e;e++)n[o.left[e]]=[-1*t,0];for(e=0,i=o.right.length;i>e;e++)n[o.right[e]]=[t,0];for(e=0,i=o.down.length;i>e;e++)n[o.down[e]]=[0,t];for(e=0,i=o.up.length;i>e;e++)n[o.up[e]]=[0,-1*t]},_setZoomOffset:function(t){var e,i,n=this._zoomKeys={},o=this.keyCodes;for(e=0,i=o.zoomIn.length;i>e;e++)n[o.zoomIn[e]]=t;for(e=0,i=o.zoomOut.length;i>e;e++)n[o.zoomOut[e]]=-t},_addHooks:function(){o.DomEvent.on(e,"keydown",this._onKeyDown,this)},_removeHooks:function(){o.DomEvent.off(e,"keydown",this._onKeyDown,this)},_onKeyDown:function(t){var e=t.keyCode,i=this._map;if(e in this._panKeys){if(i._panAnim&&i._panAnim._inProgress)return;i.panBy(this._panKeys[e]),i.options.maxBounds&&i.panInsideBounds(i.options.maxBounds)}else{if(!(e in this._zoomKeys))return;i.setZoom(i.getZoom()+this._zoomKeys[e])}o.DomEvent.stop(t)}}),o.Map.addInitHook("addHandler","keyboard",o.Map.Keyboard),o.Handler.MarkerDrag=o.Handler.extend({initialize:function(t){this._marker=t},addHooks:function(){var t=this._marker._icon;this._draggable||(this._draggable=new o.Draggable(t,t)),this._draggable.on("dragstart",this._onDragStart,this).on("drag",this._onDrag,this).on("dragend",this._onDragEnd,this),this._draggable.enable(),o.DomUtil.addClass(this._marker._icon,"leaflet-marker-draggable")},removeHooks:function(){this._draggable.off("dragstart",this._onDragStart,this).off("drag",this._onDrag,this).off("dragend",this._onDragEnd,this),this._draggable.disable(),o.DomUtil.removeClass(this._marker._icon,"leaflet-marker-draggable")},moved:function(){return this._draggable&&this._draggable._moved},_onDragStart:function(){this._marker.closePopup().fire("movestart").fire("dragstart")},_onDrag:function(){var t=this._marker,e=t._shadow,i=o.DomUtil.getPosition(t._icon),n=t._map.layerPointToLatLng(i);e&&o.DomUtil.setPosition(e,i),t._latlng=n,t.fire("move",{latlng:n}).fire("drag")},_onDragEnd:function(t){this._marker.fire("moveend").fire("dragend",t)}}),o.Control=o.Class.extend({options:{position:"topright"},initialize:function(t){o.setOptions(this,t)},getPosition:function(){return this.options.position},setPosition:function(t){var e=this._map;return e&&e.removeControl(this),this.options.position=t,e&&e.addControl(this),this},getContainer:function(){return this._container},addTo:function(t){this._map=t;var e=this._container=this.onAdd(t),i=this.getPosition(),n=t._controlCorners[i];return o.DomUtil.addClass(e,"leaflet-control"),-1!==i.indexOf("bottom")?n.insertBefore(e,n.firstChild):n.appendChild(e),this},removeFrom:function(t){var e=this.getPosition(),i=t._controlCorners[e];return i.removeChild(this._container),this._map=null,this.onRemove&&this.onRemove(t),this},_refocusOnMap:function(){this._map&&this._map.getContainer().focus()}}),o.control=function(t){return new o.Control(t)},o.Map.include({addControl:function(t){return t.addTo(this),this},removeControl:function(t){return t.removeFrom(this),this},_initControlPos:function(){function t(t,s){var a=i+t+" "+i+s;e[t+s]=o.DomUtil.create("div",a,n)}var e=this._controlCorners={},i="leaflet-",n=this._controlContainer=o.DomUtil.create("div",i+"control-container",this._container);t("top","left"),t("top","right"),t("bottom","left"),t("bottom","right")},_clearControlPos:function(){this._container.removeChild(this._controlContainer)}}),o.Control.Zoom=o.Control.extend({options:{position:"topleft",zoomInText:"+",zoomInTitle:"Zoom in",zoomOutText:"-",zoomOutTitle:"Zoom out"},onAdd:function(t){var e="leaflet-control-zoom",i=o.DomUtil.create("div",e+" leaflet-bar");return this._map=t,this._zoomInButton=this._createButton(this.options.zoomInText,this.options.zoomInTitle,e+"-in",i,this._zoomIn,this),this._zoomOutButton=this._createButton(this.options.zoomOutText,this.options.zoomOutTitle,e+"-out",i,this._zoomOut,this),this._updateDisabled(),t.on("zoomend zoomlevelschange",this._updateDisabled,this),i},onRemove:function(t){t.off("zoomend zoomlevelschange",this._updateDisabled,this)},_zoomIn:function(t){this._map.zoomIn(t.shiftKey?3:1)},_zoomOut:function(t){this._map.zoomOut(t.shiftKey?3:1)},_createButton:function(t,e,i,n,s,a){var r=o.DomUtil.create("a",i,n);r.innerHTML=t,r.href="#",r.title=e;var h=o.DomEvent.stopPropagation;return o.DomEvent.on(r,"click",h).on(r,"mousedown",h).on(r,"dblclick",h).on(r,"click",o.DomEvent.preventDefault).on(r,"click",s,a).on(r,"click",this._refocusOnMap,a),r},_updateDisabled:function(){var t=this._map,e="leaflet-disabled";o.DomUtil.removeClass(this._zoomInButton,e),o.DomUtil.removeClass(this._zoomOutButton,e),t._zoom===t.getMinZoom()&&o.DomUtil.addClass(this._zoomOutButton,e),t._zoom===t.getMaxZoom()&&o.DomUtil.addClass(this._zoomInButton,e)}}),o.Map.mergeOptions({zoomControl:!0}),o.Map.addInitHook(function(){this.options.zoomControl&&(this.zoomControl=new o.Control.Zoom,this.addControl(this.zoomControl))}),o.control.zoom=function(t){return new o.Control.Zoom(t)},o.Control.Attribution=o.Control.extend({options:{position:"bottomright",prefix:'<a href="http://leafletjs.com" title="A JS library for interactive maps">Leaflet</a>'},initialize:function(t){o.setOptions(this,t),this._attributions={}},onAdd:function(t){this._container=o.DomUtil.create("div","leaflet-control-attribution"),o.DomEvent.disableClickPropagation(this._container);for(var e in t._layers)t._layers[e].getAttribution&&this.addAttribution(t._layers[e].getAttribution());return t.on("layeradd",this._onLayerAdd,this).on("layerremove",this._onLayerRemove,this),this._update(),this._container},onRemove:function(t){t.off("layeradd",this._onLayerAdd).off("layerremove",this._onLayerRemove)},setPrefix:function(t){return this.options.prefix=t,this._update(),this},addAttribution:function(t){return t?(this._attributions[t]||(this._attributions[t]=0),this._attributions[t]++,this._update(),this):void 0},removeAttribution:function(t){return t?(this._attributions[t]&&(this._attributions[t]--,this._update()),this):void 0},_update:function(){if(this._map){var t=[];for(var e in this._attributions)this._attributions[e]&&t.push(e);var i=[];this.options.prefix&&i.push(this.options.prefix),t.length&&i.push(t.join(", ")),this._container.innerHTML=i.join(" | ")}},_onLayerAdd:function(t){t.layer.getAttribution&&this.addAttribution(t.layer.getAttribution())},_onLayerRemove:function(t){t.layer.getAttribution&&this.removeAttribution(t.layer.getAttribution())}}),o.Map.mergeOptions({attributionControl:!0}),o.Map.addInitHook(function(){this.options.attributionControl&&(this.attributionControl=(new o.Control.Attribution).addTo(this))}),o.control.attribution=function(t){return new o.Control.Attribution(t)},o.Control.Scale=o.Control.extend({options:{position:"bottomleft",maxWidth:100,metric:!0,imperial:!0,updateWhenIdle:!1},onAdd:function(t){this._map=t;var e="leaflet-control-scale",i=o.DomUtil.create("div",e),n=this.options;return this._addScales(n,e,i),t.on(n.updateWhenIdle?"moveend":"move",this._update,this),t.whenReady(this._update,this),i},onRemove:function(t){t.off(this.options.updateWhenIdle?"moveend":"move",this._update,this)},_addScales:function(t,e,i){t.metric&&(this._mScale=o.DomUtil.create("div",e+"-line",i)),t.imperial&&(this._iScale=o.DomUtil.create("div",e+"-line",i))},_update:function(){var t=this._map.getBounds(),e=t.getCenter().lat,i=6378137*Math.PI*Math.cos(e*Math.PI/180),n=i*(t.getNorthEast().lng-t.getSouthWest().lng)/180,o=this._map.getSize(),s=this.options,a=0;o.x>0&&(a=n*(s.maxWidth/o.x)),this._updateScales(s,a)},_updateScales:function(t,e){t.metric&&e&&this._updateMetric(e),t.imperial&&e&&this._updateImperial(e)},_updateMetric:function(t){var e=this._getRoundNum(t);this._mScale.style.width=this._getScaleWidth(e/t)+"px",this._mScale.innerHTML=1e3>e?e+" m":e/1e3+" km"},_updateImperial:function(t){var e,i,n,o=3.2808399*t,s=this._iScale;o>5280?(e=o/5280,i=this._getRoundNum(e),s.style.width=this._getScaleWidth(i/e)+"px",s.innerHTML=i+" mi"):(n=this._getRoundNum(o),s.style.width=this._getScaleWidth(n/o)+"px",s.innerHTML=n+" ft")},_getScaleWidth:function(t){return Math.round(this.options.maxWidth*t)-10},_getRoundNum:function(t){var e=Math.pow(10,(Math.floor(t)+"").length-1),i=t/e;return i=i>=10?10:i>=5?5:i>=3?3:i>=2?2:1,e*i}}),o.control.scale=function(t){return new o.Control.Scale(t)},o.Control.Layers=o.Control.extend({options:{collapsed:!0,position:"topright",autoZIndex:!0},initialize:function(t,e,i){o.setOptions(this,i),this._layers={},this._lastZIndex=0,this._handlingClick=!1;for(var n in t)this._addLayer(t[n],n);for(n in e)this._addLayer(e[n],n,!0)},onAdd:function(t){return this._initLayout(),this._update(),t.on("layeradd",this._onLayerChange,this).on("layerremove",this._onLayerChange,this),this._container},onRemove:function(t){t.off("layeradd",this._onLayerChange,this).off("layerremove",this._onLayerChange,this)},addBaseLayer:function(t,e){return this._addLayer(t,e),this._update(),this},addOverlay:function(t,e){return this._addLayer(t,e,!0),this._update(),this},removeLayer:function(t){var e=o.stamp(t);return delete this._layers[e],this._update(),this},_initLayout:function(){var t="leaflet-control-layers",e=this._container=o.DomUtil.create("div",t);e.setAttribute("aria-haspopup",!0),o.Browser.touch?o.DomEvent.on(e,"click",o.DomEvent.stopPropagation):o.DomEvent.disableClickPropagation(e).disableScrollPropagation(e);var i=this._form=o.DomUtil.create("form",t+"-list");if(this.options.collapsed){o.Browser.android||o.DomEvent.on(e,"mouseover",this._expand,this).on(e,"mouseout",this._collapse,this);var n=this._layersLink=o.DomUtil.create("a",t+"-toggle",e);n.href="#",n.title="Layers",o.Browser.touch?o.DomEvent.on(n,"click",o.DomEvent.stop).on(n,"click",this._expand,this):o.DomEvent.on(n,"focus",this._expand,this),o.DomEvent.on(i,"click",function(){setTimeout(o.bind(this._onInputClick,this),0)},this),this._map.on("click",this._collapse,this)}else this._expand();this._baseLayersList=o.DomUtil.create("div",t+"-base",i),this._separator=o.DomUtil.create("div",t+"-separator",i),this._overlaysList=o.DomUtil.create("div",t+"-overlays",i),e.appendChild(i)},_addLayer:function(t,e,i){var n=o.stamp(t);this._layers[n]={layer:t,name:e,overlay:i},this.options.autoZIndex&&t.setZIndex&&(this._lastZIndex++,t.setZIndex(this._lastZIndex))},_update:function(){if(this._container){this._baseLayersList.innerHTML="",this._overlaysList.innerHTML="";var t,e,i=!1,n=!1;for(t in this._layers)e=this._layers[t],this._addItem(e),n=n||e.overlay,i=i||!e.overlay;this._separator.style.display=n&&i?"":"none"}},_onLayerChange:function(t){var e=this._layers[o.stamp(t.layer)];if(e){this._handlingClick||this._update();var i=e.overlay?"layeradd"===t.type?"overlayadd":"overlayremove":"layeradd"===t.type?"baselayerchange":null;i&&this._map.fire(i,e)}},_createRadioElement:function(t,i){var n='<input type="radio" class="leaflet-control-layers-selector" name="'+t+'"';i&&(n+=' checked="checked"'),n+="/>";var o=e.createElement("div");return o.innerHTML=n,o.firstChild},_addItem:function(t){var i,n=e.createElement("label"),s=this._map.hasLayer(t.layer);t.overlay?(i=e.createElement("input"),i.type="checkbox",i.className="leaflet-control-layers-selector",i.defaultChecked=s):i=this._createRadioElement("leaflet-base-layers",s),i.layerId=o.stamp(t.layer),o.DomEvent.on(i,"click",this._onInputClick,this);var a=e.createElement("span");a.innerHTML=" "+t.name,n.appendChild(i),n.appendChild(a);var r=t.overlay?this._overlaysList:this._baseLayersList;return r.appendChild(n),n},_onInputClick:function(){var t,e,i,n=this._form.getElementsByTagName("input"),o=n.length;for(this._handlingClick=!0,t=0;o>t;t++)e=n[t],i=this._layers[e.layerId],e.checked&&!this._map.hasLayer(i.layer)?this._map.addLayer(i.layer):!e.checked&&this._map.hasLayer(i.layer)&&this._map.removeLayer(i.layer);this._handlingClick=!1,this._refocusOnMap()},_expand:function(){o.DomUtil.addClass(this._container,"leaflet-control-layers-expanded")},_collapse:function(){this._container.className=this._container.className.replace(" leaflet-control-layers-expanded","")}}),o.control.layers=function(t,e,i){return new o.Control.Layers(t,e,i)},o.PosAnimation=o.Class.extend({includes:o.Mixin.Events,run:function(t,e,i,n){this.stop(),this._el=t,this._inProgress=!0,this._newPos=e,this.fire("start"),t.style[o.DomUtil.TRANSITION]="all "+(i||.25)+"s cubic-bezier(0,0,"+(n||.5)+",1)",o.DomEvent.on(t,o.DomUtil.TRANSITION_END,this._onTransitionEnd,this),o.DomUtil.setPosition(t,e),o.Util.falseFn(t.offsetWidth),this._stepTimer=setInterval(o.bind(this._onStep,this),50)},stop:function(){this._inProgress&&(o.DomUtil.setPosition(this._el,this._getPos()),this._onTransitionEnd(),o.Util.falseFn(this._el.offsetWidth))},_onStep:function(){var t=this._getPos();return t?(this._el._leaflet_pos=t,void this.fire("step")):void this._onTransitionEnd()},_transformRe:/([-+]?(?:\d*\.)?\d+)\D*, ([-+]?(?:\d*\.)?\d+)\D*\)/,_getPos:function(){var e,i,n,s=this._el,a=t.getComputedStyle(s);if(o.Browser.any3d){if(n=a[o.DomUtil.TRANSFORM].match(this._transformRe),!n)return;e=parseFloat(n[1]),i=parseFloat(n[2])}else e=parseFloat(a.left),i=parseFloat(a.top);return new o.Point(e,i,!0)},_onTransitionEnd:function(){o.DomEvent.off(this._el,o.DomUtil.TRANSITION_END,this._onTransitionEnd,this),this._inProgress&&(this._inProgress=!1,this._el.style[o.DomUtil.TRANSITION]="",this._el._leaflet_pos=this._newPos,clearInterval(this._stepTimer),this.fire("step").fire("end"))}}),o.Map.include({setView:function(t,e,n){if(e=e===i?this._zoom:this._limitZoom(e),t=this._limitCenter(o.latLng(t),e,this.options.maxBounds),n=n||{},this._panAnim&&this._panAnim.stop(),this._loaded&&!n.reset&&n!==!0){n.animate!==i&&(n.zoom=o.extend({animate:n.animate},n.zoom),n.pan=o.extend({animate:n.animate},n.pan));var s=this._zoom!==e?this._tryAnimatedZoom&&this._tryAnimatedZoom(t,e,n.zoom):this._tryAnimatedPan(t,n.pan);if(s)return clearTimeout(this._sizeTimer),this}return this._resetView(t,e),this},panBy:function(t,e){if(t=o.point(t).round(),e=e||{},!t.x&&!t.y)return this;if(this._panAnim||(this._panAnim=new o.PosAnimation,this._panAnim.on({step:this._onPanTransitionStep,end:this._onPanTransitionEnd},this)),e.noMoveStart||this.fire("movestart"),e.animate!==!1){o.DomUtil.addClass(this._mapPane,"leaflet-pan-anim");var i=this._getMapPanePos().subtract(t);this._panAnim.run(this._mapPane,i,e.duration||.25,e.easeLinearity)}else this._rawPanBy(t),this.fire("move").fire("moveend");return this},_onPanTransitionStep:function(){this.fire("move")},_onPanTransitionEnd:function(){o.DomUtil.removeClass(this._mapPane,"leaflet-pan-anim"),this.fire("moveend")},_tryAnimatedPan:function(t,e){var i=this._getCenterOffset(t)._floor();return(e&&e.animate)===!0||this.getSize().contains(i)?(this.panBy(i,e),!0):!1}}),o.PosAnimation=o.DomUtil.TRANSITION?o.PosAnimation:o.PosAnimation.extend({run:function(t,e,i,n){this.stop(),this._el=t,this._inProgress=!0,this._duration=i||.25,this._easeOutPower=1/Math.max(n||.5,.2),this._startPos=o.DomUtil.getPosition(t),this._offset=e.subtract(this._startPos),this._startTime=+new Date,this.fire("start"),this._animate()},stop:function(){this._inProgress&&(this._step(),this._complete())},_animate:function(){this._animId=o.Util.requestAnimFrame(this._animate,this),this._step()},_step:function(){var t=+new Date-this._startTime,e=1e3*this._duration;e>t?this._runFrame(this._easeOut(t/e)):(this._runFrame(1),this._complete())},_runFrame:function(t){var e=this._startPos.add(this._offset.multiplyBy(t));o.DomUtil.setPosition(this._el,e),this.fire("step")},_complete:function(){o.Util.cancelAnimFrame(this._animId),this._inProgress=!1,this.fire("end")},_easeOut:function(t){return 1-Math.pow(1-t,this._easeOutPower)}}),o.Map.mergeOptions({zoomAnimation:!0,zoomAnimationThreshold:4}),o.DomUtil.TRANSITION&&o.Map.addInitHook(function(){this._zoomAnimated=this.options.zoomAnimation&&o.DomUtil.TRANSITION&&o.Browser.any3d&&!o.Browser.android23&&!o.Browser.mobileOpera,this._zoomAnimated&&o.DomEvent.on(this._mapPane,o.DomUtil.TRANSITION_END,this._catchTransitionEnd,this)}),o.Map.include(o.DomUtil.TRANSITION?{_catchTransitionEnd:function(t){this._animatingZoom&&t.propertyName.indexOf("transform")>=0&&this._onZoomTransitionEnd()},_nothingToAnimate:function(){return!this._container.getElementsByClassName("leaflet-zoom-animated").length},_tryAnimatedZoom:function(t,e,i){if(this._animatingZoom)return!0;if(i=i||{},!this._zoomAnimated||i.animate===!1||this._nothingToAnimate()||Math.abs(e-this._zoom)>this.options.zoomAnimationThreshold)return!1;var n=this.getZoomScale(e),o=this._getCenterOffset(t)._divideBy(1-1/n),s=this._getCenterLayerPoint()._add(o);return i.animate===!0||this.getSize().contains(o)?(this.fire("movestart").fire("zoomstart"),this._animateZoom(t,e,s,n,null,!0),!0):!1},_animateZoom:function(t,e,i,n,s,a,r){r||(this._animatingZoom=!0),o.DomUtil.addClass(this._mapPane,"leaflet-zoom-anim"),this._animateToCenter=t,this._animateToZoom=e,o.Draggable&&(o.Draggable._disabled=!0),o.Util.requestAnimFrame(function(){this.fire("zoomanim",{center:t,zoom:e,origin:i,scale:n,delta:s,backwards:a}),setTimeout(o.bind(this._onZoomTransitionEnd,this),250)},this)},_onZoomTransitionEnd:function(){this._animatingZoom&&(this._animatingZoom=!1,o.DomUtil.removeClass(this._mapPane,"leaflet-zoom-anim"),o.Util.requestAnimFrame(function(){this._resetView(this._animateToCenter,this._animateToZoom,!0,!0),o.Draggable&&(o.Draggable._disabled=!1)},this))}}:{}),o.TileLayer.include({_animateZoom:function(t){this._animating||(this._animating=!0,this._prepareBgBuffer());var e=this._bgBuffer,i=o.DomUtil.TRANSFORM,n=t.delta?o.DomUtil.getTranslateString(t.delta):e.style[i],s=o.DomUtil.getScaleString(t.scale,t.origin);e.style[i]=t.backwards?s+" "+n:n+" "+s},_endZoomAnim:function(){var t=this._tileContainer,e=this._bgBuffer;t.style.visibility="",t.parentNode.appendChild(t),o.Util.falseFn(e.offsetWidth);var i=this._map.getZoom();(i>this.options.maxZoom||i<this.options.minZoom)&&this._clearBgBuffer(),this._animating=!1},_clearBgBuffer:function(){var t=this._map;!t||t._animatingZoom||t.touchZoom._zooming||(this._bgBuffer.innerHTML="",this._bgBuffer.style[o.DomUtil.TRANSFORM]="")},_prepareBgBuffer:function(){var t=this._tileContainer,e=this._bgBuffer,i=this._getLoadedTilesPercentage(e),n=this._getLoadedTilesPercentage(t);return e&&i>.5&&.5>n?(t.style.visibility="hidden",void this._stopLoadingImages(t)):(e.style.visibility="hidden",e.style[o.DomUtil.TRANSFORM]="",this._tileContainer=e,e=this._bgBuffer=t,this._stopLoadingImages(e),void clearTimeout(this._clearBgBufferTimer))},_getLoadedTilesPercentage:function(t){var e,i,n=t.getElementsByTagName("img"),o=0;for(e=0,i=n.length;i>e;e++)n[e].complete&&o++;return o/i},_stopLoadingImages:function(t){var e,i,n,s=Array.prototype.slice.call(t.getElementsByTagName("img"));for(e=0,i=s.length;i>e;e++)n=s[e],n.complete||(n.onload=o.Util.falseFn,n.onerror=o.Util.falseFn,n.src=o.Util.emptyImageUrl,n.parentNode.removeChild(n))}}),o.Map.include({_defaultLocateOptions:{watch:!1,setView:!1,maxZoom:1/0,timeout:1e4,maximumAge:0,enableHighAccuracy:!1},locate:function(t){if(t=this._locateOptions=o.extend(this._defaultLocateOptions,t),!navigator.geolocation)return this._handleGeolocationError({code:0,message:"Geolocation not supported."}),this;var e=o.bind(this._handleGeolocationResponse,this),i=o.bind(this._handleGeolocationError,this);return t.watch?this._locationWatchId=navigator.geolocation.watchPosition(e,i,t):navigator.geolocation.getCurrentPosition(e,i,t),this},stopLocate:function(){return navigator.geolocation&&navigator.geolocation.clearWatch(this._locationWatchId),this._locateOptions&&(this._locateOptions.setView=!1),this},_handleGeolocationError:function(t){var e=t.code,i=t.message||(1===e?"permission denied":2===e?"position unavailable":"timeout");this._locateOptions.setView&&!this._loaded&&this.fitWorld(),this.fire("locationerror",{code:e,message:"Geolocation error: "+i+"."})},_handleGeolocationResponse:function(t){var e=t.coords.latitude,i=t.coords.longitude,n=new o.LatLng(e,i),s=180*t.coords.accuracy/40075017,a=s/Math.cos(o.LatLng.DEG_TO_RAD*e),r=o.latLngBounds([e-s,i-a],[e+s,i+a]),h=this._locateOptions;if(h.setView){var l=Math.min(this.getBoundsZoom(r),h.maxZoom);this.setView(n,l)}var u={latlng:n,bounds:r,timestamp:t.timestamp};for(var c in t.coords)"number"==typeof t.coords[c]&&(u[c]=t.coords[c]);this.fire("locationfound",u)}})}(window,document);
\ No newline at end of file
diff --git a/webapp/org.eclipse.sensinact.studio.webapp.outdoor/webapp/outdoor.html b/webapp/org.eclipse.sensinact.studio.webapp.outdoor/webapp/outdoor.html
new file mode 100644
index 0000000..3ee2f97
--- /dev/null
+++ b/webapp/org.eclipse.sensinact.studio.webapp.outdoor/webapp/outdoor.html
@@ -0,0 +1,31 @@
+<!--
+
+ Copyright (c) 2017 CEA.
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+
+ Contributors:
+ CEA - initial API and implementation and/or initial documentation
+
+-->
+<!DOCTYPE html>
+<html lang="en">
+ <head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+ <title>Outdoor Map</title>
+ <link rel="stylesheet" href="css/leaflet.css" />
+ <link rel="stylesheet" href="css/custom.css" />
+ </head>
+ <body>
+ <div id="map"></div>
+ <div id="image"></div>
+ <div id="notif">DONE</div>
+ <script src="js/jquery-2.2.0.min.js"></script>
+ <script src="js/leaflet.js"></script>
+ <script src="js/custom.js"></script>
+ </body>
+</html>
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact.ide/META-INF/MANIFEST.MF b/xtext/org.eclipse.sensinact.studio.language.sensinact.ide/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..39b21b2
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact.ide/META-INF/MANIFEST.MF
@@ -0,0 +1,14 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: org.eclipse.sensinact.studio.language.sensinact.ide
+Bundle-Vendor: My Company
+Bundle-Version: 1.0.0.qualifier
+Bundle-SymbolicName: org.eclipse.sensinact.studio.language.sensinact.ide; singleton:=true
+Bundle-ActivationPolicy: lazy
+Require-Bundle: org.eclipse.sensinact.studio.language.sensinact,
+ org.eclipse.xtext.ide,
+ org.eclipse.xtext.xbase.ide
+Bundle-RequiredExecutionEnvironment: JavaSE-1.7
+Export-Package: org.eclipse.sensinact.studio.language.ide.contentassist.antlr,
+ org.eclipse.sensinact.studio.language.ide.contentassist.antlr.internal
+
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact.ide/about.html b/xtext/org.eclipse.sensinact.studio.language.sensinact.ide/about.html
new file mode 100644
index 0000000..3b39f88
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact.ide/about.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"><head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 5, 2006</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+
+</body></html>
\ No newline at end of file
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact.ide/build.properties b/xtext/org.eclipse.sensinact.studio.language.sensinact.ide/build.properties
new file mode 100644
index 0000000..c4c7717
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact.ide/build.properties
@@ -0,0 +1,16 @@
+#
+# Copyright (c) 2017 CEA.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+# CEA - initial API and implementation and/or initial documentation
+#
+
+source.. = src/,\
+ src-gen/,\
+ xtend-gen/
+bin.includes = .,\
+ META-INF/
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact.ide/src-gen/org/eclipse/sensinact/studio/language/ide/contentassist/antlr/PartialSensinactContentAssistParser.java b/xtext/org.eclipse.sensinact.studio.language.sensinact.ide/src-gen/org/eclipse/sensinact/studio/language/ide/contentassist/antlr/PartialSensinactContentAssistParser.java
new file mode 100644
index 0000000..fa72c44
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact.ide/src-gen/org/eclipse/sensinact/studio/language/ide/contentassist/antlr/PartialSensinactContentAssistParser.java
@@ -0,0 +1,44 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/*
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.ide.contentassist.antlr;
+
+import java.util.Collection;
+import java.util.Collections;
+import org.eclipse.xtext.AbstractRule;
+import org.eclipse.xtext.ide.editor.contentassist.antlr.FollowElement;
+import org.eclipse.xtext.ide.editor.contentassist.antlr.internal.AbstractInternalContentAssistParser;
+import org.eclipse.xtext.ide.editor.partialEditing.IPartialEditingContentAssistParser;
+import org.eclipse.xtext.util.PolymorphicDispatcher;
+
+public class PartialSensinactContentAssistParser extends SensinactParser implements IPartialEditingContentAssistParser {
+
+ private AbstractRule rule;
+
+ @Override
+ public void initializeFor(AbstractRule rule) {
+ this.rule = rule;
+ }
+
+ @Override
+ protected Collection<FollowElement> getFollowElements(AbstractInternalContentAssistParser parser) {
+ if (rule == null || rule.eIsProxy())
+ return Collections.emptyList();
+ String methodName = "entryRule" + rule.getName();
+ PolymorphicDispatcher<Collection<FollowElement>> dispatcher =
+ new PolymorphicDispatcher<Collection<FollowElement>>(methodName, 0, 0, Collections.singletonList(parser));
+ dispatcher.invoke();
+ return parser.getFollowElements();
+ }
+
+}
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact.ide/src-gen/org/eclipse/sensinact/studio/language/ide/contentassist/antlr/SensinactParser.java b/xtext/org.eclipse.sensinact.studio.language.sensinact.ide/src-gen/org/eclipse/sensinact/studio/language/ide/contentassist/antlr/SensinactParser.java
new file mode 100644
index 0000000..71cd11c
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact.ide/src-gen/org/eclipse/sensinact/studio/language/ide/contentassist/antlr/SensinactParser.java
@@ -0,0 +1,217 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/*
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.ide.contentassist.antlr;
+
+import com.google.inject.Inject;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+import org.antlr.runtime.RecognitionException;
+import org.eclipse.sensinact.studio.language.ide.contentassist.antlr.internal.InternalSensinactParser;
+import org.eclipse.sensinact.studio.language.services.SensinactGrammarAccess;
+import org.eclipse.xtext.AbstractElement;
+import org.eclipse.xtext.ide.editor.contentassist.antlr.AbstractContentAssistParser;
+import org.eclipse.xtext.ide.editor.contentassist.antlr.FollowElement;
+import org.eclipse.xtext.ide.editor.contentassist.antlr.internal.AbstractInternalContentAssistParser;
+
+public class SensinactParser extends AbstractContentAssistParser {
+
+ @Inject
+ private SensinactGrammarAccess grammarAccess;
+
+ private Map<AbstractElement, String> nameMappings;
+
+ @Override
+ protected InternalSensinactParser createParser() {
+ InternalSensinactParser result = new InternalSensinactParser(null);
+ result.setGrammarAccess(grammarAccess);
+ return result;
+ }
+
+ @Override
+ protected String getRuleName(AbstractElement element) {
+ if (nameMappings == null) {
+ nameMappings = new HashMap<AbstractElement, String>() {
+ private static final long serialVersionUID = 1L;
+ {
+ put(grammarAccess.getNUMBERAccess().getAlternatives(), "rule__NUMBER__Alternatives");
+ put(grammarAccess.getDSL_REFAccess().getAlternatives(), "rule__DSL_REF__Alternatives");
+ put(grammarAccess.getDSL_CEP_STATEMENTAccess().getOperationAlternatives_3_0(), "rule__DSL_CEP_STATEMENT__OperationAlternatives_3_0");
+ put(grammarAccess.getDSL_CEP_DURATIONAccess().getUnitsAlternatives_0(), "rule__DSL_CEP_DURATION__UnitsAlternatives_0");
+ put(grammarAccess.getDSL_ResourceActionAccess().getActiontypeAlternatives_3_0(), "rule__DSL_ResourceAction__ActiontypeAlternatives_3_0");
+ put(grammarAccess.getDSL_Expression_DiffEqualAccess().getAlternatives_1(), "rule__DSL_Expression_DiffEqual__Alternatives_1");
+ put(grammarAccess.getDSL_Expression_CompareAccess().getAlternatives_1(), "rule__DSL_Expression_Compare__Alternatives_1");
+ put(grammarAccess.getDSL_Expression_PlusMinusAccess().getAlternatives_1(), "rule__DSL_Expression_PlusMinus__Alternatives_1");
+ put(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getAlternatives_1(), "rule__DSL_Expression_MultiplicationDivision__Alternatives_1");
+ put(grammarAccess.getDSL_Expression_UnaryAccess().getAlternatives(), "rule__DSL_Expression_Unary__Alternatives");
+ put(grammarAccess.getSensinactAccess().getGroup(), "rule__Sensinact__Group__0");
+ put(grammarAccess.getDSL_SENSINACTAccess().getGroup(), "rule__DSL_SENSINACT__Group__0");
+ put(grammarAccess.getDSL_ResourceAccess().getGroup(), "rule__DSL_Resource__Group__0");
+ put(grammarAccess.getDSL_OnAccess().getGroup(), "rule__DSL_On__Group__0");
+ put(grammarAccess.getDSL_OnAccess().getGroup_2(), "rule__DSL_On__Group_2__0");
+ put(grammarAccess.getDSL_ECA_STATEMENTAccess().getGroup(), "rule__DSL_ECA_STATEMENT__Group__0");
+ put(grammarAccess.getDSL_IfDoAccess().getGroup(), "rule__DSL_IfDo__Group__0");
+ put(grammarAccess.getDSL_ElseIfDoAccess().getGroup(), "rule__DSL_ElseIfDo__Group__0");
+ put(grammarAccess.getDSL_ElseDoAccess().getGroup(), "rule__DSL_ElseDo__Group__0");
+ put(grammarAccess.getNUMBERAccess().getGroup_1(), "rule__NUMBER__Group_1__0");
+ put(grammarAccess.getEXTENDED_IDAccess().getGroup(), "rule__EXTENDED_ID__Group__0");
+ put(grammarAccess.getEXTENDED_IDAccess().getGroup_1(), "rule__EXTENDED_ID__Group_1__0");
+ put(grammarAccess.getDSL_REF_CONDITIONAccess().getGroup(), "rule__DSL_REF_CONDITION__Group__0");
+ put(grammarAccess.getDSL_CEP_STATEMENTAccess().getGroup(), "rule__DSL_CEP_STATEMENT__Group__0");
+ put(grammarAccess.getDSL_CEP_AFTERAccess().getGroup(), "rule__DSL_CEP_AFTER__Group__0");
+ put(grammarAccess.getDSL_CEP_AFTERAccess().getGroup_6(), "rule__DSL_CEP_AFTER__Group_6__0");
+ put(grammarAccess.getDSL_CEP_BEFOREAccess().getGroup(), "rule__DSL_CEP_BEFORE__Group__0");
+ put(grammarAccess.getDSL_CEP_BEFOREAccess().getGroup_6(), "rule__DSL_CEP_BEFORE__Group_6__0");
+ put(grammarAccess.getDSL_CEP_COINCIDEAccess().getGroup(), "rule__DSL_CEP_COINCIDE__Group__0");
+ put(grammarAccess.getDSL_CEP_MINAccess().getGroup(), "rule__DSL_CEP_MIN__Group__0");
+ put(grammarAccess.getDSL_CEP_MAXAccess().getGroup(), "rule__DSL_CEP_MAX__Group__0");
+ put(grammarAccess.getDSL_CEP_AVGAccess().getGroup(), "rule__DSL_CEP_AVG__Group__0");
+ put(grammarAccess.getDSL_CEP_SUMAccess().getGroup(), "rule__DSL_CEP_SUM__Group__0");
+ put(grammarAccess.getDSL_CEP_COUNTAccess().getGroup(), "rule__DSL_CEP_COUNT__Group__0");
+ put(grammarAccess.getDSL_CEP_DURATION_MINAccess().getGroup(), "rule__DSL_CEP_DURATION_MIN__Group__0");
+ put(grammarAccess.getDSL_CEP_DURATION_SECAccess().getGroup(), "rule__DSL_CEP_DURATION_SEC__Group__0");
+ put(grammarAccess.getDSL_ListActionsAccess().getGroup(), "rule__DSL_ListActions__Group__0");
+ put(grammarAccess.getDSL_ListActionsAccess().getGroup_1(), "rule__DSL_ListActions__Group_1__0");
+ put(grammarAccess.getDSL_ResourceActionAccess().getGroup(), "rule__DSL_ResourceAction__Group__0");
+ put(grammarAccess.getDSL_ResourceActionAccess().getGroup_0(), "rule__DSL_ResourceAction__Group_0__0");
+ put(grammarAccess.getDSL_ListParamAccess().getGroup(), "rule__DSL_ListParam__Group__0");
+ put(grammarAccess.getDSL_ListParamAccess().getGroup_1(), "rule__DSL_ListParam__Group_1__0");
+ put(grammarAccess.getDSL_Expression_OrAccess().getGroup(), "rule__DSL_Expression_Or__Group__0");
+ put(grammarAccess.getDSL_Expression_OrAccess().getGroup_1(), "rule__DSL_Expression_Or__Group_1__0");
+ put(grammarAccess.getDSL_Expression_AndAccess().getGroup(), "rule__DSL_Expression_And__Group__0");
+ put(grammarAccess.getDSL_Expression_AndAccess().getGroup_1(), "rule__DSL_Expression_And__Group_1__0");
+ put(grammarAccess.getDSL_Expression_DiffEqualAccess().getGroup(), "rule__DSL_Expression_DiffEqual__Group__0");
+ put(grammarAccess.getDSL_Expression_DiffEqualAccess().getGroup_1_0(), "rule__DSL_Expression_DiffEqual__Group_1_0__0");
+ put(grammarAccess.getDSL_Expression_DiffEqualAccess().getGroup_1_1(), "rule__DSL_Expression_DiffEqual__Group_1_1__0");
+ put(grammarAccess.getDSL_Expression_CompareAccess().getGroup(), "rule__DSL_Expression_Compare__Group__0");
+ put(grammarAccess.getDSL_Expression_CompareAccess().getGroup_1_0(), "rule__DSL_Expression_Compare__Group_1_0__0");
+ put(grammarAccess.getDSL_Expression_CompareAccess().getGroup_1_1(), "rule__DSL_Expression_Compare__Group_1_1__0");
+ put(grammarAccess.getDSL_Expression_CompareAccess().getGroup_1_2(), "rule__DSL_Expression_Compare__Group_1_2__0");
+ put(grammarAccess.getDSL_Expression_CompareAccess().getGroup_1_3(), "rule__DSL_Expression_Compare__Group_1_3__0");
+ put(grammarAccess.getDSL_Expression_PlusMinusAccess().getGroup(), "rule__DSL_Expression_PlusMinus__Group__0");
+ put(grammarAccess.getDSL_Expression_PlusMinusAccess().getGroup_1_0(), "rule__DSL_Expression_PlusMinus__Group_1_0__0");
+ put(grammarAccess.getDSL_Expression_PlusMinusAccess().getGroup_1_1(), "rule__DSL_Expression_PlusMinus__Group_1_1__0");
+ put(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getGroup(), "rule__DSL_Expression_MultiplicationDivision__Group__0");
+ put(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getGroup_1_0(), "rule__DSL_Expression_MultiplicationDivision__Group_1_0__0");
+ put(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getGroup_1_1(), "rule__DSL_Expression_MultiplicationDivision__Group_1_1__0");
+ put(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getGroup_1_2(), "rule__DSL_Expression_MultiplicationDivision__Group_1_2__0");
+ put(grammarAccess.getDSL_Expression_UnaryAccess().getGroup_0(), "rule__DSL_Expression_Unary__Group_0__0");
+ put(grammarAccess.getDSL_Expression_UnaryAccess().getGroup_1(), "rule__DSL_Expression_Unary__Group_1__0");
+ put(grammarAccess.getDSL_Expression_UnaryAccess().getGroup_2(), "rule__DSL_Expression_Unary__Group_2__0");
+ put(grammarAccess.getDSL_Expression_UnaryAccess().getGroup_3(), "rule__DSL_Expression_Unary__Group_3__0");
+ put(grammarAccess.getDSL_Expression_UnaryAccess().getGroup_4(), "rule__DSL_Expression_Unary__Group_4__0");
+ put(grammarAccess.getDSL_Expression_UnaryAccess().getGroup_5(), "rule__DSL_Expression_Unary__Group_5__0");
+ put(grammarAccess.getSensinactAccess().getEcaAssignment_1(), "rule__Sensinact__EcaAssignment_1");
+ put(grammarAccess.getDSL_SENSINACTAccess().getResourcesAssignment_0(), "rule__DSL_SENSINACT__ResourcesAssignment_0");
+ put(grammarAccess.getDSL_SENSINACTAccess().getCepAssignment_1(), "rule__DSL_SENSINACT__CepAssignment_1");
+ put(grammarAccess.getDSL_SENSINACTAccess().getOnAssignment_2(), "rule__DSL_SENSINACT__OnAssignment_2");
+ put(grammarAccess.getDSL_SENSINACTAccess().getEcaAssignment_3(), "rule__DSL_SENSINACT__EcaAssignment_3");
+ put(grammarAccess.getDSL_ResourceAccess().getNameAssignment_1(), "rule__DSL_Resource__NameAssignment_1");
+ put(grammarAccess.getDSL_ResourceAccess().getGatewayIDAssignment_4(), "rule__DSL_Resource__GatewayIDAssignment_4");
+ put(grammarAccess.getDSL_ResourceAccess().getDeviceIDAssignment_6(), "rule__DSL_Resource__DeviceIDAssignment_6");
+ put(grammarAccess.getDSL_ResourceAccess().getServiceIDAssignment_8(), "rule__DSL_Resource__ServiceIDAssignment_8");
+ put(grammarAccess.getDSL_ResourceAccess().getResourceIDAssignment_10(), "rule__DSL_Resource__ResourceIDAssignment_10");
+ put(grammarAccess.getDSL_OnAccess().getTriggersAssignment_1(), "rule__DSL_On__TriggersAssignment_1");
+ put(grammarAccess.getDSL_OnAccess().getTriggersAssignment_2_1(), "rule__DSL_On__TriggersAssignment_2_1");
+ put(grammarAccess.getDSL_ECA_STATEMENTAccess().getIfdoAssignment_0(), "rule__DSL_ECA_STATEMENT__IfdoAssignment_0");
+ put(grammarAccess.getDSL_ECA_STATEMENTAccess().getElseIfdoAssignment_1(), "rule__DSL_ECA_STATEMENT__ElseIfdoAssignment_1");
+ put(grammarAccess.getDSL_ECA_STATEMENTAccess().getElsedoAssignment_2(), "rule__DSL_ECA_STATEMENT__ElsedoAssignment_2");
+ put(grammarAccess.getDSL_IfDoAccess().getConditionAssignment_1(), "rule__DSL_IfDo__ConditionAssignment_1");
+ put(grammarAccess.getDSL_IfDoAccess().getActionsAssignment_3(), "rule__DSL_IfDo__ActionsAssignment_3");
+ put(grammarAccess.getDSL_ElseIfDoAccess().getConditionAssignment_1(), "rule__DSL_ElseIfDo__ConditionAssignment_1");
+ put(grammarAccess.getDSL_ElseIfDoAccess().getActionsAssignment_3(), "rule__DSL_ElseIfDo__ActionsAssignment_3");
+ put(grammarAccess.getDSL_ElseDoAccess().getActionsAssignment_1(), "rule__DSL_ElseDo__ActionsAssignment_1");
+ put(grammarAccess.getDSL_REF_CONDITIONAccess().getRefAssignment_0(), "rule__DSL_REF_CONDITION__RefAssignment_0");
+ put(grammarAccess.getDSL_CEP_STATEMENTAccess().getNameAssignment_1(), "rule__DSL_CEP_STATEMENT__NameAssignment_1");
+ put(grammarAccess.getDSL_CEP_STATEMENTAccess().getOperationAssignment_3(), "rule__DSL_CEP_STATEMENT__OperationAssignment_3");
+ put(grammarAccess.getDSL_CEP_AFTERAccess().getRef1Assignment_2(), "rule__DSL_CEP_AFTER__Ref1Assignment_2");
+ put(grammarAccess.getDSL_CEP_AFTERAccess().getRef2Assignment_4(), "rule__DSL_CEP_AFTER__Ref2Assignment_4");
+ put(grammarAccess.getDSL_CEP_AFTERAccess().getStartAssignment_6_0(), "rule__DSL_CEP_AFTER__StartAssignment_6_0");
+ put(grammarAccess.getDSL_CEP_AFTERAccess().getEndAssignment_7(), "rule__DSL_CEP_AFTER__EndAssignment_7");
+ put(grammarAccess.getDSL_CEP_BEFOREAccess().getRef1Assignment_2(), "rule__DSL_CEP_BEFORE__Ref1Assignment_2");
+ put(grammarAccess.getDSL_CEP_BEFOREAccess().getRef2Assignment_4(), "rule__DSL_CEP_BEFORE__Ref2Assignment_4");
+ put(grammarAccess.getDSL_CEP_BEFOREAccess().getStartAssignment_6_0(), "rule__DSL_CEP_BEFORE__StartAssignment_6_0");
+ put(grammarAccess.getDSL_CEP_BEFOREAccess().getEndAssignment_7(), "rule__DSL_CEP_BEFORE__EndAssignment_7");
+ put(grammarAccess.getDSL_CEP_COINCIDEAccess().getRef1Assignment_2(), "rule__DSL_CEP_COINCIDE__Ref1Assignment_2");
+ put(grammarAccess.getDSL_CEP_COINCIDEAccess().getRef2Assignment_4(), "rule__DSL_CEP_COINCIDE__Ref2Assignment_4");
+ put(grammarAccess.getDSL_CEP_COINCIDEAccess().getWindowAssignment_6(), "rule__DSL_CEP_COINCIDE__WindowAssignment_6");
+ put(grammarAccess.getDSL_CEP_MINAccess().getRefAssignment_2(), "rule__DSL_CEP_MIN__RefAssignment_2");
+ put(grammarAccess.getDSL_CEP_MINAccess().getWindowAssignment_4(), "rule__DSL_CEP_MIN__WindowAssignment_4");
+ put(grammarAccess.getDSL_CEP_MAXAccess().getRefAssignment_2(), "rule__DSL_CEP_MAX__RefAssignment_2");
+ put(grammarAccess.getDSL_CEP_MAXAccess().getWindowAssignment_4(), "rule__DSL_CEP_MAX__WindowAssignment_4");
+ put(grammarAccess.getDSL_CEP_AVGAccess().getRefAssignment_2(), "rule__DSL_CEP_AVG__RefAssignment_2");
+ put(grammarAccess.getDSL_CEP_AVGAccess().getWindowAssignment_4(), "rule__DSL_CEP_AVG__WindowAssignment_4");
+ put(grammarAccess.getDSL_CEP_SUMAccess().getRefAssignment_2(), "rule__DSL_CEP_SUM__RefAssignment_2");
+ put(grammarAccess.getDSL_CEP_SUMAccess().getWindowAssignment_4(), "rule__DSL_CEP_SUM__WindowAssignment_4");
+ put(grammarAccess.getDSL_CEP_COUNTAccess().getRefAssignment_2(), "rule__DSL_CEP_COUNT__RefAssignment_2");
+ put(grammarAccess.getDSL_CEP_COUNTAccess().getWindowAssignment_4(), "rule__DSL_CEP_COUNT__WindowAssignment_4");
+ put(grammarAccess.getDSL_CEP_DURATIONAccess().getUnitsAssignment(), "rule__DSL_CEP_DURATION__UnitsAssignment");
+ put(grammarAccess.getDSL_CEP_DURATION_MINAccess().getMinAssignment_0(), "rule__DSL_CEP_DURATION_MIN__MinAssignment_0");
+ put(grammarAccess.getDSL_CEP_DURATION_SECAccess().getSecAssignment_0(), "rule__DSL_CEP_DURATION_SEC__SecAssignment_0");
+ put(grammarAccess.getDSL_ListActionsAccess().getActionListAssignment_0(), "rule__DSL_ListActions__ActionListAssignment_0");
+ put(grammarAccess.getDSL_ListActionsAccess().getActionListAssignment_1_1(), "rule__DSL_ListActions__ActionListAssignment_1_1");
+ put(grammarAccess.getDSL_ResourceActionAccess().getVariableAssignment_0_0(), "rule__DSL_ResourceAction__VariableAssignment_0_0");
+ put(grammarAccess.getDSL_ResourceActionAccess().getRefAssignment_1(), "rule__DSL_ResourceAction__RefAssignment_1");
+ put(grammarAccess.getDSL_ResourceActionAccess().getActiontypeAssignment_3(), "rule__DSL_ResourceAction__ActiontypeAssignment_3");
+ put(grammarAccess.getDSL_ResourceActionAccess().getListParamAssignment_5(), "rule__DSL_ResourceAction__ListParamAssignment_5");
+ put(grammarAccess.getDSL_ListParamAccess().getParamAssignment_0(), "rule__DSL_ListParam__ParamAssignment_0");
+ put(grammarAccess.getDSL_ListParamAccess().getParamAssignment_1_1(), "rule__DSL_ListParam__ParamAssignment_1_1");
+ put(grammarAccess.getDSL_Expression_OrAccess().getRightAssignment_1_2(), "rule__DSL_Expression_Or__RightAssignment_1_2");
+ put(grammarAccess.getDSL_Expression_AndAccess().getRightAssignment_1_2(), "rule__DSL_Expression_And__RightAssignment_1_2");
+ put(grammarAccess.getDSL_Expression_DiffEqualAccess().getRightAssignment_1_0_2(), "rule__DSL_Expression_DiffEqual__RightAssignment_1_0_2");
+ put(grammarAccess.getDSL_Expression_DiffEqualAccess().getRightAssignment_1_1_2(), "rule__DSL_Expression_DiffEqual__RightAssignment_1_1_2");
+ put(grammarAccess.getDSL_Expression_CompareAccess().getRightAssignment_1_0_2(), "rule__DSL_Expression_Compare__RightAssignment_1_0_2");
+ put(grammarAccess.getDSL_Expression_CompareAccess().getRightAssignment_1_1_2(), "rule__DSL_Expression_Compare__RightAssignment_1_1_2");
+ put(grammarAccess.getDSL_Expression_CompareAccess().getRightAssignment_1_2_2(), "rule__DSL_Expression_Compare__RightAssignment_1_2_2");
+ put(grammarAccess.getDSL_Expression_CompareAccess().getRightAssignment_1_3_2(), "rule__DSL_Expression_Compare__RightAssignment_1_3_2");
+ put(grammarAccess.getDSL_Expression_PlusMinusAccess().getRightAssignment_1_0_2(), "rule__DSL_Expression_PlusMinus__RightAssignment_1_0_2");
+ put(grammarAccess.getDSL_Expression_PlusMinusAccess().getRightAssignment_1_1_2(), "rule__DSL_Expression_PlusMinus__RightAssignment_1_1_2");
+ put(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getRightAssignment_1_0_2(), "rule__DSL_Expression_MultiplicationDivision__RightAssignment_1_0_2");
+ put(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getRightAssignment_1_1_2(), "rule__DSL_Expression_MultiplicationDivision__RightAssignment_1_1_2");
+ put(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getRightAssignment_1_2_2(), "rule__DSL_Expression_MultiplicationDivision__RightAssignment_1_2_2");
+ put(grammarAccess.getDSL_Expression_UnaryAccess().getValueAssignment_0_1(), "rule__DSL_Expression_Unary__ValueAssignment_0_1");
+ put(grammarAccess.getDSL_Expression_UnaryAccess().getValueAssignment_1_1(), "rule__DSL_Expression_Unary__ValueAssignment_1_1");
+ put(grammarAccess.getDSL_Expression_UnaryAccess().getValueAssignment_2_1(), "rule__DSL_Expression_Unary__ValueAssignment_2_1");
+ put(grammarAccess.getDSL_Expression_UnaryAccess().getValueAssignment_3_1(), "rule__DSL_Expression_Unary__ValueAssignment_3_1");
+ put(grammarAccess.getDSL_Expression_UnaryAccess().getExpAssignment_5_2(), "rule__DSL_Expression_Unary__ExpAssignment_5_2");
+ }
+ };
+ }
+ return nameMappings.get(element);
+ }
+
+ @Override
+ protected Collection<FollowElement> getFollowElements(AbstractInternalContentAssistParser parser) {
+ try {
+ InternalSensinactParser typedParser = (InternalSensinactParser) parser;
+ typedParser.entryRuleSensinact();
+ return typedParser.getFollowElements();
+ } catch(RecognitionException ex) {
+ throw new RuntimeException(ex);
+ }
+ }
+
+ @Override
+ protected String[] getInitialHiddenTokens() {
+ return new String[] { "RULE_WS", "RULE_ML_COMMENT", "RULE_SL_COMMENT" };
+ }
+
+ public SensinactGrammarAccess getGrammarAccess() {
+ return this.grammarAccess;
+ }
+
+ public void setGrammarAccess(SensinactGrammarAccess grammarAccess) {
+ this.grammarAccess = grammarAccess;
+ }
+}
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact.ide/src-gen/org/eclipse/sensinact/studio/language/ide/contentassist/antlr/internal/InternalSensinact.g b/xtext/org.eclipse.sensinact.studio.language.sensinact.ide/src-gen/org/eclipse/sensinact/studio/language/ide/contentassist/antlr/internal/InternalSensinact.g
new file mode 100644
index 0000000..e2ad158
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact.ide/src-gen/org/eclipse/sensinact/studio/language/ide/contentassist/antlr/internal/InternalSensinact.g
@@ -0,0 +1,7679 @@
+/*
+ * generated by Xtext 2.9.1
+ */
+grammar InternalSensinact;
+
+options {
+ superClass=AbstractInternalContentAssistParser;
+}
+
+@lexer::header {
+package org.eclipse.sensinact.studio.language.ide.contentassist.antlr.internal;
+
+// Hack: Use our own Lexer superclass by means of import.
+// Currently there is no other way to specify the superclass for the lexer.
+import org.eclipse.xtext.ide.editor.contentassist.antlr.internal.Lexer;
+}
+
+@parser::header {
+package org.eclipse.sensinact.studio.language.ide.contentassist.antlr.internal;
+
+import java.io.InputStream;
+import org.eclipse.xtext.*;
+import org.eclipse.xtext.parser.*;
+import org.eclipse.xtext.parser.impl.*;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.xtext.parser.antlr.XtextTokenStream;
+import org.eclipse.xtext.parser.antlr.XtextTokenStream.HiddenTokens;
+import org.eclipse.xtext.ide.editor.contentassist.antlr.internal.AbstractInternalContentAssistParser;
+import org.eclipse.xtext.ide.editor.contentassist.antlr.internal.DFA;
+import org.eclipse.sensinact.studio.language.services.SensinactGrammarAccess;
+
+}
+@parser::members {
+ private SensinactGrammarAccess grammarAccess;
+
+ public void setGrammarAccess(SensinactGrammarAccess grammarAccess) {
+ this.grammarAccess = grammarAccess;
+ }
+
+ @Override
+ protected Grammar getGrammar() {
+ return grammarAccess.getGrammar();
+ }
+
+ @Override
+ protected String getValueForTokenName(String tokenName) {
+ return tokenName;
+ }
+}
+
+// Entry rule entryRuleSensinact
+entryRuleSensinact
+:
+{ before(grammarAccess.getSensinactRule()); }
+ ruleSensinact
+{ after(grammarAccess.getSensinactRule()); }
+ EOF
+;
+
+// Rule Sensinact
+ruleSensinact
+ @init {
+ int stackSize = keepStackSize();
+ }
+ :
+ (
+ { before(grammarAccess.getSensinactAccess().getGroup()); }
+ (rule__Sensinact__Group__0)
+ { after(grammarAccess.getSensinactAccess().getGroup()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleDSL_SENSINACT
+entryRuleDSL_SENSINACT
+:
+{ before(grammarAccess.getDSL_SENSINACTRule()); }
+ ruleDSL_SENSINACT
+{ after(grammarAccess.getDSL_SENSINACTRule()); }
+ EOF
+;
+
+// Rule DSL_SENSINACT
+ruleDSL_SENSINACT
+ @init {
+ int stackSize = keepStackSize();
+ }
+ :
+ (
+ { before(grammarAccess.getDSL_SENSINACTAccess().getGroup()); }
+ (rule__DSL_SENSINACT__Group__0)
+ { after(grammarAccess.getDSL_SENSINACTAccess().getGroup()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleDSL_Resource
+entryRuleDSL_Resource
+:
+{ before(grammarAccess.getDSL_ResourceRule()); }
+ ruleDSL_Resource
+{ after(grammarAccess.getDSL_ResourceRule()); }
+ EOF
+;
+
+// Rule DSL_Resource
+ruleDSL_Resource
+ @init {
+ int stackSize = keepStackSize();
+ }
+ :
+ (
+ { before(grammarAccess.getDSL_ResourceAccess().getGroup()); }
+ (rule__DSL_Resource__Group__0)
+ { after(grammarAccess.getDSL_ResourceAccess().getGroup()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleDSL_On
+entryRuleDSL_On
+:
+{ before(grammarAccess.getDSL_OnRule()); }
+ ruleDSL_On
+{ after(grammarAccess.getDSL_OnRule()); }
+ EOF
+;
+
+// Rule DSL_On
+ruleDSL_On
+ @init {
+ int stackSize = keepStackSize();
+ }
+ :
+ (
+ { before(grammarAccess.getDSL_OnAccess().getGroup()); }
+ (rule__DSL_On__Group__0)
+ { after(grammarAccess.getDSL_OnAccess().getGroup()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleDSL_ECA_STATEMENT
+entryRuleDSL_ECA_STATEMENT
+:
+{ before(grammarAccess.getDSL_ECA_STATEMENTRule()); }
+ ruleDSL_ECA_STATEMENT
+{ after(grammarAccess.getDSL_ECA_STATEMENTRule()); }
+ EOF
+;
+
+// Rule DSL_ECA_STATEMENT
+ruleDSL_ECA_STATEMENT
+ @init {
+ int stackSize = keepStackSize();
+ }
+ :
+ (
+ { before(grammarAccess.getDSL_ECA_STATEMENTAccess().getGroup()); }
+ (rule__DSL_ECA_STATEMENT__Group__0)
+ { after(grammarAccess.getDSL_ECA_STATEMENTAccess().getGroup()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleDSL_IfDo
+entryRuleDSL_IfDo
+:
+{ before(grammarAccess.getDSL_IfDoRule()); }
+ ruleDSL_IfDo
+{ after(grammarAccess.getDSL_IfDoRule()); }
+ EOF
+;
+
+// Rule DSL_IfDo
+ruleDSL_IfDo
+ @init {
+ int stackSize = keepStackSize();
+ }
+ :
+ (
+ { before(grammarAccess.getDSL_IfDoAccess().getGroup()); }
+ (rule__DSL_IfDo__Group__0)
+ { after(grammarAccess.getDSL_IfDoAccess().getGroup()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleDSL_ElseIfDo
+entryRuleDSL_ElseIfDo
+:
+{ before(grammarAccess.getDSL_ElseIfDoRule()); }
+ ruleDSL_ElseIfDo
+{ after(grammarAccess.getDSL_ElseIfDoRule()); }
+ EOF
+;
+
+// Rule DSL_ElseIfDo
+ruleDSL_ElseIfDo
+ @init {
+ int stackSize = keepStackSize();
+ }
+ :
+ (
+ { before(grammarAccess.getDSL_ElseIfDoAccess().getGroup()); }
+ (rule__DSL_ElseIfDo__Group__0)
+ { after(grammarAccess.getDSL_ElseIfDoAccess().getGroup()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleDSL_ElseDo
+entryRuleDSL_ElseDo
+:
+{ before(grammarAccess.getDSL_ElseDoRule()); }
+ ruleDSL_ElseDo
+{ after(grammarAccess.getDSL_ElseDoRule()); }
+ EOF
+;
+
+// Rule DSL_ElseDo
+ruleDSL_ElseDo
+ @init {
+ int stackSize = keepStackSize();
+ }
+ :
+ (
+ { before(grammarAccess.getDSL_ElseDoAccess().getGroup()); }
+ (rule__DSL_ElseDo__Group__0)
+ { after(grammarAccess.getDSL_ElseDoAccess().getGroup()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleNUMBER
+entryRuleNUMBER
+:
+{ before(grammarAccess.getNUMBERRule()); }
+ ruleNUMBER
+{ after(grammarAccess.getNUMBERRule()); }
+ EOF
+;
+
+// Rule NUMBER
+ruleNUMBER
+ @init {
+ int stackSize = keepStackSize();
+ }
+ :
+ (
+ { before(grammarAccess.getNUMBERAccess().getAlternatives()); }
+ (rule__NUMBER__Alternatives)
+ { after(grammarAccess.getNUMBERAccess().getAlternatives()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleEXTENDED_ID
+entryRuleEXTENDED_ID
+:
+{ before(grammarAccess.getEXTENDED_IDRule()); }
+ ruleEXTENDED_ID
+{ after(grammarAccess.getEXTENDED_IDRule()); }
+ EOF
+;
+
+// Rule EXTENDED_ID
+ruleEXTENDED_ID
+ @init {
+ int stackSize = keepStackSize();
+ }
+ :
+ (
+ { before(grammarAccess.getEXTENDED_IDAccess().getGroup()); }
+ (rule__EXTENDED_ID__Group__0)
+ { after(grammarAccess.getEXTENDED_IDAccess().getGroup()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleDSL_REF_CONDITION
+entryRuleDSL_REF_CONDITION
+:
+{ before(grammarAccess.getDSL_REF_CONDITIONRule()); }
+ ruleDSL_REF_CONDITION
+{ after(grammarAccess.getDSL_REF_CONDITIONRule()); }
+ EOF
+;
+
+// Rule DSL_REF_CONDITION
+ruleDSL_REF_CONDITION
+ @init {
+ int stackSize = keepStackSize();
+ }
+ :
+ (
+ { before(grammarAccess.getDSL_REF_CONDITIONAccess().getGroup()); }
+ (rule__DSL_REF_CONDITION__Group__0)
+ { after(grammarAccess.getDSL_REF_CONDITIONAccess().getGroup()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleDSL_CEP_STATEMENT
+entryRuleDSL_CEP_STATEMENT
+:
+{ before(grammarAccess.getDSL_CEP_STATEMENTRule()); }
+ ruleDSL_CEP_STATEMENT
+{ after(grammarAccess.getDSL_CEP_STATEMENTRule()); }
+ EOF
+;
+
+// Rule DSL_CEP_STATEMENT
+ruleDSL_CEP_STATEMENT
+ @init {
+ int stackSize = keepStackSize();
+ }
+ :
+ (
+ { before(grammarAccess.getDSL_CEP_STATEMENTAccess().getGroup()); }
+ (rule__DSL_CEP_STATEMENT__Group__0)
+ { after(grammarAccess.getDSL_CEP_STATEMENTAccess().getGroup()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleDSL_CEP_AFTER
+entryRuleDSL_CEP_AFTER
+:
+{ before(grammarAccess.getDSL_CEP_AFTERRule()); }
+ ruleDSL_CEP_AFTER
+{ after(grammarAccess.getDSL_CEP_AFTERRule()); }
+ EOF
+;
+
+// Rule DSL_CEP_AFTER
+ruleDSL_CEP_AFTER
+ @init {
+ int stackSize = keepStackSize();
+ }
+ :
+ (
+ { before(grammarAccess.getDSL_CEP_AFTERAccess().getGroup()); }
+ (rule__DSL_CEP_AFTER__Group__0)
+ { after(grammarAccess.getDSL_CEP_AFTERAccess().getGroup()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleDSL_CEP_BEFORE
+entryRuleDSL_CEP_BEFORE
+:
+{ before(grammarAccess.getDSL_CEP_BEFORERule()); }
+ ruleDSL_CEP_BEFORE
+{ after(grammarAccess.getDSL_CEP_BEFORERule()); }
+ EOF
+;
+
+// Rule DSL_CEP_BEFORE
+ruleDSL_CEP_BEFORE
+ @init {
+ int stackSize = keepStackSize();
+ }
+ :
+ (
+ { before(grammarAccess.getDSL_CEP_BEFOREAccess().getGroup()); }
+ (rule__DSL_CEP_BEFORE__Group__0)
+ { after(grammarAccess.getDSL_CEP_BEFOREAccess().getGroup()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleDSL_CEP_COINCIDE
+entryRuleDSL_CEP_COINCIDE
+:
+{ before(grammarAccess.getDSL_CEP_COINCIDERule()); }
+ ruleDSL_CEP_COINCIDE
+{ after(grammarAccess.getDSL_CEP_COINCIDERule()); }
+ EOF
+;
+
+// Rule DSL_CEP_COINCIDE
+ruleDSL_CEP_COINCIDE
+ @init {
+ int stackSize = keepStackSize();
+ }
+ :
+ (
+ { before(grammarAccess.getDSL_CEP_COINCIDEAccess().getGroup()); }
+ (rule__DSL_CEP_COINCIDE__Group__0)
+ { after(grammarAccess.getDSL_CEP_COINCIDEAccess().getGroup()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleDSL_CEP_MIN
+entryRuleDSL_CEP_MIN
+:
+{ before(grammarAccess.getDSL_CEP_MINRule()); }
+ ruleDSL_CEP_MIN
+{ after(grammarAccess.getDSL_CEP_MINRule()); }
+ EOF
+;
+
+// Rule DSL_CEP_MIN
+ruleDSL_CEP_MIN
+ @init {
+ int stackSize = keepStackSize();
+ }
+ :
+ (
+ { before(grammarAccess.getDSL_CEP_MINAccess().getGroup()); }
+ (rule__DSL_CEP_MIN__Group__0)
+ { after(grammarAccess.getDSL_CEP_MINAccess().getGroup()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleDSL_CEP_MAX
+entryRuleDSL_CEP_MAX
+:
+{ before(grammarAccess.getDSL_CEP_MAXRule()); }
+ ruleDSL_CEP_MAX
+{ after(grammarAccess.getDSL_CEP_MAXRule()); }
+ EOF
+;
+
+// Rule DSL_CEP_MAX
+ruleDSL_CEP_MAX
+ @init {
+ int stackSize = keepStackSize();
+ }
+ :
+ (
+ { before(grammarAccess.getDSL_CEP_MAXAccess().getGroup()); }
+ (rule__DSL_CEP_MAX__Group__0)
+ { after(grammarAccess.getDSL_CEP_MAXAccess().getGroup()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleDSL_CEP_AVG
+entryRuleDSL_CEP_AVG
+:
+{ before(grammarAccess.getDSL_CEP_AVGRule()); }
+ ruleDSL_CEP_AVG
+{ after(grammarAccess.getDSL_CEP_AVGRule()); }
+ EOF
+;
+
+// Rule DSL_CEP_AVG
+ruleDSL_CEP_AVG
+ @init {
+ int stackSize = keepStackSize();
+ }
+ :
+ (
+ { before(grammarAccess.getDSL_CEP_AVGAccess().getGroup()); }
+ (rule__DSL_CEP_AVG__Group__0)
+ { after(grammarAccess.getDSL_CEP_AVGAccess().getGroup()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleDSL_CEP_SUM
+entryRuleDSL_CEP_SUM
+:
+{ before(grammarAccess.getDSL_CEP_SUMRule()); }
+ ruleDSL_CEP_SUM
+{ after(grammarAccess.getDSL_CEP_SUMRule()); }
+ EOF
+;
+
+// Rule DSL_CEP_SUM
+ruleDSL_CEP_SUM
+ @init {
+ int stackSize = keepStackSize();
+ }
+ :
+ (
+ { before(grammarAccess.getDSL_CEP_SUMAccess().getGroup()); }
+ (rule__DSL_CEP_SUM__Group__0)
+ { after(grammarAccess.getDSL_CEP_SUMAccess().getGroup()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleDSL_CEP_COUNT
+entryRuleDSL_CEP_COUNT
+:
+{ before(grammarAccess.getDSL_CEP_COUNTRule()); }
+ ruleDSL_CEP_COUNT
+{ after(grammarAccess.getDSL_CEP_COUNTRule()); }
+ EOF
+;
+
+// Rule DSL_CEP_COUNT
+ruleDSL_CEP_COUNT
+ @init {
+ int stackSize = keepStackSize();
+ }
+ :
+ (
+ { before(grammarAccess.getDSL_CEP_COUNTAccess().getGroup()); }
+ (rule__DSL_CEP_COUNT__Group__0)
+ { after(grammarAccess.getDSL_CEP_COUNTAccess().getGroup()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleDSL_CEP_DURATION
+entryRuleDSL_CEP_DURATION
+:
+{ before(grammarAccess.getDSL_CEP_DURATIONRule()); }
+ ruleDSL_CEP_DURATION
+{ after(grammarAccess.getDSL_CEP_DURATIONRule()); }
+ EOF
+;
+
+// Rule DSL_CEP_DURATION
+ruleDSL_CEP_DURATION
+ @init {
+ int stackSize = keepStackSize();
+ }
+ :
+ (
+ (
+ { before(grammarAccess.getDSL_CEP_DURATIONAccess().getUnitsAssignment()); }
+ (rule__DSL_CEP_DURATION__UnitsAssignment)
+ { after(grammarAccess.getDSL_CEP_DURATIONAccess().getUnitsAssignment()); }
+ )
+ (
+ { before(grammarAccess.getDSL_CEP_DURATIONAccess().getUnitsAssignment()); }
+ (rule__DSL_CEP_DURATION__UnitsAssignment)*
+ { after(grammarAccess.getDSL_CEP_DURATIONAccess().getUnitsAssignment()); }
+ )
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleDSL_CEP_DURATION_MIN
+entryRuleDSL_CEP_DURATION_MIN
+:
+{ before(grammarAccess.getDSL_CEP_DURATION_MINRule()); }
+ ruleDSL_CEP_DURATION_MIN
+{ after(grammarAccess.getDSL_CEP_DURATION_MINRule()); }
+ EOF
+;
+
+// Rule DSL_CEP_DURATION_MIN
+ruleDSL_CEP_DURATION_MIN
+ @init {
+ int stackSize = keepStackSize();
+ }
+ :
+ (
+ { before(grammarAccess.getDSL_CEP_DURATION_MINAccess().getGroup()); }
+ (rule__DSL_CEP_DURATION_MIN__Group__0)
+ { after(grammarAccess.getDSL_CEP_DURATION_MINAccess().getGroup()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleDSL_CEP_DURATION_SEC
+entryRuleDSL_CEP_DURATION_SEC
+:
+{ before(grammarAccess.getDSL_CEP_DURATION_SECRule()); }
+ ruleDSL_CEP_DURATION_SEC
+{ after(grammarAccess.getDSL_CEP_DURATION_SECRule()); }
+ EOF
+;
+
+// Rule DSL_CEP_DURATION_SEC
+ruleDSL_CEP_DURATION_SEC
+ @init {
+ int stackSize = keepStackSize();
+ }
+ :
+ (
+ { before(grammarAccess.getDSL_CEP_DURATION_SECAccess().getGroup()); }
+ (rule__DSL_CEP_DURATION_SEC__Group__0)
+ { after(grammarAccess.getDSL_CEP_DURATION_SECAccess().getGroup()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleDSL_ListActions
+entryRuleDSL_ListActions
+:
+{ before(grammarAccess.getDSL_ListActionsRule()); }
+ ruleDSL_ListActions
+{ after(grammarAccess.getDSL_ListActionsRule()); }
+ EOF
+;
+
+// Rule DSL_ListActions
+ruleDSL_ListActions
+ @init {
+ int stackSize = keepStackSize();
+ }
+ :
+ (
+ { before(grammarAccess.getDSL_ListActionsAccess().getGroup()); }
+ (rule__DSL_ListActions__Group__0)
+ { after(grammarAccess.getDSL_ListActionsAccess().getGroup()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleDSL_ResourceAction
+entryRuleDSL_ResourceAction
+:
+{ before(grammarAccess.getDSL_ResourceActionRule()); }
+ ruleDSL_ResourceAction
+{ after(grammarAccess.getDSL_ResourceActionRule()); }
+ EOF
+;
+
+// Rule DSL_ResourceAction
+ruleDSL_ResourceAction
+ @init {
+ int stackSize = keepStackSize();
+ }
+ :
+ (
+ { before(grammarAccess.getDSL_ResourceActionAccess().getGroup()); }
+ (rule__DSL_ResourceAction__Group__0)
+ { after(grammarAccess.getDSL_ResourceActionAccess().getGroup()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleDSL_ListParam
+entryRuleDSL_ListParam
+:
+{ before(grammarAccess.getDSL_ListParamRule()); }
+ ruleDSL_ListParam
+{ after(grammarAccess.getDSL_ListParamRule()); }
+ EOF
+;
+
+// Rule DSL_ListParam
+ruleDSL_ListParam
+ @init {
+ int stackSize = keepStackSize();
+ }
+ :
+ (
+ { before(grammarAccess.getDSL_ListParamAccess().getGroup()); }
+ (rule__DSL_ListParam__Group__0)
+ { after(grammarAccess.getDSL_ListParamAccess().getGroup()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleDSL_Expression_Or
+entryRuleDSL_Expression_Or
+:
+{ before(grammarAccess.getDSL_Expression_OrRule()); }
+ ruleDSL_Expression_Or
+{ after(grammarAccess.getDSL_Expression_OrRule()); }
+ EOF
+;
+
+// Rule DSL_Expression_Or
+ruleDSL_Expression_Or
+ @init {
+ int stackSize = keepStackSize();
+ }
+ :
+ (
+ { before(grammarAccess.getDSL_Expression_OrAccess().getGroup()); }
+ (rule__DSL_Expression_Or__Group__0)
+ { after(grammarAccess.getDSL_Expression_OrAccess().getGroup()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleDSL_Expression_And
+entryRuleDSL_Expression_And
+:
+{ before(grammarAccess.getDSL_Expression_AndRule()); }
+ ruleDSL_Expression_And
+{ after(grammarAccess.getDSL_Expression_AndRule()); }
+ EOF
+;
+
+// Rule DSL_Expression_And
+ruleDSL_Expression_And
+ @init {
+ int stackSize = keepStackSize();
+ }
+ :
+ (
+ { before(grammarAccess.getDSL_Expression_AndAccess().getGroup()); }
+ (rule__DSL_Expression_And__Group__0)
+ { after(grammarAccess.getDSL_Expression_AndAccess().getGroup()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleDSL_Expression_DiffEqual
+entryRuleDSL_Expression_DiffEqual
+:
+{ before(grammarAccess.getDSL_Expression_DiffEqualRule()); }
+ ruleDSL_Expression_DiffEqual
+{ after(grammarAccess.getDSL_Expression_DiffEqualRule()); }
+ EOF
+;
+
+// Rule DSL_Expression_DiffEqual
+ruleDSL_Expression_DiffEqual
+ @init {
+ int stackSize = keepStackSize();
+ }
+ :
+ (
+ { before(grammarAccess.getDSL_Expression_DiffEqualAccess().getGroup()); }
+ (rule__DSL_Expression_DiffEqual__Group__0)
+ { after(grammarAccess.getDSL_Expression_DiffEqualAccess().getGroup()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleDSL_Expression_Compare
+entryRuleDSL_Expression_Compare
+:
+{ before(grammarAccess.getDSL_Expression_CompareRule()); }
+ ruleDSL_Expression_Compare
+{ after(grammarAccess.getDSL_Expression_CompareRule()); }
+ EOF
+;
+
+// Rule DSL_Expression_Compare
+ruleDSL_Expression_Compare
+ @init {
+ int stackSize = keepStackSize();
+ }
+ :
+ (
+ { before(grammarAccess.getDSL_Expression_CompareAccess().getGroup()); }
+ (rule__DSL_Expression_Compare__Group__0)
+ { after(grammarAccess.getDSL_Expression_CompareAccess().getGroup()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleDSL_Expression_PlusMinus
+entryRuleDSL_Expression_PlusMinus
+:
+{ before(grammarAccess.getDSL_Expression_PlusMinusRule()); }
+ ruleDSL_Expression_PlusMinus
+{ after(grammarAccess.getDSL_Expression_PlusMinusRule()); }
+ EOF
+;
+
+// Rule DSL_Expression_PlusMinus
+ruleDSL_Expression_PlusMinus
+ @init {
+ int stackSize = keepStackSize();
+ }
+ :
+ (
+ { before(grammarAccess.getDSL_Expression_PlusMinusAccess().getGroup()); }
+ (rule__DSL_Expression_PlusMinus__Group__0)
+ { after(grammarAccess.getDSL_Expression_PlusMinusAccess().getGroup()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleDSL_Expression_MultiplicationDivision
+entryRuleDSL_Expression_MultiplicationDivision
+:
+{ before(grammarAccess.getDSL_Expression_MultiplicationDivisionRule()); }
+ ruleDSL_Expression_MultiplicationDivision
+{ after(grammarAccess.getDSL_Expression_MultiplicationDivisionRule()); }
+ EOF
+;
+
+// Rule DSL_Expression_MultiplicationDivision
+ruleDSL_Expression_MultiplicationDivision
+ @init {
+ int stackSize = keepStackSize();
+ }
+ :
+ (
+ { before(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getGroup()); }
+ (rule__DSL_Expression_MultiplicationDivision__Group__0)
+ { after(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getGroup()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleDSL_Expression_Unary
+entryRuleDSL_Expression_Unary
+:
+{ before(grammarAccess.getDSL_Expression_UnaryRule()); }
+ ruleDSL_Expression_Unary
+{ after(grammarAccess.getDSL_Expression_UnaryRule()); }
+ EOF
+;
+
+// Rule DSL_Expression_Unary
+ruleDSL_Expression_Unary
+ @init {
+ int stackSize = keepStackSize();
+ }
+ :
+ (
+ { before(grammarAccess.getDSL_Expression_UnaryAccess().getAlternatives()); }
+ (rule__DSL_Expression_Unary__Alternatives)
+ { after(grammarAccess.getDSL_Expression_UnaryAccess().getAlternatives()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__NUMBER__Alternatives
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getNUMBERAccess().getINTTerminalRuleCall_0()); }
+ RULE_INT
+ { after(grammarAccess.getNUMBERAccess().getINTTerminalRuleCall_0()); }
+ )
+ |
+ (
+ { before(grammarAccess.getNUMBERAccess().getGroup_1()); }
+ (rule__NUMBER__Group_1__0)
+ { after(grammarAccess.getNUMBERAccess().getGroup_1()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_STATEMENT__OperationAlternatives_3_0
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_CEP_STATEMENTAccess().getOperationDSL_CEP_AFTERParserRuleCall_3_0_0()); }
+ ruleDSL_CEP_AFTER
+ { after(grammarAccess.getDSL_CEP_STATEMENTAccess().getOperationDSL_CEP_AFTERParserRuleCall_3_0_0()); }
+ )
+ |
+ (
+ { before(grammarAccess.getDSL_CEP_STATEMENTAccess().getOperationDSL_CEP_BEFOREParserRuleCall_3_0_1()); }
+ ruleDSL_CEP_BEFORE
+ { after(grammarAccess.getDSL_CEP_STATEMENTAccess().getOperationDSL_CEP_BEFOREParserRuleCall_3_0_1()); }
+ )
+ |
+ (
+ { before(grammarAccess.getDSL_CEP_STATEMENTAccess().getOperationDSL_CEP_COINCIDEParserRuleCall_3_0_2()); }
+ ruleDSL_CEP_COINCIDE
+ { after(grammarAccess.getDSL_CEP_STATEMENTAccess().getOperationDSL_CEP_COINCIDEParserRuleCall_3_0_2()); }
+ )
+ |
+ (
+ { before(grammarAccess.getDSL_CEP_STATEMENTAccess().getOperationDSL_CEP_MINParserRuleCall_3_0_3()); }
+ ruleDSL_CEP_MIN
+ { after(grammarAccess.getDSL_CEP_STATEMENTAccess().getOperationDSL_CEP_MINParserRuleCall_3_0_3()); }
+ )
+ |
+ (
+ { before(grammarAccess.getDSL_CEP_STATEMENTAccess().getOperationDSL_CEP_MAXParserRuleCall_3_0_4()); }
+ ruleDSL_CEP_MAX
+ { after(grammarAccess.getDSL_CEP_STATEMENTAccess().getOperationDSL_CEP_MAXParserRuleCall_3_0_4()); }
+ )
+ |
+ (
+ { before(grammarAccess.getDSL_CEP_STATEMENTAccess().getOperationDSL_CEP_AVGParserRuleCall_3_0_5()); }
+ ruleDSL_CEP_AVG
+ { after(grammarAccess.getDSL_CEP_STATEMENTAccess().getOperationDSL_CEP_AVGParserRuleCall_3_0_5()); }
+ )
+ |
+ (
+ { before(grammarAccess.getDSL_CEP_STATEMENTAccess().getOperationDSL_CEP_SUMParserRuleCall_3_0_6()); }
+ ruleDSL_CEP_SUM
+ { after(grammarAccess.getDSL_CEP_STATEMENTAccess().getOperationDSL_CEP_SUMParserRuleCall_3_0_6()); }
+ )
+ |
+ (
+ { before(grammarAccess.getDSL_CEP_STATEMENTAccess().getOperationDSL_CEP_COUNTParserRuleCall_3_0_7()); }
+ ruleDSL_CEP_COUNT
+ { after(grammarAccess.getDSL_CEP_STATEMENTAccess().getOperationDSL_CEP_COUNTParserRuleCall_3_0_7()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_DURATION__UnitsAlternatives_0
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_CEP_DURATIONAccess().getUnitsDSL_CEP_DURATION_MINParserRuleCall_0_0()); }
+ ruleDSL_CEP_DURATION_MIN
+ { after(grammarAccess.getDSL_CEP_DURATIONAccess().getUnitsDSL_CEP_DURATION_MINParserRuleCall_0_0()); }
+ )
+ |
+ (
+ { before(grammarAccess.getDSL_CEP_DURATIONAccess().getUnitsDSL_CEP_DURATION_SECParserRuleCall_0_1()); }
+ ruleDSL_CEP_DURATION_SEC
+ { after(grammarAccess.getDSL_CEP_DURATIONAccess().getUnitsDSL_CEP_DURATION_SECParserRuleCall_0_1()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_ResourceAction__ActiontypeAlternatives_3_0
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_ResourceActionAccess().getActiontypeActKeyword_3_0_0()); }
+ 'act'
+ { after(grammarAccess.getDSL_ResourceActionAccess().getActiontypeActKeyword_3_0_0()); }
+ )
+ |
+ (
+ { before(grammarAccess.getDSL_ResourceActionAccess().getActiontypeSetKeyword_3_0_1()); }
+ 'set'
+ { after(grammarAccess.getDSL_ResourceActionAccess().getActiontypeSetKeyword_3_0_1()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_DiffEqual__Alternatives_1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_Expression_DiffEqualAccess().getGroup_1_0()); }
+ (rule__DSL_Expression_DiffEqual__Group_1_0__0)
+ { after(grammarAccess.getDSL_Expression_DiffEqualAccess().getGroup_1_0()); }
+ )
+ |
+ (
+ { before(grammarAccess.getDSL_Expression_DiffEqualAccess().getGroup_1_1()); }
+ (rule__DSL_Expression_DiffEqual__Group_1_1__0)
+ { after(grammarAccess.getDSL_Expression_DiffEqualAccess().getGroup_1_1()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_Compare__Alternatives_1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_Expression_CompareAccess().getGroup_1_0()); }
+ (rule__DSL_Expression_Compare__Group_1_0__0)
+ { after(grammarAccess.getDSL_Expression_CompareAccess().getGroup_1_0()); }
+ )
+ |
+ (
+ { before(grammarAccess.getDSL_Expression_CompareAccess().getGroup_1_1()); }
+ (rule__DSL_Expression_Compare__Group_1_1__0)
+ { after(grammarAccess.getDSL_Expression_CompareAccess().getGroup_1_1()); }
+ )
+ |
+ (
+ { before(grammarAccess.getDSL_Expression_CompareAccess().getGroup_1_2()); }
+ (rule__DSL_Expression_Compare__Group_1_2__0)
+ { after(grammarAccess.getDSL_Expression_CompareAccess().getGroup_1_2()); }
+ )
+ |
+ (
+ { before(grammarAccess.getDSL_Expression_CompareAccess().getGroup_1_3()); }
+ (rule__DSL_Expression_Compare__Group_1_3__0)
+ { after(grammarAccess.getDSL_Expression_CompareAccess().getGroup_1_3()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_PlusMinus__Alternatives_1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_Expression_PlusMinusAccess().getGroup_1_0()); }
+ (rule__DSL_Expression_PlusMinus__Group_1_0__0)
+ { after(grammarAccess.getDSL_Expression_PlusMinusAccess().getGroup_1_0()); }
+ )
+ |
+ (
+ { before(grammarAccess.getDSL_Expression_PlusMinusAccess().getGroup_1_1()); }
+ (rule__DSL_Expression_PlusMinus__Group_1_1__0)
+ { after(grammarAccess.getDSL_Expression_PlusMinusAccess().getGroup_1_1()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_MultiplicationDivision__Alternatives_1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getGroup_1_0()); }
+ (rule__DSL_Expression_MultiplicationDivision__Group_1_0__0)
+ { after(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getGroup_1_0()); }
+ )
+ |
+ (
+ { before(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getGroup_1_1()); }
+ (rule__DSL_Expression_MultiplicationDivision__Group_1_1__0)
+ { after(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getGroup_1_1()); }
+ )
+ |
+ (
+ { before(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getGroup_1_2()); }
+ (rule__DSL_Expression_MultiplicationDivision__Group_1_2__0)
+ { after(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getGroup_1_2()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_Unary__Alternatives
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_Expression_UnaryAccess().getGroup_0()); }
+ (rule__DSL_Expression_Unary__Group_0__0)
+ { after(grammarAccess.getDSL_Expression_UnaryAccess().getGroup_0()); }
+ )
+ |
+ (
+ { before(grammarAccess.getDSL_Expression_UnaryAccess().getGroup_1()); }
+ (rule__DSL_Expression_Unary__Group_1__0)
+ { after(grammarAccess.getDSL_Expression_UnaryAccess().getGroup_1()); }
+ )
+ |
+ (
+ { before(grammarAccess.getDSL_Expression_UnaryAccess().getGroup_2()); }
+ (rule__DSL_Expression_Unary__Group_2__0)
+ { after(grammarAccess.getDSL_Expression_UnaryAccess().getGroup_2()); }
+ )
+ |
+ (
+ { before(grammarAccess.getDSL_Expression_UnaryAccess().getGroup_3()); }
+ (rule__DSL_Expression_Unary__Group_3__0)
+ { after(grammarAccess.getDSL_Expression_UnaryAccess().getGroup_3()); }
+ )
+ |
+ (
+ { before(grammarAccess.getDSL_Expression_UnaryAccess().getGroup_4()); }
+ (rule__DSL_Expression_Unary__Group_4__0)
+ { after(grammarAccess.getDSL_Expression_UnaryAccess().getGroup_4()); }
+ )
+ |
+ (
+ { before(grammarAccess.getDSL_Expression_UnaryAccess().getGroup_5()); }
+ (rule__DSL_Expression_Unary__Group_5__0)
+ { after(grammarAccess.getDSL_Expression_UnaryAccess().getGroup_5()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__Sensinact__Group__0
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__Sensinact__Group__0__Impl
+ rule__Sensinact__Group__1
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__Sensinact__Group__0__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getSensinactAccess().getSensinactAction_0()); }
+ ()
+ { after(grammarAccess.getSensinactAccess().getSensinactAction_0()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__Sensinact__Group__1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__Sensinact__Group__1__Impl
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__Sensinact__Group__1__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getSensinactAccess().getEcaAssignment_1()); }
+ (rule__Sensinact__EcaAssignment_1)
+ { after(grammarAccess.getSensinactAccess().getEcaAssignment_1()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+
+rule__DSL_SENSINACT__Group__0
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_SENSINACT__Group__0__Impl
+ rule__DSL_SENSINACT__Group__1
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_SENSINACT__Group__0__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ (
+ { before(grammarAccess.getDSL_SENSINACTAccess().getResourcesAssignment_0()); }
+ (rule__DSL_SENSINACT__ResourcesAssignment_0)
+ { after(grammarAccess.getDSL_SENSINACTAccess().getResourcesAssignment_0()); }
+ )
+ (
+ { before(grammarAccess.getDSL_SENSINACTAccess().getResourcesAssignment_0()); }
+ (rule__DSL_SENSINACT__ResourcesAssignment_0)*
+ { after(grammarAccess.getDSL_SENSINACTAccess().getResourcesAssignment_0()); }
+ )
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_SENSINACT__Group__1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_SENSINACT__Group__1__Impl
+ rule__DSL_SENSINACT__Group__2
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_SENSINACT__Group__1__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_SENSINACTAccess().getCepAssignment_1()); }
+ (rule__DSL_SENSINACT__CepAssignment_1)*
+ { after(grammarAccess.getDSL_SENSINACTAccess().getCepAssignment_1()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_SENSINACT__Group__2
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_SENSINACT__Group__2__Impl
+ rule__DSL_SENSINACT__Group__3
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_SENSINACT__Group__2__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_SENSINACTAccess().getOnAssignment_2()); }
+ (rule__DSL_SENSINACT__OnAssignment_2)
+ { after(grammarAccess.getDSL_SENSINACTAccess().getOnAssignment_2()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_SENSINACT__Group__3
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_SENSINACT__Group__3__Impl
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_SENSINACT__Group__3__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_SENSINACTAccess().getEcaAssignment_3()); }
+ (rule__DSL_SENSINACT__EcaAssignment_3)
+ { after(grammarAccess.getDSL_SENSINACTAccess().getEcaAssignment_3()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+
+rule__DSL_Resource__Group__0
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Resource__Group__0__Impl
+ rule__DSL_Resource__Group__1
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Resource__Group__0__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_ResourceAccess().getResourceKeyword_0()); }
+ 'resource'
+ { after(grammarAccess.getDSL_ResourceAccess().getResourceKeyword_0()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Resource__Group__1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Resource__Group__1__Impl
+ rule__DSL_Resource__Group__2
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Resource__Group__1__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_ResourceAccess().getNameAssignment_1()); }
+ (rule__DSL_Resource__NameAssignment_1)
+ { after(grammarAccess.getDSL_ResourceAccess().getNameAssignment_1()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Resource__Group__2
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Resource__Group__2__Impl
+ rule__DSL_Resource__Group__3
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Resource__Group__2__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_ResourceAccess().getEqualsSignKeyword_2()); }
+ '='
+ { after(grammarAccess.getDSL_ResourceAccess().getEqualsSignKeyword_2()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Resource__Group__3
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Resource__Group__3__Impl
+ rule__DSL_Resource__Group__4
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Resource__Group__3__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_ResourceAccess().getLeftSquareBracketKeyword_3()); }
+ '['
+ { after(grammarAccess.getDSL_ResourceAccess().getLeftSquareBracketKeyword_3()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Resource__Group__4
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Resource__Group__4__Impl
+ rule__DSL_Resource__Group__5
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Resource__Group__4__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_ResourceAccess().getGatewayIDAssignment_4()); }
+ (rule__DSL_Resource__GatewayIDAssignment_4)
+ { after(grammarAccess.getDSL_ResourceAccess().getGatewayIDAssignment_4()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Resource__Group__5
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Resource__Group__5__Impl
+ rule__DSL_Resource__Group__6
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Resource__Group__5__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_ResourceAccess().getSolidusKeyword_5()); }
+ '/'
+ { after(grammarAccess.getDSL_ResourceAccess().getSolidusKeyword_5()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Resource__Group__6
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Resource__Group__6__Impl
+ rule__DSL_Resource__Group__7
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Resource__Group__6__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_ResourceAccess().getDeviceIDAssignment_6()); }
+ (rule__DSL_Resource__DeviceIDAssignment_6)
+ { after(grammarAccess.getDSL_ResourceAccess().getDeviceIDAssignment_6()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Resource__Group__7
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Resource__Group__7__Impl
+ rule__DSL_Resource__Group__8
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Resource__Group__7__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_ResourceAccess().getSolidusKeyword_7()); }
+ '/'
+ { after(grammarAccess.getDSL_ResourceAccess().getSolidusKeyword_7()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Resource__Group__8
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Resource__Group__8__Impl
+ rule__DSL_Resource__Group__9
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Resource__Group__8__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_ResourceAccess().getServiceIDAssignment_8()); }
+ (rule__DSL_Resource__ServiceIDAssignment_8)
+ { after(grammarAccess.getDSL_ResourceAccess().getServiceIDAssignment_8()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Resource__Group__9
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Resource__Group__9__Impl
+ rule__DSL_Resource__Group__10
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Resource__Group__9__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_ResourceAccess().getSolidusKeyword_9()); }
+ '/'
+ { after(grammarAccess.getDSL_ResourceAccess().getSolidusKeyword_9()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Resource__Group__10
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Resource__Group__10__Impl
+ rule__DSL_Resource__Group__11
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Resource__Group__10__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_ResourceAccess().getResourceIDAssignment_10()); }
+ (rule__DSL_Resource__ResourceIDAssignment_10)
+ { after(grammarAccess.getDSL_ResourceAccess().getResourceIDAssignment_10()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Resource__Group__11
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Resource__Group__11__Impl
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Resource__Group__11__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_ResourceAccess().getRightSquareBracketKeyword_11()); }
+ ']'
+ { after(grammarAccess.getDSL_ResourceAccess().getRightSquareBracketKeyword_11()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+
+rule__DSL_On__Group__0
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_On__Group__0__Impl
+ rule__DSL_On__Group__1
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_On__Group__0__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_OnAccess().getOnKeyword_0()); }
+ 'on'
+ { after(grammarAccess.getDSL_OnAccess().getOnKeyword_0()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_On__Group__1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_On__Group__1__Impl
+ rule__DSL_On__Group__2
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_On__Group__1__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_OnAccess().getTriggersAssignment_1()); }
+ (rule__DSL_On__TriggersAssignment_1)
+ { after(grammarAccess.getDSL_OnAccess().getTriggersAssignment_1()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_On__Group__2
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_On__Group__2__Impl
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_On__Group__2__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_OnAccess().getGroup_2()); }
+ (rule__DSL_On__Group_2__0)*
+ { after(grammarAccess.getDSL_OnAccess().getGroup_2()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+
+rule__DSL_On__Group_2__0
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_On__Group_2__0__Impl
+ rule__DSL_On__Group_2__1
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_On__Group_2__0__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_OnAccess().getCommaKeyword_2_0()); }
+ ','
+ { after(grammarAccess.getDSL_OnAccess().getCommaKeyword_2_0()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_On__Group_2__1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_On__Group_2__1__Impl
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_On__Group_2__1__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_OnAccess().getTriggersAssignment_2_1()); }
+ (rule__DSL_On__TriggersAssignment_2_1)
+ { after(grammarAccess.getDSL_OnAccess().getTriggersAssignment_2_1()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+
+rule__DSL_ECA_STATEMENT__Group__0
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_ECA_STATEMENT__Group__0__Impl
+ rule__DSL_ECA_STATEMENT__Group__1
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_ECA_STATEMENT__Group__0__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_ECA_STATEMENTAccess().getIfdoAssignment_0()); }
+ (rule__DSL_ECA_STATEMENT__IfdoAssignment_0)
+ { after(grammarAccess.getDSL_ECA_STATEMENTAccess().getIfdoAssignment_0()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_ECA_STATEMENT__Group__1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_ECA_STATEMENT__Group__1__Impl
+ rule__DSL_ECA_STATEMENT__Group__2
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_ECA_STATEMENT__Group__1__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_ECA_STATEMENTAccess().getElseIfdoAssignment_1()); }
+ (rule__DSL_ECA_STATEMENT__ElseIfdoAssignment_1)*
+ { after(grammarAccess.getDSL_ECA_STATEMENTAccess().getElseIfdoAssignment_1()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_ECA_STATEMENT__Group__2
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_ECA_STATEMENT__Group__2__Impl
+ rule__DSL_ECA_STATEMENT__Group__3
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_ECA_STATEMENT__Group__2__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_ECA_STATEMENTAccess().getElsedoAssignment_2()); }
+ (rule__DSL_ECA_STATEMENT__ElsedoAssignment_2)?
+ { after(grammarAccess.getDSL_ECA_STATEMENTAccess().getElsedoAssignment_2()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_ECA_STATEMENT__Group__3
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_ECA_STATEMENT__Group__3__Impl
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_ECA_STATEMENT__Group__3__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_ECA_STATEMENTAccess().getEndIfKeyword_3()); }
+ 'end if'
+ { after(grammarAccess.getDSL_ECA_STATEMENTAccess().getEndIfKeyword_3()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+
+rule__DSL_IfDo__Group__0
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_IfDo__Group__0__Impl
+ rule__DSL_IfDo__Group__1
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_IfDo__Group__0__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_IfDoAccess().getIfKeyword_0()); }
+ 'if'
+ { after(grammarAccess.getDSL_IfDoAccess().getIfKeyword_0()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_IfDo__Group__1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_IfDo__Group__1__Impl
+ rule__DSL_IfDo__Group__2
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_IfDo__Group__1__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_IfDoAccess().getConditionAssignment_1()); }
+ (rule__DSL_IfDo__ConditionAssignment_1)
+ { after(grammarAccess.getDSL_IfDoAccess().getConditionAssignment_1()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_IfDo__Group__2
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_IfDo__Group__2__Impl
+ rule__DSL_IfDo__Group__3
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_IfDo__Group__2__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_IfDoAccess().getDoKeyword_2()); }
+ 'do'
+ { after(grammarAccess.getDSL_IfDoAccess().getDoKeyword_2()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_IfDo__Group__3
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_IfDo__Group__3__Impl
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_IfDo__Group__3__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_IfDoAccess().getActionsAssignment_3()); }
+ (rule__DSL_IfDo__ActionsAssignment_3)
+ { after(grammarAccess.getDSL_IfDoAccess().getActionsAssignment_3()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+
+rule__DSL_ElseIfDo__Group__0
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_ElseIfDo__Group__0__Impl
+ rule__DSL_ElseIfDo__Group__1
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_ElseIfDo__Group__0__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_ElseIfDoAccess().getElseIfKeyword_0()); }
+ 'else if'
+ { after(grammarAccess.getDSL_ElseIfDoAccess().getElseIfKeyword_0()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_ElseIfDo__Group__1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_ElseIfDo__Group__1__Impl
+ rule__DSL_ElseIfDo__Group__2
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_ElseIfDo__Group__1__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_ElseIfDoAccess().getConditionAssignment_1()); }
+ (rule__DSL_ElseIfDo__ConditionAssignment_1)
+ { after(grammarAccess.getDSL_ElseIfDoAccess().getConditionAssignment_1()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_ElseIfDo__Group__2
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_ElseIfDo__Group__2__Impl
+ rule__DSL_ElseIfDo__Group__3
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_ElseIfDo__Group__2__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_ElseIfDoAccess().getDoKeyword_2()); }
+ 'do'
+ { after(grammarAccess.getDSL_ElseIfDoAccess().getDoKeyword_2()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_ElseIfDo__Group__3
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_ElseIfDo__Group__3__Impl
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_ElseIfDo__Group__3__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_ElseIfDoAccess().getActionsAssignment_3()); }
+ (rule__DSL_ElseIfDo__ActionsAssignment_3)
+ { after(grammarAccess.getDSL_ElseIfDoAccess().getActionsAssignment_3()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+
+rule__DSL_ElseDo__Group__0
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_ElseDo__Group__0__Impl
+ rule__DSL_ElseDo__Group__1
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_ElseDo__Group__0__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_ElseDoAccess().getElseDoKeyword_0()); }
+ 'else do'
+ { after(grammarAccess.getDSL_ElseDoAccess().getElseDoKeyword_0()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_ElseDo__Group__1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_ElseDo__Group__1__Impl
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_ElseDo__Group__1__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_ElseDoAccess().getActionsAssignment_1()); }
+ (rule__DSL_ElseDo__ActionsAssignment_1)
+ { after(grammarAccess.getDSL_ElseDoAccess().getActionsAssignment_1()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+
+rule__NUMBER__Group_1__0
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__NUMBER__Group_1__0__Impl
+ rule__NUMBER__Group_1__1
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__NUMBER__Group_1__0__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getNUMBERAccess().getINTTerminalRuleCall_1_0()); }
+ RULE_INT
+ { after(grammarAccess.getNUMBERAccess().getINTTerminalRuleCall_1_0()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__NUMBER__Group_1__1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__NUMBER__Group_1__1__Impl
+ rule__NUMBER__Group_1__2
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__NUMBER__Group_1__1__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getNUMBERAccess().getFullStopKeyword_1_1()); }
+ '.'
+ { after(grammarAccess.getNUMBERAccess().getFullStopKeyword_1_1()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__NUMBER__Group_1__2
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__NUMBER__Group_1__2__Impl
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__NUMBER__Group_1__2__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getNUMBERAccess().getINTTerminalRuleCall_1_2()); }
+ RULE_INT
+ { after(grammarAccess.getNUMBERAccess().getINTTerminalRuleCall_1_2()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+
+rule__EXTENDED_ID__Group__0
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__EXTENDED_ID__Group__0__Impl
+ rule__EXTENDED_ID__Group__1
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__EXTENDED_ID__Group__0__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getEXTENDED_IDAccess().getIDTerminalRuleCall_0()); }
+ RULE_ID
+ { after(grammarAccess.getEXTENDED_IDAccess().getIDTerminalRuleCall_0()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__EXTENDED_ID__Group__1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__EXTENDED_ID__Group__1__Impl
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__EXTENDED_ID__Group__1__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getEXTENDED_IDAccess().getGroup_1()); }
+ (rule__EXTENDED_ID__Group_1__0)*
+ { after(grammarAccess.getEXTENDED_IDAccess().getGroup_1()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+
+rule__EXTENDED_ID__Group_1__0
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__EXTENDED_ID__Group_1__0__Impl
+ rule__EXTENDED_ID__Group_1__1
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__EXTENDED_ID__Group_1__0__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getEXTENDED_IDAccess().getFullStopKeyword_1_0()); }
+ '.'
+ { after(grammarAccess.getEXTENDED_IDAccess().getFullStopKeyword_1_0()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__EXTENDED_ID__Group_1__1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__EXTENDED_ID__Group_1__1__Impl
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__EXTENDED_ID__Group_1__1__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getEXTENDED_IDAccess().getIDTerminalRuleCall_1_1()); }
+ RULE_ID
+ { after(grammarAccess.getEXTENDED_IDAccess().getIDTerminalRuleCall_1_1()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+
+rule__DSL_REF_CONDITION__Group__0
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_REF_CONDITION__Group__0__Impl
+ rule__DSL_REF_CONDITION__Group__1
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_REF_CONDITION__Group__0__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_REF_CONDITIONAccess().getRefAssignment_0()); }
+ (rule__DSL_REF_CONDITION__RefAssignment_0)
+ { after(grammarAccess.getDSL_REF_CONDITIONAccess().getRefAssignment_0()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_REF_CONDITION__Group__1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_REF_CONDITION__Group__1__Impl
+ rule__DSL_REF_CONDITION__Group__2
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_REF_CONDITION__Group__1__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_REF_CONDITIONAccess().getFullStopKeyword_1()); }
+ '.'
+ { after(grammarAccess.getDSL_REF_CONDITIONAccess().getFullStopKeyword_1()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_REF_CONDITION__Group__2
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_REF_CONDITION__Group__2__Impl
+ rule__DSL_REF_CONDITION__Group__3
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_REF_CONDITION__Group__2__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_REF_CONDITIONAccess().getSubscribeKeyword_2()); }
+ 'subscribe'
+ { after(grammarAccess.getDSL_REF_CONDITIONAccess().getSubscribeKeyword_2()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_REF_CONDITION__Group__3
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_REF_CONDITION__Group__3__Impl
+ rule__DSL_REF_CONDITION__Group__4
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_REF_CONDITION__Group__3__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_REF_CONDITIONAccess().getLeftParenthesisKeyword_3()); }
+ '('
+ { after(grammarAccess.getDSL_REF_CONDITIONAccess().getLeftParenthesisKeyword_3()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_REF_CONDITION__Group__4
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_REF_CONDITION__Group__4__Impl
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_REF_CONDITION__Group__4__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_REF_CONDITIONAccess().getRightParenthesisKeyword_4()); }
+ ')'
+ { after(grammarAccess.getDSL_REF_CONDITIONAccess().getRightParenthesisKeyword_4()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+
+rule__DSL_CEP_STATEMENT__Group__0
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_CEP_STATEMENT__Group__0__Impl
+ rule__DSL_CEP_STATEMENT__Group__1
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_STATEMENT__Group__0__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_CEP_STATEMENTAccess().getDefineKeyword_0()); }
+ 'define'
+ { after(grammarAccess.getDSL_CEP_STATEMENTAccess().getDefineKeyword_0()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_STATEMENT__Group__1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_CEP_STATEMENT__Group__1__Impl
+ rule__DSL_CEP_STATEMENT__Group__2
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_STATEMENT__Group__1__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_CEP_STATEMENTAccess().getNameAssignment_1()); }
+ (rule__DSL_CEP_STATEMENT__NameAssignment_1)
+ { after(grammarAccess.getDSL_CEP_STATEMENTAccess().getNameAssignment_1()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_STATEMENT__Group__2
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_CEP_STATEMENT__Group__2__Impl
+ rule__DSL_CEP_STATEMENT__Group__3
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_STATEMENT__Group__2__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_CEP_STATEMENTAccess().getEqualsSignKeyword_2()); }
+ '='
+ { after(grammarAccess.getDSL_CEP_STATEMENTAccess().getEqualsSignKeyword_2()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_STATEMENT__Group__3
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_CEP_STATEMENT__Group__3__Impl
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_STATEMENT__Group__3__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_CEP_STATEMENTAccess().getOperationAssignment_3()); }
+ (rule__DSL_CEP_STATEMENT__OperationAssignment_3)
+ { after(grammarAccess.getDSL_CEP_STATEMENTAccess().getOperationAssignment_3()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+
+rule__DSL_CEP_AFTER__Group__0
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_CEP_AFTER__Group__0__Impl
+ rule__DSL_CEP_AFTER__Group__1
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_AFTER__Group__0__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_CEP_AFTERAccess().getAfterKeyword_0()); }
+ 'after'
+ { after(grammarAccess.getDSL_CEP_AFTERAccess().getAfterKeyword_0()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_AFTER__Group__1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_CEP_AFTER__Group__1__Impl
+ rule__DSL_CEP_AFTER__Group__2
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_AFTER__Group__1__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_CEP_AFTERAccess().getLeftParenthesisKeyword_1()); }
+ '('
+ { after(grammarAccess.getDSL_CEP_AFTERAccess().getLeftParenthesisKeyword_1()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_AFTER__Group__2
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_CEP_AFTER__Group__2__Impl
+ rule__DSL_CEP_AFTER__Group__3
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_AFTER__Group__2__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_CEP_AFTERAccess().getRef1Assignment_2()); }
+ (rule__DSL_CEP_AFTER__Ref1Assignment_2)
+ { after(grammarAccess.getDSL_CEP_AFTERAccess().getRef1Assignment_2()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_AFTER__Group__3
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_CEP_AFTER__Group__3__Impl
+ rule__DSL_CEP_AFTER__Group__4
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_AFTER__Group__3__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_CEP_AFTERAccess().getCommaKeyword_3()); }
+ ','
+ { after(grammarAccess.getDSL_CEP_AFTERAccess().getCommaKeyword_3()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_AFTER__Group__4
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_CEP_AFTER__Group__4__Impl
+ rule__DSL_CEP_AFTER__Group__5
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_AFTER__Group__4__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_CEP_AFTERAccess().getRef2Assignment_4()); }
+ (rule__DSL_CEP_AFTER__Ref2Assignment_4)
+ { after(grammarAccess.getDSL_CEP_AFTERAccess().getRef2Assignment_4()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_AFTER__Group__5
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_CEP_AFTER__Group__5__Impl
+ rule__DSL_CEP_AFTER__Group__6
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_AFTER__Group__5__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_CEP_AFTERAccess().getCommaKeyword_5()); }
+ ','
+ { after(grammarAccess.getDSL_CEP_AFTERAccess().getCommaKeyword_5()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_AFTER__Group__6
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_CEP_AFTER__Group__6__Impl
+ rule__DSL_CEP_AFTER__Group__7
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_AFTER__Group__6__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_CEP_AFTERAccess().getGroup_6()); }
+ (rule__DSL_CEP_AFTER__Group_6__0)?
+ { after(grammarAccess.getDSL_CEP_AFTERAccess().getGroup_6()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_AFTER__Group__7
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_CEP_AFTER__Group__7__Impl
+ rule__DSL_CEP_AFTER__Group__8
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_AFTER__Group__7__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_CEP_AFTERAccess().getEndAssignment_7()); }
+ (rule__DSL_CEP_AFTER__EndAssignment_7)
+ { after(grammarAccess.getDSL_CEP_AFTERAccess().getEndAssignment_7()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_AFTER__Group__8
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_CEP_AFTER__Group__8__Impl
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_AFTER__Group__8__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_CEP_AFTERAccess().getRightParenthesisKeyword_8()); }
+ ')'
+ { after(grammarAccess.getDSL_CEP_AFTERAccess().getRightParenthesisKeyword_8()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+
+rule__DSL_CEP_AFTER__Group_6__0
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_CEP_AFTER__Group_6__0__Impl
+ rule__DSL_CEP_AFTER__Group_6__1
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_AFTER__Group_6__0__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_CEP_AFTERAccess().getStartAssignment_6_0()); }
+ (rule__DSL_CEP_AFTER__StartAssignment_6_0)
+ { after(grammarAccess.getDSL_CEP_AFTERAccess().getStartAssignment_6_0()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_AFTER__Group_6__1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_CEP_AFTER__Group_6__1__Impl
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_AFTER__Group_6__1__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_CEP_AFTERAccess().getCommaKeyword_6_1()); }
+ ','
+ { after(grammarAccess.getDSL_CEP_AFTERAccess().getCommaKeyword_6_1()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+
+rule__DSL_CEP_BEFORE__Group__0
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_CEP_BEFORE__Group__0__Impl
+ rule__DSL_CEP_BEFORE__Group__1
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_BEFORE__Group__0__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_CEP_BEFOREAccess().getBeforeKeyword_0()); }
+ 'before'
+ { after(grammarAccess.getDSL_CEP_BEFOREAccess().getBeforeKeyword_0()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_BEFORE__Group__1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_CEP_BEFORE__Group__1__Impl
+ rule__DSL_CEP_BEFORE__Group__2
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_BEFORE__Group__1__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_CEP_BEFOREAccess().getLeftParenthesisKeyword_1()); }
+ '('
+ { after(grammarAccess.getDSL_CEP_BEFOREAccess().getLeftParenthesisKeyword_1()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_BEFORE__Group__2
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_CEP_BEFORE__Group__2__Impl
+ rule__DSL_CEP_BEFORE__Group__3
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_BEFORE__Group__2__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_CEP_BEFOREAccess().getRef1Assignment_2()); }
+ (rule__DSL_CEP_BEFORE__Ref1Assignment_2)
+ { after(grammarAccess.getDSL_CEP_BEFOREAccess().getRef1Assignment_2()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_BEFORE__Group__3
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_CEP_BEFORE__Group__3__Impl
+ rule__DSL_CEP_BEFORE__Group__4
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_BEFORE__Group__3__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_CEP_BEFOREAccess().getCommaKeyword_3()); }
+ ','
+ { after(grammarAccess.getDSL_CEP_BEFOREAccess().getCommaKeyword_3()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_BEFORE__Group__4
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_CEP_BEFORE__Group__4__Impl
+ rule__DSL_CEP_BEFORE__Group__5
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_BEFORE__Group__4__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_CEP_BEFOREAccess().getRef2Assignment_4()); }
+ (rule__DSL_CEP_BEFORE__Ref2Assignment_4)
+ { after(grammarAccess.getDSL_CEP_BEFOREAccess().getRef2Assignment_4()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_BEFORE__Group__5
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_CEP_BEFORE__Group__5__Impl
+ rule__DSL_CEP_BEFORE__Group__6
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_BEFORE__Group__5__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_CEP_BEFOREAccess().getCommaKeyword_5()); }
+ ','
+ { after(grammarAccess.getDSL_CEP_BEFOREAccess().getCommaKeyword_5()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_BEFORE__Group__6
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_CEP_BEFORE__Group__6__Impl
+ rule__DSL_CEP_BEFORE__Group__7
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_BEFORE__Group__6__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_CEP_BEFOREAccess().getGroup_6()); }
+ (rule__DSL_CEP_BEFORE__Group_6__0)?
+ { after(grammarAccess.getDSL_CEP_BEFOREAccess().getGroup_6()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_BEFORE__Group__7
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_CEP_BEFORE__Group__7__Impl
+ rule__DSL_CEP_BEFORE__Group__8
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_BEFORE__Group__7__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_CEP_BEFOREAccess().getEndAssignment_7()); }
+ (rule__DSL_CEP_BEFORE__EndAssignment_7)
+ { after(grammarAccess.getDSL_CEP_BEFOREAccess().getEndAssignment_7()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_BEFORE__Group__8
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_CEP_BEFORE__Group__8__Impl
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_BEFORE__Group__8__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_CEP_BEFOREAccess().getRightParenthesisKeyword_8()); }
+ ')'
+ { after(grammarAccess.getDSL_CEP_BEFOREAccess().getRightParenthesisKeyword_8()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+
+rule__DSL_CEP_BEFORE__Group_6__0
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_CEP_BEFORE__Group_6__0__Impl
+ rule__DSL_CEP_BEFORE__Group_6__1
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_BEFORE__Group_6__0__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_CEP_BEFOREAccess().getStartAssignment_6_0()); }
+ (rule__DSL_CEP_BEFORE__StartAssignment_6_0)
+ { after(grammarAccess.getDSL_CEP_BEFOREAccess().getStartAssignment_6_0()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_BEFORE__Group_6__1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_CEP_BEFORE__Group_6__1__Impl
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_BEFORE__Group_6__1__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_CEP_BEFOREAccess().getCommaKeyword_6_1()); }
+ ','
+ { after(grammarAccess.getDSL_CEP_BEFOREAccess().getCommaKeyword_6_1()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+
+rule__DSL_CEP_COINCIDE__Group__0
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_CEP_COINCIDE__Group__0__Impl
+ rule__DSL_CEP_COINCIDE__Group__1
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_COINCIDE__Group__0__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_CEP_COINCIDEAccess().getCoincideKeyword_0()); }
+ 'coincide'
+ { after(grammarAccess.getDSL_CEP_COINCIDEAccess().getCoincideKeyword_0()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_COINCIDE__Group__1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_CEP_COINCIDE__Group__1__Impl
+ rule__DSL_CEP_COINCIDE__Group__2
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_COINCIDE__Group__1__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_CEP_COINCIDEAccess().getLeftParenthesisKeyword_1()); }
+ '('
+ { after(grammarAccess.getDSL_CEP_COINCIDEAccess().getLeftParenthesisKeyword_1()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_COINCIDE__Group__2
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_CEP_COINCIDE__Group__2__Impl
+ rule__DSL_CEP_COINCIDE__Group__3
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_COINCIDE__Group__2__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_CEP_COINCIDEAccess().getRef1Assignment_2()); }
+ (rule__DSL_CEP_COINCIDE__Ref1Assignment_2)
+ { after(grammarAccess.getDSL_CEP_COINCIDEAccess().getRef1Assignment_2()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_COINCIDE__Group__3
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_CEP_COINCIDE__Group__3__Impl
+ rule__DSL_CEP_COINCIDE__Group__4
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_COINCIDE__Group__3__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_CEP_COINCIDEAccess().getCommaKeyword_3()); }
+ ','
+ { after(grammarAccess.getDSL_CEP_COINCIDEAccess().getCommaKeyword_3()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_COINCIDE__Group__4
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_CEP_COINCIDE__Group__4__Impl
+ rule__DSL_CEP_COINCIDE__Group__5
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_COINCIDE__Group__4__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_CEP_COINCIDEAccess().getRef2Assignment_4()); }
+ (rule__DSL_CEP_COINCIDE__Ref2Assignment_4)
+ { after(grammarAccess.getDSL_CEP_COINCIDEAccess().getRef2Assignment_4()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_COINCIDE__Group__5
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_CEP_COINCIDE__Group__5__Impl
+ rule__DSL_CEP_COINCIDE__Group__6
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_COINCIDE__Group__5__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_CEP_COINCIDEAccess().getCommaKeyword_5()); }
+ ','
+ { after(grammarAccess.getDSL_CEP_COINCIDEAccess().getCommaKeyword_5()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_COINCIDE__Group__6
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_CEP_COINCIDE__Group__6__Impl
+ rule__DSL_CEP_COINCIDE__Group__7
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_COINCIDE__Group__6__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_CEP_COINCIDEAccess().getWindowAssignment_6()); }
+ (rule__DSL_CEP_COINCIDE__WindowAssignment_6)
+ { after(grammarAccess.getDSL_CEP_COINCIDEAccess().getWindowAssignment_6()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_COINCIDE__Group__7
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_CEP_COINCIDE__Group__7__Impl
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_COINCIDE__Group__7__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_CEP_COINCIDEAccess().getRightParenthesisKeyword_7()); }
+ ')'
+ { after(grammarAccess.getDSL_CEP_COINCIDEAccess().getRightParenthesisKeyword_7()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+
+rule__DSL_CEP_MIN__Group__0
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_CEP_MIN__Group__0__Impl
+ rule__DSL_CEP_MIN__Group__1
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_MIN__Group__0__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_CEP_MINAccess().getMinKeyword_0()); }
+ 'min'
+ { after(grammarAccess.getDSL_CEP_MINAccess().getMinKeyword_0()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_MIN__Group__1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_CEP_MIN__Group__1__Impl
+ rule__DSL_CEP_MIN__Group__2
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_MIN__Group__1__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_CEP_MINAccess().getLeftParenthesisKeyword_1()); }
+ '('
+ { after(grammarAccess.getDSL_CEP_MINAccess().getLeftParenthesisKeyword_1()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_MIN__Group__2
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_CEP_MIN__Group__2__Impl
+ rule__DSL_CEP_MIN__Group__3
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_MIN__Group__2__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_CEP_MINAccess().getRefAssignment_2()); }
+ (rule__DSL_CEP_MIN__RefAssignment_2)
+ { after(grammarAccess.getDSL_CEP_MINAccess().getRefAssignment_2()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_MIN__Group__3
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_CEP_MIN__Group__3__Impl
+ rule__DSL_CEP_MIN__Group__4
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_MIN__Group__3__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_CEP_MINAccess().getCommaKeyword_3()); }
+ ','
+ { after(grammarAccess.getDSL_CEP_MINAccess().getCommaKeyword_3()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_MIN__Group__4
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_CEP_MIN__Group__4__Impl
+ rule__DSL_CEP_MIN__Group__5
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_MIN__Group__4__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_CEP_MINAccess().getWindowAssignment_4()); }
+ (rule__DSL_CEP_MIN__WindowAssignment_4)
+ { after(grammarAccess.getDSL_CEP_MINAccess().getWindowAssignment_4()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_MIN__Group__5
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_CEP_MIN__Group__5__Impl
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_MIN__Group__5__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_CEP_MINAccess().getRightParenthesisKeyword_5()); }
+ ')'
+ { after(grammarAccess.getDSL_CEP_MINAccess().getRightParenthesisKeyword_5()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+
+rule__DSL_CEP_MAX__Group__0
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_CEP_MAX__Group__0__Impl
+ rule__DSL_CEP_MAX__Group__1
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_MAX__Group__0__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_CEP_MAXAccess().getMaxKeyword_0()); }
+ 'max'
+ { after(grammarAccess.getDSL_CEP_MAXAccess().getMaxKeyword_0()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_MAX__Group__1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_CEP_MAX__Group__1__Impl
+ rule__DSL_CEP_MAX__Group__2
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_MAX__Group__1__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_CEP_MAXAccess().getLeftParenthesisKeyword_1()); }
+ '('
+ { after(grammarAccess.getDSL_CEP_MAXAccess().getLeftParenthesisKeyword_1()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_MAX__Group__2
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_CEP_MAX__Group__2__Impl
+ rule__DSL_CEP_MAX__Group__3
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_MAX__Group__2__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_CEP_MAXAccess().getRefAssignment_2()); }
+ (rule__DSL_CEP_MAX__RefAssignment_2)
+ { after(grammarAccess.getDSL_CEP_MAXAccess().getRefAssignment_2()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_MAX__Group__3
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_CEP_MAX__Group__3__Impl
+ rule__DSL_CEP_MAX__Group__4
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_MAX__Group__3__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_CEP_MAXAccess().getCommaKeyword_3()); }
+ ','
+ { after(grammarAccess.getDSL_CEP_MAXAccess().getCommaKeyword_3()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_MAX__Group__4
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_CEP_MAX__Group__4__Impl
+ rule__DSL_CEP_MAX__Group__5
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_MAX__Group__4__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_CEP_MAXAccess().getWindowAssignment_4()); }
+ (rule__DSL_CEP_MAX__WindowAssignment_4)
+ { after(grammarAccess.getDSL_CEP_MAXAccess().getWindowAssignment_4()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_MAX__Group__5
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_CEP_MAX__Group__5__Impl
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_MAX__Group__5__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_CEP_MAXAccess().getRightParenthesisKeyword_5()); }
+ ')'
+ { after(grammarAccess.getDSL_CEP_MAXAccess().getRightParenthesisKeyword_5()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+
+rule__DSL_CEP_AVG__Group__0
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_CEP_AVG__Group__0__Impl
+ rule__DSL_CEP_AVG__Group__1
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_AVG__Group__0__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_CEP_AVGAccess().getAvgKeyword_0()); }
+ 'avg'
+ { after(grammarAccess.getDSL_CEP_AVGAccess().getAvgKeyword_0()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_AVG__Group__1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_CEP_AVG__Group__1__Impl
+ rule__DSL_CEP_AVG__Group__2
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_AVG__Group__1__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_CEP_AVGAccess().getLeftParenthesisKeyword_1()); }
+ '('
+ { after(grammarAccess.getDSL_CEP_AVGAccess().getLeftParenthesisKeyword_1()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_AVG__Group__2
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_CEP_AVG__Group__2__Impl
+ rule__DSL_CEP_AVG__Group__3
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_AVG__Group__2__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_CEP_AVGAccess().getRefAssignment_2()); }
+ (rule__DSL_CEP_AVG__RefAssignment_2)
+ { after(grammarAccess.getDSL_CEP_AVGAccess().getRefAssignment_2()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_AVG__Group__3
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_CEP_AVG__Group__3__Impl
+ rule__DSL_CEP_AVG__Group__4
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_AVG__Group__3__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_CEP_AVGAccess().getCommaKeyword_3()); }
+ ','
+ { after(grammarAccess.getDSL_CEP_AVGAccess().getCommaKeyword_3()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_AVG__Group__4
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_CEP_AVG__Group__4__Impl
+ rule__DSL_CEP_AVG__Group__5
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_AVG__Group__4__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_CEP_AVGAccess().getWindowAssignment_4()); }
+ (rule__DSL_CEP_AVG__WindowAssignment_4)
+ { after(grammarAccess.getDSL_CEP_AVGAccess().getWindowAssignment_4()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_AVG__Group__5
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_CEP_AVG__Group__5__Impl
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_AVG__Group__5__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_CEP_AVGAccess().getRightParenthesisKeyword_5()); }
+ ')'
+ { after(grammarAccess.getDSL_CEP_AVGAccess().getRightParenthesisKeyword_5()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+
+rule__DSL_CEP_SUM__Group__0
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_CEP_SUM__Group__0__Impl
+ rule__DSL_CEP_SUM__Group__1
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_SUM__Group__0__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_CEP_SUMAccess().getSumKeyword_0()); }
+ 'sum'
+ { after(grammarAccess.getDSL_CEP_SUMAccess().getSumKeyword_0()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_SUM__Group__1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_CEP_SUM__Group__1__Impl
+ rule__DSL_CEP_SUM__Group__2
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_SUM__Group__1__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_CEP_SUMAccess().getLeftParenthesisKeyword_1()); }
+ '('
+ { after(grammarAccess.getDSL_CEP_SUMAccess().getLeftParenthesisKeyword_1()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_SUM__Group__2
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_CEP_SUM__Group__2__Impl
+ rule__DSL_CEP_SUM__Group__3
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_SUM__Group__2__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_CEP_SUMAccess().getRefAssignment_2()); }
+ (rule__DSL_CEP_SUM__RefAssignment_2)
+ { after(grammarAccess.getDSL_CEP_SUMAccess().getRefAssignment_2()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_SUM__Group__3
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_CEP_SUM__Group__3__Impl
+ rule__DSL_CEP_SUM__Group__4
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_SUM__Group__3__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_CEP_SUMAccess().getCommaKeyword_3()); }
+ ','
+ { after(grammarAccess.getDSL_CEP_SUMAccess().getCommaKeyword_3()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_SUM__Group__4
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_CEP_SUM__Group__4__Impl
+ rule__DSL_CEP_SUM__Group__5
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_SUM__Group__4__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_CEP_SUMAccess().getWindowAssignment_4()); }
+ (rule__DSL_CEP_SUM__WindowAssignment_4)
+ { after(grammarAccess.getDSL_CEP_SUMAccess().getWindowAssignment_4()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_SUM__Group__5
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_CEP_SUM__Group__5__Impl
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_SUM__Group__5__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_CEP_SUMAccess().getRightParenthesisKeyword_5()); }
+ ')'
+ { after(grammarAccess.getDSL_CEP_SUMAccess().getRightParenthesisKeyword_5()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+
+rule__DSL_CEP_COUNT__Group__0
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_CEP_COUNT__Group__0__Impl
+ rule__DSL_CEP_COUNT__Group__1
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_COUNT__Group__0__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_CEP_COUNTAccess().getCountKeyword_0()); }
+ 'count'
+ { after(grammarAccess.getDSL_CEP_COUNTAccess().getCountKeyword_0()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_COUNT__Group__1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_CEP_COUNT__Group__1__Impl
+ rule__DSL_CEP_COUNT__Group__2
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_COUNT__Group__1__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_CEP_COUNTAccess().getLeftParenthesisKeyword_1()); }
+ '('
+ { after(grammarAccess.getDSL_CEP_COUNTAccess().getLeftParenthesisKeyword_1()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_COUNT__Group__2
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_CEP_COUNT__Group__2__Impl
+ rule__DSL_CEP_COUNT__Group__3
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_COUNT__Group__2__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_CEP_COUNTAccess().getRefAssignment_2()); }
+ (rule__DSL_CEP_COUNT__RefAssignment_2)
+ { after(grammarAccess.getDSL_CEP_COUNTAccess().getRefAssignment_2()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_COUNT__Group__3
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_CEP_COUNT__Group__3__Impl
+ rule__DSL_CEP_COUNT__Group__4
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_COUNT__Group__3__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_CEP_COUNTAccess().getCommaKeyword_3()); }
+ ','
+ { after(grammarAccess.getDSL_CEP_COUNTAccess().getCommaKeyword_3()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_COUNT__Group__4
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_CEP_COUNT__Group__4__Impl
+ rule__DSL_CEP_COUNT__Group__5
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_COUNT__Group__4__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_CEP_COUNTAccess().getWindowAssignment_4()); }
+ (rule__DSL_CEP_COUNT__WindowAssignment_4)
+ { after(grammarAccess.getDSL_CEP_COUNTAccess().getWindowAssignment_4()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_COUNT__Group__5
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_CEP_COUNT__Group__5__Impl
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_COUNT__Group__5__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_CEP_COUNTAccess().getRightParenthesisKeyword_5()); }
+ ')'
+ { after(grammarAccess.getDSL_CEP_COUNTAccess().getRightParenthesisKeyword_5()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+
+rule__DSL_CEP_DURATION_MIN__Group__0
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_CEP_DURATION_MIN__Group__0__Impl
+ rule__DSL_CEP_DURATION_MIN__Group__1
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_DURATION_MIN__Group__0__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_CEP_DURATION_MINAccess().getMinAssignment_0()); }
+ (rule__DSL_CEP_DURATION_MIN__MinAssignment_0)
+ { after(grammarAccess.getDSL_CEP_DURATION_MINAccess().getMinAssignment_0()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_DURATION_MIN__Group__1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_CEP_DURATION_MIN__Group__1__Impl
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_DURATION_MIN__Group__1__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_CEP_DURATION_MINAccess().getMinKeyword_1()); }
+ 'min'
+ { after(grammarAccess.getDSL_CEP_DURATION_MINAccess().getMinKeyword_1()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+
+rule__DSL_CEP_DURATION_SEC__Group__0
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_CEP_DURATION_SEC__Group__0__Impl
+ rule__DSL_CEP_DURATION_SEC__Group__1
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_DURATION_SEC__Group__0__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_CEP_DURATION_SECAccess().getSecAssignment_0()); }
+ (rule__DSL_CEP_DURATION_SEC__SecAssignment_0)
+ { after(grammarAccess.getDSL_CEP_DURATION_SECAccess().getSecAssignment_0()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_DURATION_SEC__Group__1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_CEP_DURATION_SEC__Group__1__Impl
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_DURATION_SEC__Group__1__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_CEP_DURATION_SECAccess().getSecKeyword_1()); }
+ 'sec'
+ { after(grammarAccess.getDSL_CEP_DURATION_SECAccess().getSecKeyword_1()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+
+rule__DSL_ListActions__Group__0
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_ListActions__Group__0__Impl
+ rule__DSL_ListActions__Group__1
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_ListActions__Group__0__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_ListActionsAccess().getActionListAssignment_0()); }
+ (rule__DSL_ListActions__ActionListAssignment_0)
+ { after(grammarAccess.getDSL_ListActionsAccess().getActionListAssignment_0()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_ListActions__Group__1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_ListActions__Group__1__Impl
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_ListActions__Group__1__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_ListActionsAccess().getGroup_1()); }
+ (rule__DSL_ListActions__Group_1__0)*
+ { after(grammarAccess.getDSL_ListActionsAccess().getGroup_1()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+
+rule__DSL_ListActions__Group_1__0
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_ListActions__Group_1__0__Impl
+ rule__DSL_ListActions__Group_1__1
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_ListActions__Group_1__0__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_ListActionsAccess().getCommaKeyword_1_0()); }
+ ','
+ { after(grammarAccess.getDSL_ListActionsAccess().getCommaKeyword_1_0()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_ListActions__Group_1__1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_ListActions__Group_1__1__Impl
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_ListActions__Group_1__1__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_ListActionsAccess().getActionListAssignment_1_1()); }
+ (rule__DSL_ListActions__ActionListAssignment_1_1)
+ { after(grammarAccess.getDSL_ListActionsAccess().getActionListAssignment_1_1()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+
+rule__DSL_ResourceAction__Group__0
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_ResourceAction__Group__0__Impl
+ rule__DSL_ResourceAction__Group__1
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_ResourceAction__Group__0__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_ResourceActionAccess().getGroup_0()); }
+ (rule__DSL_ResourceAction__Group_0__0)?
+ { after(grammarAccess.getDSL_ResourceActionAccess().getGroup_0()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_ResourceAction__Group__1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_ResourceAction__Group__1__Impl
+ rule__DSL_ResourceAction__Group__2
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_ResourceAction__Group__1__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_ResourceActionAccess().getRefAssignment_1()); }
+ (rule__DSL_ResourceAction__RefAssignment_1)
+ { after(grammarAccess.getDSL_ResourceActionAccess().getRefAssignment_1()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_ResourceAction__Group__2
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_ResourceAction__Group__2__Impl
+ rule__DSL_ResourceAction__Group__3
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_ResourceAction__Group__2__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_ResourceActionAccess().getFullStopKeyword_2()); }
+ '.'
+ { after(grammarAccess.getDSL_ResourceActionAccess().getFullStopKeyword_2()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_ResourceAction__Group__3
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_ResourceAction__Group__3__Impl
+ rule__DSL_ResourceAction__Group__4
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_ResourceAction__Group__3__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_ResourceActionAccess().getActiontypeAssignment_3()); }
+ (rule__DSL_ResourceAction__ActiontypeAssignment_3)
+ { after(grammarAccess.getDSL_ResourceActionAccess().getActiontypeAssignment_3()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_ResourceAction__Group__4
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_ResourceAction__Group__4__Impl
+ rule__DSL_ResourceAction__Group__5
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_ResourceAction__Group__4__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_ResourceActionAccess().getLeftParenthesisKeyword_4()); }
+ '('
+ { after(grammarAccess.getDSL_ResourceActionAccess().getLeftParenthesisKeyword_4()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_ResourceAction__Group__5
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_ResourceAction__Group__5__Impl
+ rule__DSL_ResourceAction__Group__6
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_ResourceAction__Group__5__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_ResourceActionAccess().getListParamAssignment_5()); }
+ (rule__DSL_ResourceAction__ListParamAssignment_5)?
+ { after(grammarAccess.getDSL_ResourceActionAccess().getListParamAssignment_5()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_ResourceAction__Group__6
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_ResourceAction__Group__6__Impl
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_ResourceAction__Group__6__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_ResourceActionAccess().getRightParenthesisKeyword_6()); }
+ ')'
+ { after(grammarAccess.getDSL_ResourceActionAccess().getRightParenthesisKeyword_6()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+
+rule__DSL_ResourceAction__Group_0__0
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_ResourceAction__Group_0__0__Impl
+ rule__DSL_ResourceAction__Group_0__1
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_ResourceAction__Group_0__0__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_ResourceActionAccess().getVariableAssignment_0_0()); }
+ (rule__DSL_ResourceAction__VariableAssignment_0_0)
+ { after(grammarAccess.getDSL_ResourceActionAccess().getVariableAssignment_0_0()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_ResourceAction__Group_0__1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_ResourceAction__Group_0__1__Impl
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_ResourceAction__Group_0__1__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_ResourceActionAccess().getEqualsSignKeyword_0_1()); }
+ '='
+ { after(grammarAccess.getDSL_ResourceActionAccess().getEqualsSignKeyword_0_1()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+
+rule__DSL_ListParam__Group__0
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_ListParam__Group__0__Impl
+ rule__DSL_ListParam__Group__1
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_ListParam__Group__0__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_ListParamAccess().getParamAssignment_0()); }
+ (rule__DSL_ListParam__ParamAssignment_0)
+ { after(grammarAccess.getDSL_ListParamAccess().getParamAssignment_0()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_ListParam__Group__1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_ListParam__Group__1__Impl
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_ListParam__Group__1__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_ListParamAccess().getGroup_1()); }
+ (rule__DSL_ListParam__Group_1__0)*
+ { after(grammarAccess.getDSL_ListParamAccess().getGroup_1()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+
+rule__DSL_ListParam__Group_1__0
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_ListParam__Group_1__0__Impl
+ rule__DSL_ListParam__Group_1__1
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_ListParam__Group_1__0__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_ListParamAccess().getCommaKeyword_1_0()); }
+ ','
+ { after(grammarAccess.getDSL_ListParamAccess().getCommaKeyword_1_0()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_ListParam__Group_1__1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_ListParam__Group_1__1__Impl
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_ListParam__Group_1__1__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_ListParamAccess().getParamAssignment_1_1()); }
+ (rule__DSL_ListParam__ParamAssignment_1_1)
+ { after(grammarAccess.getDSL_ListParamAccess().getParamAssignment_1_1()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+
+rule__DSL_Expression_Or__Group__0
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Expression_Or__Group__0__Impl
+ rule__DSL_Expression_Or__Group__1
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_Or__Group__0__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_Expression_OrAccess().getDSL_Expression_AndParserRuleCall_0()); }
+ ruleDSL_Expression_And
+ { after(grammarAccess.getDSL_Expression_OrAccess().getDSL_Expression_AndParserRuleCall_0()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_Or__Group__1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Expression_Or__Group__1__Impl
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_Or__Group__1__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_Expression_OrAccess().getGroup_1()); }
+ (rule__DSL_Expression_Or__Group_1__0)*
+ { after(grammarAccess.getDSL_Expression_OrAccess().getGroup_1()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+
+rule__DSL_Expression_Or__Group_1__0
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Expression_Or__Group_1__0__Impl
+ rule__DSL_Expression_Or__Group_1__1
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_Or__Group_1__0__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_Expression_OrAccess().getOrKeyword_1_0()); }
+ 'or'
+ { after(grammarAccess.getDSL_Expression_OrAccess().getOrKeyword_1_0()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_Or__Group_1__1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Expression_Or__Group_1__1__Impl
+ rule__DSL_Expression_Or__Group_1__2
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_Or__Group_1__1__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_Expression_OrAccess().getDSL_Expression_OrLeftAction_1_1()); }
+ ()
+ { after(grammarAccess.getDSL_Expression_OrAccess().getDSL_Expression_OrLeftAction_1_1()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_Or__Group_1__2
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Expression_Or__Group_1__2__Impl
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_Or__Group_1__2__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_Expression_OrAccess().getRightAssignment_1_2()); }
+ (rule__DSL_Expression_Or__RightAssignment_1_2)
+ { after(grammarAccess.getDSL_Expression_OrAccess().getRightAssignment_1_2()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+
+rule__DSL_Expression_And__Group__0
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Expression_And__Group__0__Impl
+ rule__DSL_Expression_And__Group__1
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_And__Group__0__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_Expression_AndAccess().getDSL_Expression_DiffEqualParserRuleCall_0()); }
+ ruleDSL_Expression_DiffEqual
+ { after(grammarAccess.getDSL_Expression_AndAccess().getDSL_Expression_DiffEqualParserRuleCall_0()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_And__Group__1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Expression_And__Group__1__Impl
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_And__Group__1__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_Expression_AndAccess().getGroup_1()); }
+ (rule__DSL_Expression_And__Group_1__0)*
+ { after(grammarAccess.getDSL_Expression_AndAccess().getGroup_1()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+
+rule__DSL_Expression_And__Group_1__0
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Expression_And__Group_1__0__Impl
+ rule__DSL_Expression_And__Group_1__1
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_And__Group_1__0__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_Expression_AndAccess().getAndKeyword_1_0()); }
+ 'and'
+ { after(grammarAccess.getDSL_Expression_AndAccess().getAndKeyword_1_0()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_And__Group_1__1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Expression_And__Group_1__1__Impl
+ rule__DSL_Expression_And__Group_1__2
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_And__Group_1__1__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_Expression_AndAccess().getDSL_Expression_AndLeftAction_1_1()); }
+ ()
+ { after(grammarAccess.getDSL_Expression_AndAccess().getDSL_Expression_AndLeftAction_1_1()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_And__Group_1__2
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Expression_And__Group_1__2__Impl
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_And__Group_1__2__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_Expression_AndAccess().getRightAssignment_1_2()); }
+ (rule__DSL_Expression_And__RightAssignment_1_2)
+ { after(grammarAccess.getDSL_Expression_AndAccess().getRightAssignment_1_2()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+
+rule__DSL_Expression_DiffEqual__Group__0
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Expression_DiffEqual__Group__0__Impl
+ rule__DSL_Expression_DiffEqual__Group__1
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_DiffEqual__Group__0__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_Expression_DiffEqualAccess().getDSL_Expression_CompareParserRuleCall_0()); }
+ ruleDSL_Expression_Compare
+ { after(grammarAccess.getDSL_Expression_DiffEqualAccess().getDSL_Expression_CompareParserRuleCall_0()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_DiffEqual__Group__1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Expression_DiffEqual__Group__1__Impl
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_DiffEqual__Group__1__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_Expression_DiffEqualAccess().getAlternatives_1()); }
+ (rule__DSL_Expression_DiffEqual__Alternatives_1)*
+ { after(grammarAccess.getDSL_Expression_DiffEqualAccess().getAlternatives_1()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+
+rule__DSL_Expression_DiffEqual__Group_1_0__0
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Expression_DiffEqual__Group_1_0__0__Impl
+ rule__DSL_Expression_DiffEqual__Group_1_0__1
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_DiffEqual__Group_1_0__0__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_Expression_DiffEqualAccess().getExclamationMarkEqualsSignKeyword_1_0_0()); }
+ '!='
+ { after(grammarAccess.getDSL_Expression_DiffEqualAccess().getExclamationMarkEqualsSignKeyword_1_0_0()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_DiffEqual__Group_1_0__1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Expression_DiffEqual__Group_1_0__1__Impl
+ rule__DSL_Expression_DiffEqual__Group_1_0__2
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_DiffEqual__Group_1_0__1__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_Expression_DiffEqualAccess().getDSL_Expression_DiffLeftAction_1_0_1()); }
+ ()
+ { after(grammarAccess.getDSL_Expression_DiffEqualAccess().getDSL_Expression_DiffLeftAction_1_0_1()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_DiffEqual__Group_1_0__2
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Expression_DiffEqual__Group_1_0__2__Impl
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_DiffEqual__Group_1_0__2__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_Expression_DiffEqualAccess().getRightAssignment_1_0_2()); }
+ (rule__DSL_Expression_DiffEqual__RightAssignment_1_0_2)
+ { after(grammarAccess.getDSL_Expression_DiffEqualAccess().getRightAssignment_1_0_2()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+
+rule__DSL_Expression_DiffEqual__Group_1_1__0
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Expression_DiffEqual__Group_1_1__0__Impl
+ rule__DSL_Expression_DiffEqual__Group_1_1__1
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_DiffEqual__Group_1_1__0__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_Expression_DiffEqualAccess().getEqualsSignEqualsSignKeyword_1_1_0()); }
+ '=='
+ { after(grammarAccess.getDSL_Expression_DiffEqualAccess().getEqualsSignEqualsSignKeyword_1_1_0()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_DiffEqual__Group_1_1__1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Expression_DiffEqual__Group_1_1__1__Impl
+ rule__DSL_Expression_DiffEqual__Group_1_1__2
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_DiffEqual__Group_1_1__1__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_Expression_DiffEqualAccess().getDSL_Expression_EqualLeftAction_1_1_1()); }
+ ()
+ { after(grammarAccess.getDSL_Expression_DiffEqualAccess().getDSL_Expression_EqualLeftAction_1_1_1()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_DiffEqual__Group_1_1__2
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Expression_DiffEqual__Group_1_1__2__Impl
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_DiffEqual__Group_1_1__2__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_Expression_DiffEqualAccess().getRightAssignment_1_1_2()); }
+ (rule__DSL_Expression_DiffEqual__RightAssignment_1_1_2)
+ { after(grammarAccess.getDSL_Expression_DiffEqualAccess().getRightAssignment_1_1_2()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+
+rule__DSL_Expression_Compare__Group__0
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Expression_Compare__Group__0__Impl
+ rule__DSL_Expression_Compare__Group__1
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_Compare__Group__0__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_Expression_CompareAccess().getDSL_Expression_PlusMinusParserRuleCall_0()); }
+ ruleDSL_Expression_PlusMinus
+ { after(grammarAccess.getDSL_Expression_CompareAccess().getDSL_Expression_PlusMinusParserRuleCall_0()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_Compare__Group__1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Expression_Compare__Group__1__Impl
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_Compare__Group__1__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_Expression_CompareAccess().getAlternatives_1()); }
+ (rule__DSL_Expression_Compare__Alternatives_1)*
+ { after(grammarAccess.getDSL_Expression_CompareAccess().getAlternatives_1()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+
+rule__DSL_Expression_Compare__Group_1_0__0
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Expression_Compare__Group_1_0__0__Impl
+ rule__DSL_Expression_Compare__Group_1_0__1
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_Compare__Group_1_0__0__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_Expression_CompareAccess().getGreaterThanSignKeyword_1_0_0()); }
+ '>'
+ { after(grammarAccess.getDSL_Expression_CompareAccess().getGreaterThanSignKeyword_1_0_0()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_Compare__Group_1_0__1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Expression_Compare__Group_1_0__1__Impl
+ rule__DSL_Expression_Compare__Group_1_0__2
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_Compare__Group_1_0__1__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_Expression_CompareAccess().getDSL_Expression_LargerLeftAction_1_0_1()); }
+ ()
+ { after(grammarAccess.getDSL_Expression_CompareAccess().getDSL_Expression_LargerLeftAction_1_0_1()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_Compare__Group_1_0__2
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Expression_Compare__Group_1_0__2__Impl
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_Compare__Group_1_0__2__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_Expression_CompareAccess().getRightAssignment_1_0_2()); }
+ (rule__DSL_Expression_Compare__RightAssignment_1_0_2)
+ { after(grammarAccess.getDSL_Expression_CompareAccess().getRightAssignment_1_0_2()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+
+rule__DSL_Expression_Compare__Group_1_1__0
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Expression_Compare__Group_1_1__0__Impl
+ rule__DSL_Expression_Compare__Group_1_1__1
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_Compare__Group_1_1__0__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_Expression_CompareAccess().getGreaterThanSignEqualsSignKeyword_1_1_0()); }
+ '>='
+ { after(grammarAccess.getDSL_Expression_CompareAccess().getGreaterThanSignEqualsSignKeyword_1_1_0()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_Compare__Group_1_1__1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Expression_Compare__Group_1_1__1__Impl
+ rule__DSL_Expression_Compare__Group_1_1__2
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_Compare__Group_1_1__1__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_Expression_CompareAccess().getDSL_Expression_Larger_EqualLeftAction_1_1_1()); }
+ ()
+ { after(grammarAccess.getDSL_Expression_CompareAccess().getDSL_Expression_Larger_EqualLeftAction_1_1_1()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_Compare__Group_1_1__2
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Expression_Compare__Group_1_1__2__Impl
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_Compare__Group_1_1__2__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_Expression_CompareAccess().getRightAssignment_1_1_2()); }
+ (rule__DSL_Expression_Compare__RightAssignment_1_1_2)
+ { after(grammarAccess.getDSL_Expression_CompareAccess().getRightAssignment_1_1_2()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+
+rule__DSL_Expression_Compare__Group_1_2__0
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Expression_Compare__Group_1_2__0__Impl
+ rule__DSL_Expression_Compare__Group_1_2__1
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_Compare__Group_1_2__0__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_Expression_CompareAccess().getLessThanSignKeyword_1_2_0()); }
+ '<'
+ { after(grammarAccess.getDSL_Expression_CompareAccess().getLessThanSignKeyword_1_2_0()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_Compare__Group_1_2__1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Expression_Compare__Group_1_2__1__Impl
+ rule__DSL_Expression_Compare__Group_1_2__2
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_Compare__Group_1_2__1__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_Expression_CompareAccess().getDSL_Expression_SmallerLeftAction_1_2_1()); }
+ ()
+ { after(grammarAccess.getDSL_Expression_CompareAccess().getDSL_Expression_SmallerLeftAction_1_2_1()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_Compare__Group_1_2__2
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Expression_Compare__Group_1_2__2__Impl
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_Compare__Group_1_2__2__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_Expression_CompareAccess().getRightAssignment_1_2_2()); }
+ (rule__DSL_Expression_Compare__RightAssignment_1_2_2)
+ { after(grammarAccess.getDSL_Expression_CompareAccess().getRightAssignment_1_2_2()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+
+rule__DSL_Expression_Compare__Group_1_3__0
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Expression_Compare__Group_1_3__0__Impl
+ rule__DSL_Expression_Compare__Group_1_3__1
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_Compare__Group_1_3__0__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_Expression_CompareAccess().getLessThanSignEqualsSignKeyword_1_3_0()); }
+ '<='
+ { after(grammarAccess.getDSL_Expression_CompareAccess().getLessThanSignEqualsSignKeyword_1_3_0()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_Compare__Group_1_3__1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Expression_Compare__Group_1_3__1__Impl
+ rule__DSL_Expression_Compare__Group_1_3__2
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_Compare__Group_1_3__1__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_Expression_CompareAccess().getDSL_Expression_Smaller_EqualLeftAction_1_3_1()); }
+ ()
+ { after(grammarAccess.getDSL_Expression_CompareAccess().getDSL_Expression_Smaller_EqualLeftAction_1_3_1()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_Compare__Group_1_3__2
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Expression_Compare__Group_1_3__2__Impl
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_Compare__Group_1_3__2__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_Expression_CompareAccess().getRightAssignment_1_3_2()); }
+ (rule__DSL_Expression_Compare__RightAssignment_1_3_2)
+ { after(grammarAccess.getDSL_Expression_CompareAccess().getRightAssignment_1_3_2()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+
+rule__DSL_Expression_PlusMinus__Group__0
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Expression_PlusMinus__Group__0__Impl
+ rule__DSL_Expression_PlusMinus__Group__1
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_PlusMinus__Group__0__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_Expression_PlusMinusAccess().getDSL_Expression_MultiplicationDivisionParserRuleCall_0()); }
+ ruleDSL_Expression_MultiplicationDivision
+ { after(grammarAccess.getDSL_Expression_PlusMinusAccess().getDSL_Expression_MultiplicationDivisionParserRuleCall_0()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_PlusMinus__Group__1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Expression_PlusMinus__Group__1__Impl
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_PlusMinus__Group__1__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_Expression_PlusMinusAccess().getAlternatives_1()); }
+ (rule__DSL_Expression_PlusMinus__Alternatives_1)*
+ { after(grammarAccess.getDSL_Expression_PlusMinusAccess().getAlternatives_1()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+
+rule__DSL_Expression_PlusMinus__Group_1_0__0
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Expression_PlusMinus__Group_1_0__0__Impl
+ rule__DSL_Expression_PlusMinus__Group_1_0__1
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_PlusMinus__Group_1_0__0__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_Expression_PlusMinusAccess().getPlusSignKeyword_1_0_0()); }
+ '+'
+ { after(grammarAccess.getDSL_Expression_PlusMinusAccess().getPlusSignKeyword_1_0_0()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_PlusMinus__Group_1_0__1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Expression_PlusMinus__Group_1_0__1__Impl
+ rule__DSL_Expression_PlusMinus__Group_1_0__2
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_PlusMinus__Group_1_0__1__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_Expression_PlusMinusAccess().getDSL_Expression_PlusLeftAction_1_0_1()); }
+ ()
+ { after(grammarAccess.getDSL_Expression_PlusMinusAccess().getDSL_Expression_PlusLeftAction_1_0_1()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_PlusMinus__Group_1_0__2
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Expression_PlusMinus__Group_1_0__2__Impl
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_PlusMinus__Group_1_0__2__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_Expression_PlusMinusAccess().getRightAssignment_1_0_2()); }
+ (rule__DSL_Expression_PlusMinus__RightAssignment_1_0_2)
+ { after(grammarAccess.getDSL_Expression_PlusMinusAccess().getRightAssignment_1_0_2()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+
+rule__DSL_Expression_PlusMinus__Group_1_1__0
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Expression_PlusMinus__Group_1_1__0__Impl
+ rule__DSL_Expression_PlusMinus__Group_1_1__1
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_PlusMinus__Group_1_1__0__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_Expression_PlusMinusAccess().getHyphenMinusKeyword_1_1_0()); }
+ '-'
+ { after(grammarAccess.getDSL_Expression_PlusMinusAccess().getHyphenMinusKeyword_1_1_0()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_PlusMinus__Group_1_1__1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Expression_PlusMinus__Group_1_1__1__Impl
+ rule__DSL_Expression_PlusMinus__Group_1_1__2
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_PlusMinus__Group_1_1__1__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_Expression_PlusMinusAccess().getDSL_Expression_MinusLeftAction_1_1_1()); }
+ ()
+ { after(grammarAccess.getDSL_Expression_PlusMinusAccess().getDSL_Expression_MinusLeftAction_1_1_1()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_PlusMinus__Group_1_1__2
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Expression_PlusMinus__Group_1_1__2__Impl
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_PlusMinus__Group_1_1__2__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_Expression_PlusMinusAccess().getRightAssignment_1_1_2()); }
+ (rule__DSL_Expression_PlusMinus__RightAssignment_1_1_2)
+ { after(grammarAccess.getDSL_Expression_PlusMinusAccess().getRightAssignment_1_1_2()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+
+rule__DSL_Expression_MultiplicationDivision__Group__0
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Expression_MultiplicationDivision__Group__0__Impl
+ rule__DSL_Expression_MultiplicationDivision__Group__1
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_MultiplicationDivision__Group__0__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getDSL_Expression_UnaryParserRuleCall_0()); }
+ ruleDSL_Expression_Unary
+ { after(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getDSL_Expression_UnaryParserRuleCall_0()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_MultiplicationDivision__Group__1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Expression_MultiplicationDivision__Group__1__Impl
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_MultiplicationDivision__Group__1__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getAlternatives_1()); }
+ (rule__DSL_Expression_MultiplicationDivision__Alternatives_1)*
+ { after(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getAlternatives_1()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+
+rule__DSL_Expression_MultiplicationDivision__Group_1_0__0
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Expression_MultiplicationDivision__Group_1_0__0__Impl
+ rule__DSL_Expression_MultiplicationDivision__Group_1_0__1
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_MultiplicationDivision__Group_1_0__0__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getAsteriskKeyword_1_0_0()); }
+ '*'
+ { after(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getAsteriskKeyword_1_0_0()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_MultiplicationDivision__Group_1_0__1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Expression_MultiplicationDivision__Group_1_0__1__Impl
+ rule__DSL_Expression_MultiplicationDivision__Group_1_0__2
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_MultiplicationDivision__Group_1_0__1__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getDSL_Expression_MultiplicationLeftAction_1_0_1()); }
+ ()
+ { after(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getDSL_Expression_MultiplicationLeftAction_1_0_1()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_MultiplicationDivision__Group_1_0__2
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Expression_MultiplicationDivision__Group_1_0__2__Impl
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_MultiplicationDivision__Group_1_0__2__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getRightAssignment_1_0_2()); }
+ (rule__DSL_Expression_MultiplicationDivision__RightAssignment_1_0_2)
+ { after(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getRightAssignment_1_0_2()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+
+rule__DSL_Expression_MultiplicationDivision__Group_1_1__0
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Expression_MultiplicationDivision__Group_1_1__0__Impl
+ rule__DSL_Expression_MultiplicationDivision__Group_1_1__1
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_MultiplicationDivision__Group_1_1__0__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getSolidusKeyword_1_1_0()); }
+ '/'
+ { after(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getSolidusKeyword_1_1_0()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_MultiplicationDivision__Group_1_1__1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Expression_MultiplicationDivision__Group_1_1__1__Impl
+ rule__DSL_Expression_MultiplicationDivision__Group_1_1__2
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_MultiplicationDivision__Group_1_1__1__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getDSL_Expression_DivisionLeftAction_1_1_1()); }
+ ()
+ { after(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getDSL_Expression_DivisionLeftAction_1_1_1()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_MultiplicationDivision__Group_1_1__2
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Expression_MultiplicationDivision__Group_1_1__2__Impl
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_MultiplicationDivision__Group_1_1__2__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getRightAssignment_1_1_2()); }
+ (rule__DSL_Expression_MultiplicationDivision__RightAssignment_1_1_2)
+ { after(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getRightAssignment_1_1_2()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+
+rule__DSL_Expression_MultiplicationDivision__Group_1_2__0
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Expression_MultiplicationDivision__Group_1_2__0__Impl
+ rule__DSL_Expression_MultiplicationDivision__Group_1_2__1
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_MultiplicationDivision__Group_1_2__0__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getPercentSignKeyword_1_2_0()); }
+ '%'
+ { after(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getPercentSignKeyword_1_2_0()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_MultiplicationDivision__Group_1_2__1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Expression_MultiplicationDivision__Group_1_2__1__Impl
+ rule__DSL_Expression_MultiplicationDivision__Group_1_2__2
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_MultiplicationDivision__Group_1_2__1__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getDSL_Expression_ModuloLeftAction_1_2_1()); }
+ ()
+ { after(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getDSL_Expression_ModuloLeftAction_1_2_1()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_MultiplicationDivision__Group_1_2__2
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Expression_MultiplicationDivision__Group_1_2__2__Impl
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_MultiplicationDivision__Group_1_2__2__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getRightAssignment_1_2_2()); }
+ (rule__DSL_Expression_MultiplicationDivision__RightAssignment_1_2_2)
+ { after(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getRightAssignment_1_2_2()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+
+rule__DSL_Expression_Unary__Group_0__0
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Expression_Unary__Group_0__0__Impl
+ rule__DSL_Expression_Unary__Group_0__1
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_Unary__Group_0__0__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_Expression_UnaryAccess().getDSL_Object_NumberAction_0_0()); }
+ ()
+ { after(grammarAccess.getDSL_Expression_UnaryAccess().getDSL_Object_NumberAction_0_0()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_Unary__Group_0__1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Expression_Unary__Group_0__1__Impl
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_Unary__Group_0__1__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_Expression_UnaryAccess().getValueAssignment_0_1()); }
+ (rule__DSL_Expression_Unary__ValueAssignment_0_1)
+ { after(grammarAccess.getDSL_Expression_UnaryAccess().getValueAssignment_0_1()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+
+rule__DSL_Expression_Unary__Group_1__0
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Expression_Unary__Group_1__0__Impl
+ rule__DSL_Expression_Unary__Group_1__1
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_Unary__Group_1__0__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_Expression_UnaryAccess().getDSL_Object_StringAction_1_0()); }
+ ()
+ { after(grammarAccess.getDSL_Expression_UnaryAccess().getDSL_Object_StringAction_1_0()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_Unary__Group_1__1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Expression_Unary__Group_1__1__Impl
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_Unary__Group_1__1__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_Expression_UnaryAccess().getValueAssignment_1_1()); }
+ (rule__DSL_Expression_Unary__ValueAssignment_1_1)
+ { after(grammarAccess.getDSL_Expression_UnaryAccess().getValueAssignment_1_1()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+
+rule__DSL_Expression_Unary__Group_2__0
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Expression_Unary__Group_2__0__Impl
+ rule__DSL_Expression_Unary__Group_2__1
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_Unary__Group_2__0__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_Expression_UnaryAccess().getDSL_Object_BooleanAction_2_0()); }
+ ()
+ { after(grammarAccess.getDSL_Expression_UnaryAccess().getDSL_Object_BooleanAction_2_0()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_Unary__Group_2__1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Expression_Unary__Group_2__1__Impl
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_Unary__Group_2__1__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_Expression_UnaryAccess().getValueAssignment_2_1()); }
+ (rule__DSL_Expression_Unary__ValueAssignment_2_1)
+ { after(grammarAccess.getDSL_Expression_UnaryAccess().getValueAssignment_2_1()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+
+rule__DSL_Expression_Unary__Group_3__0
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Expression_Unary__Group_3__0__Impl
+ rule__DSL_Expression_Unary__Group_3__1
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_Unary__Group_3__0__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_Expression_UnaryAccess().getDSL_Object_RefAction_3_0()); }
+ ()
+ { after(grammarAccess.getDSL_Expression_UnaryAccess().getDSL_Object_RefAction_3_0()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_Unary__Group_3__1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Expression_Unary__Group_3__1__Impl
+ rule__DSL_Expression_Unary__Group_3__2
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_Unary__Group_3__1__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_Expression_UnaryAccess().getValueAssignment_3_1()); }
+ (rule__DSL_Expression_Unary__ValueAssignment_3_1)
+ { after(grammarAccess.getDSL_Expression_UnaryAccess().getValueAssignment_3_1()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_Unary__Group_3__2
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Expression_Unary__Group_3__2__Impl
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_Unary__Group_3__2__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_Expression_UnaryAccess().getGetKeyword_3_2()); }
+ '.get()'
+ { after(grammarAccess.getDSL_Expression_UnaryAccess().getGetKeyword_3_2()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+
+rule__DSL_Expression_Unary__Group_4__0
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Expression_Unary__Group_4__0__Impl
+ rule__DSL_Expression_Unary__Group_4__1
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_Unary__Group_4__0__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_Expression_UnaryAccess().getLeftParenthesisKeyword_4_0()); }
+ '('
+ { after(grammarAccess.getDSL_Expression_UnaryAccess().getLeftParenthesisKeyword_4_0()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_Unary__Group_4__1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Expression_Unary__Group_4__1__Impl
+ rule__DSL_Expression_Unary__Group_4__2
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_Unary__Group_4__1__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_Expression_UnaryAccess().getDSL_Expression_OrParserRuleCall_4_1()); }
+ ruleDSL_Expression_Or
+ { after(grammarAccess.getDSL_Expression_UnaryAccess().getDSL_Expression_OrParserRuleCall_4_1()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_Unary__Group_4__2
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Expression_Unary__Group_4__2__Impl
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_Unary__Group_4__2__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_Expression_UnaryAccess().getRightParenthesisKeyword_4_2()); }
+ ')'
+ { after(grammarAccess.getDSL_Expression_UnaryAccess().getRightParenthesisKeyword_4_2()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+
+rule__DSL_Expression_Unary__Group_5__0
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Expression_Unary__Group_5__0__Impl
+ rule__DSL_Expression_Unary__Group_5__1
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_Unary__Group_5__0__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_Expression_UnaryAccess().getNotKeyword_5_0()); }
+ 'not'
+ { after(grammarAccess.getDSL_Expression_UnaryAccess().getNotKeyword_5_0()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_Unary__Group_5__1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Expression_Unary__Group_5__1__Impl
+ rule__DSL_Expression_Unary__Group_5__2
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_Unary__Group_5__1__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_Expression_UnaryAccess().getDSL_Expression_NegateAction_5_1()); }
+ ()
+ { after(grammarAccess.getDSL_Expression_UnaryAccess().getDSL_Expression_NegateAction_5_1()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_Unary__Group_5__2
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ rule__DSL_Expression_Unary__Group_5__2__Impl
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_Unary__Group_5__2__Impl
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+(
+ { before(grammarAccess.getDSL_Expression_UnaryAccess().getExpAssignment_5_2()); }
+ (rule__DSL_Expression_Unary__ExpAssignment_5_2)
+ { after(grammarAccess.getDSL_Expression_UnaryAccess().getExpAssignment_5_2()); }
+)
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+
+rule__Sensinact__EcaAssignment_1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getSensinactAccess().getEcaDSL_SENSINACTParserRuleCall_1_0()); }
+ ruleDSL_SENSINACT
+ { after(grammarAccess.getSensinactAccess().getEcaDSL_SENSINACTParserRuleCall_1_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_SENSINACT__ResourcesAssignment_0
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_SENSINACTAccess().getResourcesDSL_ResourceParserRuleCall_0_0()); }
+ ruleDSL_Resource
+ { after(grammarAccess.getDSL_SENSINACTAccess().getResourcesDSL_ResourceParserRuleCall_0_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_SENSINACT__CepAssignment_1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_SENSINACTAccess().getCepDSL_CEP_STATEMENTParserRuleCall_1_0()); }
+ ruleDSL_CEP_STATEMENT
+ { after(grammarAccess.getDSL_SENSINACTAccess().getCepDSL_CEP_STATEMENTParserRuleCall_1_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_SENSINACT__OnAssignment_2
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_SENSINACTAccess().getOnDSL_OnParserRuleCall_2_0()); }
+ ruleDSL_On
+ { after(grammarAccess.getDSL_SENSINACTAccess().getOnDSL_OnParserRuleCall_2_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_SENSINACT__EcaAssignment_3
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_SENSINACTAccess().getEcaDSL_ECA_STATEMENTParserRuleCall_3_0()); }
+ ruleDSL_ECA_STATEMENT
+ { after(grammarAccess.getDSL_SENSINACTAccess().getEcaDSL_ECA_STATEMENTParserRuleCall_3_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Resource__NameAssignment_1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_ResourceAccess().getNameIDTerminalRuleCall_1_0()); }
+ RULE_ID
+ { after(grammarAccess.getDSL_ResourceAccess().getNameIDTerminalRuleCall_1_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Resource__GatewayIDAssignment_4
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_ResourceAccess().getGatewayIDEXTENDED_IDParserRuleCall_4_0()); }
+ ruleEXTENDED_ID
+ { after(grammarAccess.getDSL_ResourceAccess().getGatewayIDEXTENDED_IDParserRuleCall_4_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Resource__DeviceIDAssignment_6
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_ResourceAccess().getDeviceIDEXTENDED_IDParserRuleCall_6_0()); }
+ ruleEXTENDED_ID
+ { after(grammarAccess.getDSL_ResourceAccess().getDeviceIDEXTENDED_IDParserRuleCall_6_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Resource__ServiceIDAssignment_8
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_ResourceAccess().getServiceIDEXTENDED_IDParserRuleCall_8_0()); }
+ ruleEXTENDED_ID
+ { after(grammarAccess.getDSL_ResourceAccess().getServiceIDEXTENDED_IDParserRuleCall_8_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Resource__ResourceIDAssignment_10
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_ResourceAccess().getResourceIDEXTENDED_IDParserRuleCall_10_0()); }
+ ruleEXTENDED_ID
+ { after(grammarAccess.getDSL_ResourceAccess().getResourceIDEXTENDED_IDParserRuleCall_10_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_On__TriggersAssignment_1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_OnAccess().getTriggersDSL_REF_CONDITIONParserRuleCall_1_0()); }
+ ruleDSL_REF_CONDITION
+ { after(grammarAccess.getDSL_OnAccess().getTriggersDSL_REF_CONDITIONParserRuleCall_1_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_On__TriggersAssignment_2_1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_OnAccess().getTriggersDSL_REF_CONDITIONParserRuleCall_2_1_0()); }
+ ruleDSL_REF_CONDITION
+ { after(grammarAccess.getDSL_OnAccess().getTriggersDSL_REF_CONDITIONParserRuleCall_2_1_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_ECA_STATEMENT__IfdoAssignment_0
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_ECA_STATEMENTAccess().getIfdoDSL_IfDoParserRuleCall_0_0()); }
+ ruleDSL_IfDo
+ { after(grammarAccess.getDSL_ECA_STATEMENTAccess().getIfdoDSL_IfDoParserRuleCall_0_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_ECA_STATEMENT__ElseIfdoAssignment_1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_ECA_STATEMENTAccess().getElseIfdoDSL_ElseIfDoParserRuleCall_1_0()); }
+ ruleDSL_ElseIfDo
+ { after(grammarAccess.getDSL_ECA_STATEMENTAccess().getElseIfdoDSL_ElseIfDoParserRuleCall_1_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_ECA_STATEMENT__ElsedoAssignment_2
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_ECA_STATEMENTAccess().getElsedoDSL_ElseDoParserRuleCall_2_0()); }
+ ruleDSL_ElseDo
+ { after(grammarAccess.getDSL_ECA_STATEMENTAccess().getElsedoDSL_ElseDoParserRuleCall_2_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_IfDo__ConditionAssignment_1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_IfDoAccess().getConditionDSL_Expression_OrParserRuleCall_1_0()); }
+ ruleDSL_Expression_Or
+ { after(grammarAccess.getDSL_IfDoAccess().getConditionDSL_Expression_OrParserRuleCall_1_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_IfDo__ActionsAssignment_3
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_IfDoAccess().getActionsDSL_ListActionsParserRuleCall_3_0()); }
+ ruleDSL_ListActions
+ { after(grammarAccess.getDSL_IfDoAccess().getActionsDSL_ListActionsParserRuleCall_3_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_ElseIfDo__ConditionAssignment_1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_ElseIfDoAccess().getConditionDSL_Expression_OrParserRuleCall_1_0()); }
+ ruleDSL_Expression_Or
+ { after(grammarAccess.getDSL_ElseIfDoAccess().getConditionDSL_Expression_OrParserRuleCall_1_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_ElseIfDo__ActionsAssignment_3
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_ElseIfDoAccess().getActionsDSL_ListActionsParserRuleCall_3_0()); }
+ ruleDSL_ListActions
+ { after(grammarAccess.getDSL_ElseIfDoAccess().getActionsDSL_ListActionsParserRuleCall_3_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_ElseDo__ActionsAssignment_1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_ElseDoAccess().getActionsDSL_ListActionsParserRuleCall_1_0()); }
+ ruleDSL_ListActions
+ { after(grammarAccess.getDSL_ElseDoAccess().getActionsDSL_ListActionsParserRuleCall_1_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_REF_CONDITION__RefAssignment_0
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_REF_CONDITIONAccess().getRefDSL_REFCrossReference_0_0()); }
+ (
+ { before(grammarAccess.getDSL_REF_CONDITIONAccess().getRefDSL_REFIDTerminalRuleCall_0_0_1()); }
+ RULE_ID
+ { after(grammarAccess.getDSL_REF_CONDITIONAccess().getRefDSL_REFIDTerminalRuleCall_0_0_1()); }
+ )
+ { after(grammarAccess.getDSL_REF_CONDITIONAccess().getRefDSL_REFCrossReference_0_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_STATEMENT__NameAssignment_1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_CEP_STATEMENTAccess().getNameIDTerminalRuleCall_1_0()); }
+ RULE_ID
+ { after(grammarAccess.getDSL_CEP_STATEMENTAccess().getNameIDTerminalRuleCall_1_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_STATEMENT__OperationAssignment_3
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_CEP_STATEMENTAccess().getOperationAlternatives_3_0()); }
+ (rule__DSL_CEP_STATEMENT__OperationAlternatives_3_0)
+ { after(grammarAccess.getDSL_CEP_STATEMENTAccess().getOperationAlternatives_3_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_AFTER__Ref1Assignment_2
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_CEP_AFTERAccess().getRef1DSL_REF_CONDITIONParserRuleCall_2_0()); }
+ ruleDSL_REF_CONDITION
+ { after(grammarAccess.getDSL_CEP_AFTERAccess().getRef1DSL_REF_CONDITIONParserRuleCall_2_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_AFTER__Ref2Assignment_4
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_CEP_AFTERAccess().getRef2DSL_REF_CONDITIONParserRuleCall_4_0()); }
+ ruleDSL_REF_CONDITION
+ { after(grammarAccess.getDSL_CEP_AFTERAccess().getRef2DSL_REF_CONDITIONParserRuleCall_4_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_AFTER__StartAssignment_6_0
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_CEP_AFTERAccess().getStartDSL_CEP_DURATIONParserRuleCall_6_0_0()); }
+ ruleDSL_CEP_DURATION
+ { after(grammarAccess.getDSL_CEP_AFTERAccess().getStartDSL_CEP_DURATIONParserRuleCall_6_0_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_AFTER__EndAssignment_7
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_CEP_AFTERAccess().getEndDSL_CEP_DURATIONParserRuleCall_7_0()); }
+ ruleDSL_CEP_DURATION
+ { after(grammarAccess.getDSL_CEP_AFTERAccess().getEndDSL_CEP_DURATIONParserRuleCall_7_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_BEFORE__Ref1Assignment_2
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_CEP_BEFOREAccess().getRef1DSL_REF_CONDITIONParserRuleCall_2_0()); }
+ ruleDSL_REF_CONDITION
+ { after(grammarAccess.getDSL_CEP_BEFOREAccess().getRef1DSL_REF_CONDITIONParserRuleCall_2_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_BEFORE__Ref2Assignment_4
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_CEP_BEFOREAccess().getRef2DSL_REF_CONDITIONParserRuleCall_4_0()); }
+ ruleDSL_REF_CONDITION
+ { after(grammarAccess.getDSL_CEP_BEFOREAccess().getRef2DSL_REF_CONDITIONParserRuleCall_4_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_BEFORE__StartAssignment_6_0
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_CEP_BEFOREAccess().getStartDSL_CEP_DURATIONParserRuleCall_6_0_0()); }
+ ruleDSL_CEP_DURATION
+ { after(grammarAccess.getDSL_CEP_BEFOREAccess().getStartDSL_CEP_DURATIONParserRuleCall_6_0_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_BEFORE__EndAssignment_7
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_CEP_BEFOREAccess().getEndDSL_CEP_DURATIONParserRuleCall_7_0()); }
+ ruleDSL_CEP_DURATION
+ { after(grammarAccess.getDSL_CEP_BEFOREAccess().getEndDSL_CEP_DURATIONParserRuleCall_7_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_COINCIDE__Ref1Assignment_2
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_CEP_COINCIDEAccess().getRef1DSL_REF_CONDITIONParserRuleCall_2_0()); }
+ ruleDSL_REF_CONDITION
+ { after(grammarAccess.getDSL_CEP_COINCIDEAccess().getRef1DSL_REF_CONDITIONParserRuleCall_2_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_COINCIDE__Ref2Assignment_4
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_CEP_COINCIDEAccess().getRef2DSL_REF_CONDITIONParserRuleCall_4_0()); }
+ ruleDSL_REF_CONDITION
+ { after(grammarAccess.getDSL_CEP_COINCIDEAccess().getRef2DSL_REF_CONDITIONParserRuleCall_4_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_COINCIDE__WindowAssignment_6
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_CEP_COINCIDEAccess().getWindowDSL_CEP_DURATIONParserRuleCall_6_0()); }
+ ruleDSL_CEP_DURATION
+ { after(grammarAccess.getDSL_CEP_COINCIDEAccess().getWindowDSL_CEP_DURATIONParserRuleCall_6_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_MIN__RefAssignment_2
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_CEP_MINAccess().getRefDSL_REF_CONDITIONParserRuleCall_2_0()); }
+ ruleDSL_REF_CONDITION
+ { after(grammarAccess.getDSL_CEP_MINAccess().getRefDSL_REF_CONDITIONParserRuleCall_2_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_MIN__WindowAssignment_4
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_CEP_MINAccess().getWindowDSL_CEP_DURATIONParserRuleCall_4_0()); }
+ ruleDSL_CEP_DURATION
+ { after(grammarAccess.getDSL_CEP_MINAccess().getWindowDSL_CEP_DURATIONParserRuleCall_4_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_MAX__RefAssignment_2
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_CEP_MAXAccess().getRefDSL_REF_CONDITIONParserRuleCall_2_0()); }
+ ruleDSL_REF_CONDITION
+ { after(grammarAccess.getDSL_CEP_MAXAccess().getRefDSL_REF_CONDITIONParserRuleCall_2_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_MAX__WindowAssignment_4
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_CEP_MAXAccess().getWindowDSL_CEP_DURATIONParserRuleCall_4_0()); }
+ ruleDSL_CEP_DURATION
+ { after(grammarAccess.getDSL_CEP_MAXAccess().getWindowDSL_CEP_DURATIONParserRuleCall_4_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_AVG__RefAssignment_2
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_CEP_AVGAccess().getRefDSL_REF_CONDITIONParserRuleCall_2_0()); }
+ ruleDSL_REF_CONDITION
+ { after(grammarAccess.getDSL_CEP_AVGAccess().getRefDSL_REF_CONDITIONParserRuleCall_2_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_AVG__WindowAssignment_4
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_CEP_AVGAccess().getWindowDSL_CEP_DURATIONParserRuleCall_4_0()); }
+ ruleDSL_CEP_DURATION
+ { after(grammarAccess.getDSL_CEP_AVGAccess().getWindowDSL_CEP_DURATIONParserRuleCall_4_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_SUM__RefAssignment_2
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_CEP_SUMAccess().getRefDSL_REF_CONDITIONParserRuleCall_2_0()); }
+ ruleDSL_REF_CONDITION
+ { after(grammarAccess.getDSL_CEP_SUMAccess().getRefDSL_REF_CONDITIONParserRuleCall_2_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_SUM__WindowAssignment_4
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_CEP_SUMAccess().getWindowDSL_CEP_DURATIONParserRuleCall_4_0()); }
+ ruleDSL_CEP_DURATION
+ { after(grammarAccess.getDSL_CEP_SUMAccess().getWindowDSL_CEP_DURATIONParserRuleCall_4_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_COUNT__RefAssignment_2
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_CEP_COUNTAccess().getRefDSL_REF_CONDITIONParserRuleCall_2_0()); }
+ ruleDSL_REF_CONDITION
+ { after(grammarAccess.getDSL_CEP_COUNTAccess().getRefDSL_REF_CONDITIONParserRuleCall_2_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_COUNT__WindowAssignment_4
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_CEP_COUNTAccess().getWindowDSL_CEP_DURATIONParserRuleCall_4_0()); }
+ ruleDSL_CEP_DURATION
+ { after(grammarAccess.getDSL_CEP_COUNTAccess().getWindowDSL_CEP_DURATIONParserRuleCall_4_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_DURATION__UnitsAssignment
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_CEP_DURATIONAccess().getUnitsAlternatives_0()); }
+ (rule__DSL_CEP_DURATION__UnitsAlternatives_0)
+ { after(grammarAccess.getDSL_CEP_DURATIONAccess().getUnitsAlternatives_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_DURATION_MIN__MinAssignment_0
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_CEP_DURATION_MINAccess().getMinNUMBERParserRuleCall_0_0()); }
+ ruleNUMBER
+ { after(grammarAccess.getDSL_CEP_DURATION_MINAccess().getMinNUMBERParserRuleCall_0_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_CEP_DURATION_SEC__SecAssignment_0
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_CEP_DURATION_SECAccess().getSecNUMBERParserRuleCall_0_0()); }
+ ruleNUMBER
+ { after(grammarAccess.getDSL_CEP_DURATION_SECAccess().getSecNUMBERParserRuleCall_0_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_ListActions__ActionListAssignment_0
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_ListActionsAccess().getActionListDSL_ResourceActionParserRuleCall_0_0()); }
+ ruleDSL_ResourceAction
+ { after(grammarAccess.getDSL_ListActionsAccess().getActionListDSL_ResourceActionParserRuleCall_0_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_ListActions__ActionListAssignment_1_1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_ListActionsAccess().getActionListDSL_ResourceActionParserRuleCall_1_1_0()); }
+ ruleDSL_ResourceAction
+ { after(grammarAccess.getDSL_ListActionsAccess().getActionListDSL_ResourceActionParserRuleCall_1_1_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_ResourceAction__VariableAssignment_0_0
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_ResourceActionAccess().getVariableIDTerminalRuleCall_0_0_0()); }
+ RULE_ID
+ { after(grammarAccess.getDSL_ResourceActionAccess().getVariableIDTerminalRuleCall_0_0_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_ResourceAction__RefAssignment_1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_ResourceActionAccess().getRefDSL_REFCrossReference_1_0()); }
+ (
+ { before(grammarAccess.getDSL_ResourceActionAccess().getRefDSL_REFIDTerminalRuleCall_1_0_1()); }
+ RULE_ID
+ { after(grammarAccess.getDSL_ResourceActionAccess().getRefDSL_REFIDTerminalRuleCall_1_0_1()); }
+ )
+ { after(grammarAccess.getDSL_ResourceActionAccess().getRefDSL_REFCrossReference_1_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_ResourceAction__ActiontypeAssignment_3
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_ResourceActionAccess().getActiontypeAlternatives_3_0()); }
+ (rule__DSL_ResourceAction__ActiontypeAlternatives_3_0)
+ { after(grammarAccess.getDSL_ResourceActionAccess().getActiontypeAlternatives_3_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_ResourceAction__ListParamAssignment_5
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_ResourceActionAccess().getListParamDSL_ListParamParserRuleCall_5_0()); }
+ ruleDSL_ListParam
+ { after(grammarAccess.getDSL_ResourceActionAccess().getListParamDSL_ListParamParserRuleCall_5_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_ListParam__ParamAssignment_0
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_ListParamAccess().getParamDSL_Expression_OrParserRuleCall_0_0()); }
+ ruleDSL_Expression_Or
+ { after(grammarAccess.getDSL_ListParamAccess().getParamDSL_Expression_OrParserRuleCall_0_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_ListParam__ParamAssignment_1_1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_ListParamAccess().getParamDSL_Expression_OrParserRuleCall_1_1_0()); }
+ ruleDSL_Expression_Or
+ { after(grammarAccess.getDSL_ListParamAccess().getParamDSL_Expression_OrParserRuleCall_1_1_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_Or__RightAssignment_1_2
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_Expression_OrAccess().getRightDSL_Expression_AndParserRuleCall_1_2_0()); }
+ ruleDSL_Expression_And
+ { after(grammarAccess.getDSL_Expression_OrAccess().getRightDSL_Expression_AndParserRuleCall_1_2_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_And__RightAssignment_1_2
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_Expression_AndAccess().getRightDSL_Expression_DiffEqualParserRuleCall_1_2_0()); }
+ ruleDSL_Expression_DiffEqual
+ { after(grammarAccess.getDSL_Expression_AndAccess().getRightDSL_Expression_DiffEqualParserRuleCall_1_2_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_DiffEqual__RightAssignment_1_0_2
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_Expression_DiffEqualAccess().getRightDSL_Expression_CompareParserRuleCall_1_0_2_0()); }
+ ruleDSL_Expression_Compare
+ { after(grammarAccess.getDSL_Expression_DiffEqualAccess().getRightDSL_Expression_CompareParserRuleCall_1_0_2_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_DiffEqual__RightAssignment_1_1_2
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_Expression_DiffEqualAccess().getRightDSL_Expression_CompareParserRuleCall_1_1_2_0()); }
+ ruleDSL_Expression_Compare
+ { after(grammarAccess.getDSL_Expression_DiffEqualAccess().getRightDSL_Expression_CompareParserRuleCall_1_1_2_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_Compare__RightAssignment_1_0_2
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_Expression_CompareAccess().getRightDSL_Expression_PlusMinusParserRuleCall_1_0_2_0()); }
+ ruleDSL_Expression_PlusMinus
+ { after(grammarAccess.getDSL_Expression_CompareAccess().getRightDSL_Expression_PlusMinusParserRuleCall_1_0_2_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_Compare__RightAssignment_1_1_2
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_Expression_CompareAccess().getRightDSL_Expression_PlusMinusParserRuleCall_1_1_2_0()); }
+ ruleDSL_Expression_PlusMinus
+ { after(grammarAccess.getDSL_Expression_CompareAccess().getRightDSL_Expression_PlusMinusParserRuleCall_1_1_2_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_Compare__RightAssignment_1_2_2
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_Expression_CompareAccess().getRightDSL_Expression_PlusMinusParserRuleCall_1_2_2_0()); }
+ ruleDSL_Expression_PlusMinus
+ { after(grammarAccess.getDSL_Expression_CompareAccess().getRightDSL_Expression_PlusMinusParserRuleCall_1_2_2_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_Compare__RightAssignment_1_3_2
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_Expression_CompareAccess().getRightDSL_Expression_PlusMinusParserRuleCall_1_3_2_0()); }
+ ruleDSL_Expression_PlusMinus
+ { after(grammarAccess.getDSL_Expression_CompareAccess().getRightDSL_Expression_PlusMinusParserRuleCall_1_3_2_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_PlusMinus__RightAssignment_1_0_2
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_Expression_PlusMinusAccess().getRightDSL_Expression_MultiplicationDivisionParserRuleCall_1_0_2_0()); }
+ ruleDSL_Expression_MultiplicationDivision
+ { after(grammarAccess.getDSL_Expression_PlusMinusAccess().getRightDSL_Expression_MultiplicationDivisionParserRuleCall_1_0_2_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_PlusMinus__RightAssignment_1_1_2
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_Expression_PlusMinusAccess().getRightDSL_Expression_MultiplicationDivisionParserRuleCall_1_1_2_0()); }
+ ruleDSL_Expression_MultiplicationDivision
+ { after(grammarAccess.getDSL_Expression_PlusMinusAccess().getRightDSL_Expression_MultiplicationDivisionParserRuleCall_1_1_2_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_MultiplicationDivision__RightAssignment_1_0_2
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getRightDSL_Expression_UnaryParserRuleCall_1_0_2_0()); }
+ ruleDSL_Expression_Unary
+ { after(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getRightDSL_Expression_UnaryParserRuleCall_1_0_2_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_MultiplicationDivision__RightAssignment_1_1_2
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getRightDSL_Expression_UnaryParserRuleCall_1_1_2_0()); }
+ ruleDSL_Expression_Unary
+ { after(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getRightDSL_Expression_UnaryParserRuleCall_1_1_2_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_MultiplicationDivision__RightAssignment_1_2_2
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getRightDSL_Expression_UnaryParserRuleCall_1_2_2_0()); }
+ ruleDSL_Expression_Unary
+ { after(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getRightDSL_Expression_UnaryParserRuleCall_1_2_2_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_Unary__ValueAssignment_0_1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_Expression_UnaryAccess().getValueNUMBERParserRuleCall_0_1_0()); }
+ ruleNUMBER
+ { after(grammarAccess.getDSL_Expression_UnaryAccess().getValueNUMBERParserRuleCall_0_1_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_Unary__ValueAssignment_1_1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_Expression_UnaryAccess().getValueSTRINGTerminalRuleCall_1_1_0()); }
+ RULE_STRING
+ { after(grammarAccess.getDSL_Expression_UnaryAccess().getValueSTRINGTerminalRuleCall_1_1_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_Unary__ValueAssignment_2_1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_Expression_UnaryAccess().getValueBOOLEANTerminalRuleCall_2_1_0()); }
+ RULE_BOOLEAN
+ { after(grammarAccess.getDSL_Expression_UnaryAccess().getValueBOOLEANTerminalRuleCall_2_1_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_Unary__ValueAssignment_3_1
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_Expression_UnaryAccess().getValueDSL_REFCrossReference_3_1_0()); }
+ (
+ { before(grammarAccess.getDSL_Expression_UnaryAccess().getValueDSL_REFIDTerminalRuleCall_3_1_0_1()); }
+ RULE_ID
+ { after(grammarAccess.getDSL_Expression_UnaryAccess().getValueDSL_REFIDTerminalRuleCall_3_1_0_1()); }
+ )
+ { after(grammarAccess.getDSL_Expression_UnaryAccess().getValueDSL_REFCrossReference_3_1_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+rule__DSL_Expression_Unary__ExpAssignment_5_2
+ @init {
+ int stackSize = keepStackSize();
+ }
+:
+ (
+ { before(grammarAccess.getDSL_Expression_UnaryAccess().getExpDSL_Expression_UnaryParserRuleCall_5_2_0()); }
+ ruleDSL_Expression_Unary
+ { after(grammarAccess.getDSL_Expression_UnaryAccess().getExpDSL_Expression_UnaryParserRuleCall_5_2_0()); }
+ )
+;
+finally {
+ restoreStackSize(stackSize);
+}
+
+RULE_BOOLEAN : ('true'|'false');
+
+RULE_INT : ('0'..'9')+;
+
+RULE_ID : ('a'..'z'|'A'..'Z'|'_'|'0'..'9'|':'|'-')+;
+
+RULE_STRING : ('"' ('\\' .|~(('\\'|'"')))* '"'|'\'' ('\\' .|~(('\\'|'\'')))* '\'');
+
+RULE_ML_COMMENT : '/*' ( options {greedy=false;} : . )*'*/';
+
+RULE_SL_COMMENT : '//' ~(('\n'|'\r'))* ('\r'? '\n')?;
+
+RULE_WS : (' '|'\t'|'\r'|'\n')+;
+
+RULE_ANY_OTHER : .;
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact.ide/src-gen/org/eclipse/sensinact/studio/language/ide/contentassist/antlr/internal/InternalSensinact.tokens b/xtext/org.eclipse.sensinact.studio.language.sensinact.ide/src-gen/org/eclipse/sensinact/studio/language/ide/contentassist/antlr/internal/InternalSensinact.tokens
new file mode 100644
index 0000000..f2bbb77
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact.ide/src-gen/org/eclipse/sensinact/studio/language/ide/contentassist/antlr/internal/InternalSensinact.tokens
@@ -0,0 +1,92 @@
+'!='=42
+'%'=51
+'('=28
+')'=29
+'*'=50
+'+'=48
+','=20
+'-'=49
+'.'=26
+'.get()'=52
+'/'=17
+'<'=46
+'<='=47
+'='=15
+'=='=43
+'>'=44
+'>='=45
+'['=16
+']'=18
+'act'=12
+'after'=31
+'and'=41
+'avg'=36
+'before'=32
+'coincide'=33
+'count'=38
+'define'=30
+'do'=23
+'else do'=25
+'else if'=24
+'end if'=21
+'if'=22
+'max'=35
+'min'=34
+'not'=53
+'on'=19
+'or'=40
+'resource'=14
+'sec'=39
+'set'=13
+'subscribe'=27
+'sum'=37
+RULE_ANY_OTHER=11
+RULE_BOOLEAN=7
+RULE_ID=5
+RULE_INT=4
+RULE_ML_COMMENT=8
+RULE_SL_COMMENT=9
+RULE_STRING=6
+RULE_WS=10
+T__12=12
+T__13=13
+T__14=14
+T__15=15
+T__16=16
+T__17=17
+T__18=18
+T__19=19
+T__20=20
+T__21=21
+T__22=22
+T__23=23
+T__24=24
+T__25=25
+T__26=26
+T__27=27
+T__28=28
+T__29=29
+T__30=30
+T__31=31
+T__32=32
+T__33=33
+T__34=34
+T__35=35
+T__36=36
+T__37=37
+T__38=38
+T__39=39
+T__40=40
+T__41=41
+T__42=42
+T__43=43
+T__44=44
+T__45=45
+T__46=46
+T__47=47
+T__48=48
+T__49=49
+T__50=50
+T__51=51
+T__52=52
+T__53=53
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact.ide/src-gen/org/eclipse/sensinact/studio/language/ide/contentassist/antlr/internal/InternalSensinactLexer.java b/xtext/org.eclipse.sensinact.studio.language.sensinact.ide/src-gen/org/eclipse/sensinact/studio/language/ide/contentassist/antlr/internal/InternalSensinactLexer.java
new file mode 100644
index 0000000..987c216
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact.ide/src-gen/org/eclipse/sensinact/studio/language/ide/contentassist/antlr/internal/InternalSensinactLexer.java
@@ -0,0 +1,2162 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.language.ide.contentassist.antlr.internal;
+
+// Hack: Use our own Lexer superclass by means of import.
+// Currently there is no other way to specify the superclass for the lexer.
+import org.eclipse.xtext.ide.editor.contentassist.antlr.internal.Lexer;
+
+
+import org.antlr.runtime.*;
+import java.util.Stack;
+import java.util.List;
+import java.util.ArrayList;
+
+@SuppressWarnings("all")
+public class InternalSensinactLexer extends Lexer {
+ public static final int T__50=50;
+ public static final int RULE_BOOLEAN=7;
+ public static final int T__19=19;
+ public static final int T__15=15;
+ public static final int T__16=16;
+ public static final int T__17=17;
+ public static final int T__18=18;
+ public static final int T__12=12;
+ public static final int T__13=13;
+ public static final int T__14=14;
+ public static final int T__51=51;
+ public static final int T__52=52;
+ public static final int T__53=53;
+ public static final int RULE_ID=5;
+ public static final int T__26=26;
+ public static final int T__27=27;
+ public static final int T__28=28;
+ public static final int RULE_INT=4;
+ public static final int T__29=29;
+ public static final int T__22=22;
+ public static final int RULE_ML_COMMENT=8;
+ public static final int T__23=23;
+ public static final int T__24=24;
+ public static final int T__25=25;
+ public static final int T__20=20;
+ public static final int T__21=21;
+ public static final int RULE_STRING=6;
+ public static final int RULE_SL_COMMENT=9;
+ public static final int T__37=37;
+ public static final int T__38=38;
+ public static final int T__39=39;
+ public static final int T__33=33;
+ public static final int T__34=34;
+ public static final int T__35=35;
+ public static final int T__36=36;
+ public static final int EOF=-1;
+ public static final int T__30=30;
+ public static final int T__31=31;
+ public static final int T__32=32;
+ public static final int RULE_WS=10;
+ public static final int RULE_ANY_OTHER=11;
+ public static final int T__48=48;
+ public static final int T__49=49;
+ public static final int T__44=44;
+ public static final int T__45=45;
+ public static final int T__46=46;
+ public static final int T__47=47;
+ public static final int T__40=40;
+ public static final int T__41=41;
+ public static final int T__42=42;
+ public static final int T__43=43;
+
+ // delegates
+ // delegators
+
+ public InternalSensinactLexer() {;}
+ public InternalSensinactLexer(CharStream input) {
+ this(input, new RecognizerSharedState());
+ }
+ public InternalSensinactLexer(CharStream input, RecognizerSharedState state) {
+ super(input,state);
+
+ }
+ public String getGrammarFileName() { return "InternalSensinact.g"; }
+
+ // $ANTLR start "T__12"
+ public final void mT__12() throws RecognitionException {
+ try {
+ int _type = T__12;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:11:7: ( 'act' )
+ // InternalSensinact.g:11:9: 'act'
+ {
+ match("act");
+
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__12"
+
+ // $ANTLR start "T__13"
+ public final void mT__13() throws RecognitionException {
+ try {
+ int _type = T__13;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:12:7: ( 'set' )
+ // InternalSensinact.g:12:9: 'set'
+ {
+ match("set");
+
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__13"
+
+ // $ANTLR start "T__14"
+ public final void mT__14() throws RecognitionException {
+ try {
+ int _type = T__14;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:13:7: ( 'resource' )
+ // InternalSensinact.g:13:9: 'resource'
+ {
+ match("resource");
+
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__14"
+
+ // $ANTLR start "T__15"
+ public final void mT__15() throws RecognitionException {
+ try {
+ int _type = T__15;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:14:7: ( '=' )
+ // InternalSensinact.g:14:9: '='
+ {
+ match('=');
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__15"
+
+ // $ANTLR start "T__16"
+ public final void mT__16() throws RecognitionException {
+ try {
+ int _type = T__16;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:15:7: ( '[' )
+ // InternalSensinact.g:15:9: '['
+ {
+ match('[');
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__16"
+
+ // $ANTLR start "T__17"
+ public final void mT__17() throws RecognitionException {
+ try {
+ int _type = T__17;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:16:7: ( '/' )
+ // InternalSensinact.g:16:9: '/'
+ {
+ match('/');
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__17"
+
+ // $ANTLR start "T__18"
+ public final void mT__18() throws RecognitionException {
+ try {
+ int _type = T__18;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:17:7: ( ']' )
+ // InternalSensinact.g:17:9: ']'
+ {
+ match(']');
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__18"
+
+ // $ANTLR start "T__19"
+ public final void mT__19() throws RecognitionException {
+ try {
+ int _type = T__19;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:18:7: ( 'on' )
+ // InternalSensinact.g:18:9: 'on'
+ {
+ match("on");
+
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__19"
+
+ // $ANTLR start "T__20"
+ public final void mT__20() throws RecognitionException {
+ try {
+ int _type = T__20;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:19:7: ( ',' )
+ // InternalSensinact.g:19:9: ','
+ {
+ match(',');
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__20"
+
+ // $ANTLR start "T__21"
+ public final void mT__21() throws RecognitionException {
+ try {
+ int _type = T__21;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:20:7: ( 'end if' )
+ // InternalSensinact.g:20:9: 'end if'
+ {
+ match("end if");
+
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__21"
+
+ // $ANTLR start "T__22"
+ public final void mT__22() throws RecognitionException {
+ try {
+ int _type = T__22;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:21:7: ( 'if' )
+ // InternalSensinact.g:21:9: 'if'
+ {
+ match("if");
+
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__22"
+
+ // $ANTLR start "T__23"
+ public final void mT__23() throws RecognitionException {
+ try {
+ int _type = T__23;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:22:7: ( 'do' )
+ // InternalSensinact.g:22:9: 'do'
+ {
+ match("do");
+
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__23"
+
+ // $ANTLR start "T__24"
+ public final void mT__24() throws RecognitionException {
+ try {
+ int _type = T__24;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:23:7: ( 'else if' )
+ // InternalSensinact.g:23:9: 'else if'
+ {
+ match("else if");
+
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__24"
+
+ // $ANTLR start "T__25"
+ public final void mT__25() throws RecognitionException {
+ try {
+ int _type = T__25;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:24:7: ( 'else do' )
+ // InternalSensinact.g:24:9: 'else do'
+ {
+ match("else do");
+
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__25"
+
+ // $ANTLR start "T__26"
+ public final void mT__26() throws RecognitionException {
+ try {
+ int _type = T__26;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:25:7: ( '.' )
+ // InternalSensinact.g:25:9: '.'
+ {
+ match('.');
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__26"
+
+ // $ANTLR start "T__27"
+ public final void mT__27() throws RecognitionException {
+ try {
+ int _type = T__27;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:26:7: ( 'subscribe' )
+ // InternalSensinact.g:26:9: 'subscribe'
+ {
+ match("subscribe");
+
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__27"
+
+ // $ANTLR start "T__28"
+ public final void mT__28() throws RecognitionException {
+ try {
+ int _type = T__28;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:27:7: ( '(' )
+ // InternalSensinact.g:27:9: '('
+ {
+ match('(');
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__28"
+
+ // $ANTLR start "T__29"
+ public final void mT__29() throws RecognitionException {
+ try {
+ int _type = T__29;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:28:7: ( ')' )
+ // InternalSensinact.g:28:9: ')'
+ {
+ match(')');
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__29"
+
+ // $ANTLR start "T__30"
+ public final void mT__30() throws RecognitionException {
+ try {
+ int _type = T__30;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:29:7: ( 'define' )
+ // InternalSensinact.g:29:9: 'define'
+ {
+ match("define");
+
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__30"
+
+ // $ANTLR start "T__31"
+ public final void mT__31() throws RecognitionException {
+ try {
+ int _type = T__31;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:30:7: ( 'after' )
+ // InternalSensinact.g:30:9: 'after'
+ {
+ match("after");
+
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__31"
+
+ // $ANTLR start "T__32"
+ public final void mT__32() throws RecognitionException {
+ try {
+ int _type = T__32;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:31:7: ( 'before' )
+ // InternalSensinact.g:31:9: 'before'
+ {
+ match("before");
+
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__32"
+
+ // $ANTLR start "T__33"
+ public final void mT__33() throws RecognitionException {
+ try {
+ int _type = T__33;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:32:7: ( 'coincide' )
+ // InternalSensinact.g:32:9: 'coincide'
+ {
+ match("coincide");
+
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__33"
+
+ // $ANTLR start "T__34"
+ public final void mT__34() throws RecognitionException {
+ try {
+ int _type = T__34;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:33:7: ( 'min' )
+ // InternalSensinact.g:33:9: 'min'
+ {
+ match("min");
+
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__34"
+
+ // $ANTLR start "T__35"
+ public final void mT__35() throws RecognitionException {
+ try {
+ int _type = T__35;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:34:7: ( 'max' )
+ // InternalSensinact.g:34:9: 'max'
+ {
+ match("max");
+
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__35"
+
+ // $ANTLR start "T__36"
+ public final void mT__36() throws RecognitionException {
+ try {
+ int _type = T__36;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:35:7: ( 'avg' )
+ // InternalSensinact.g:35:9: 'avg'
+ {
+ match("avg");
+
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__36"
+
+ // $ANTLR start "T__37"
+ public final void mT__37() throws RecognitionException {
+ try {
+ int _type = T__37;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:36:7: ( 'sum' )
+ // InternalSensinact.g:36:9: 'sum'
+ {
+ match("sum");
+
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__37"
+
+ // $ANTLR start "T__38"
+ public final void mT__38() throws RecognitionException {
+ try {
+ int _type = T__38;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:37:7: ( 'count' )
+ // InternalSensinact.g:37:9: 'count'
+ {
+ match("count");
+
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__38"
+
+ // $ANTLR start "T__39"
+ public final void mT__39() throws RecognitionException {
+ try {
+ int _type = T__39;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:38:7: ( 'sec' )
+ // InternalSensinact.g:38:9: 'sec'
+ {
+ match("sec");
+
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__39"
+
+ // $ANTLR start "T__40"
+ public final void mT__40() throws RecognitionException {
+ try {
+ int _type = T__40;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:39:7: ( 'or' )
+ // InternalSensinact.g:39:9: 'or'
+ {
+ match("or");
+
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__40"
+
+ // $ANTLR start "T__41"
+ public final void mT__41() throws RecognitionException {
+ try {
+ int _type = T__41;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:40:7: ( 'and' )
+ // InternalSensinact.g:40:9: 'and'
+ {
+ match("and");
+
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__41"
+
+ // $ANTLR start "T__42"
+ public final void mT__42() throws RecognitionException {
+ try {
+ int _type = T__42;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:41:7: ( '!=' )
+ // InternalSensinact.g:41:9: '!='
+ {
+ match("!=");
+
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__42"
+
+ // $ANTLR start "T__43"
+ public final void mT__43() throws RecognitionException {
+ try {
+ int _type = T__43;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:42:7: ( '==' )
+ // InternalSensinact.g:42:9: '=='
+ {
+ match("==");
+
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__43"
+
+ // $ANTLR start "T__44"
+ public final void mT__44() throws RecognitionException {
+ try {
+ int _type = T__44;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:43:7: ( '>' )
+ // InternalSensinact.g:43:9: '>'
+ {
+ match('>');
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__44"
+
+ // $ANTLR start "T__45"
+ public final void mT__45() throws RecognitionException {
+ try {
+ int _type = T__45;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:44:7: ( '>=' )
+ // InternalSensinact.g:44:9: '>='
+ {
+ match(">=");
+
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__45"
+
+ // $ANTLR start "T__46"
+ public final void mT__46() throws RecognitionException {
+ try {
+ int _type = T__46;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:45:7: ( '<' )
+ // InternalSensinact.g:45:9: '<'
+ {
+ match('<');
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__46"
+
+ // $ANTLR start "T__47"
+ public final void mT__47() throws RecognitionException {
+ try {
+ int _type = T__47;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:46:7: ( '<=' )
+ // InternalSensinact.g:46:9: '<='
+ {
+ match("<=");
+
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__47"
+
+ // $ANTLR start "T__48"
+ public final void mT__48() throws RecognitionException {
+ try {
+ int _type = T__48;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:47:7: ( '+' )
+ // InternalSensinact.g:47:9: '+'
+ {
+ match('+');
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__48"
+
+ // $ANTLR start "T__49"
+ public final void mT__49() throws RecognitionException {
+ try {
+ int _type = T__49;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:48:7: ( '-' )
+ // InternalSensinact.g:48:9: '-'
+ {
+ match('-');
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__49"
+
+ // $ANTLR start "T__50"
+ public final void mT__50() throws RecognitionException {
+ try {
+ int _type = T__50;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:49:7: ( '*' )
+ // InternalSensinact.g:49:9: '*'
+ {
+ match('*');
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__50"
+
+ // $ANTLR start "T__51"
+ public final void mT__51() throws RecognitionException {
+ try {
+ int _type = T__51;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:50:7: ( '%' )
+ // InternalSensinact.g:50:9: '%'
+ {
+ match('%');
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__51"
+
+ // $ANTLR start "T__52"
+ public final void mT__52() throws RecognitionException {
+ try {
+ int _type = T__52;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:51:7: ( '.get()' )
+ // InternalSensinact.g:51:9: '.get()'
+ {
+ match(".get()");
+
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__52"
+
+ // $ANTLR start "T__53"
+ public final void mT__53() throws RecognitionException {
+ try {
+ int _type = T__53;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:52:7: ( 'not' )
+ // InternalSensinact.g:52:9: 'not'
+ {
+ match("not");
+
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__53"
+
+ // $ANTLR start "RULE_BOOLEAN"
+ public final void mRULE_BOOLEAN() throws RecognitionException {
+ try {
+ int _type = RULE_BOOLEAN;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:7665:14: ( ( 'true' | 'false' ) )
+ // InternalSensinact.g:7665:16: ( 'true' | 'false' )
+ {
+ // InternalSensinact.g:7665:16: ( 'true' | 'false' )
+ int alt1=2;
+ int LA1_0 = input.LA(1);
+
+ if ( (LA1_0=='t') ) {
+ alt1=1;
+ }
+ else if ( (LA1_0=='f') ) {
+ alt1=2;
+ }
+ else {
+ NoViableAltException nvae =
+ new NoViableAltException("", 1, 0, input);
+
+ throw nvae;
+ }
+ switch (alt1) {
+ case 1 :
+ // InternalSensinact.g:7665:17: 'true'
+ {
+ match("true");
+
+
+ }
+ break;
+ case 2 :
+ // InternalSensinact.g:7665:24: 'false'
+ {
+ match("false");
+
+
+ }
+ break;
+
+ }
+
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "RULE_BOOLEAN"
+
+ // $ANTLR start "RULE_INT"
+ public final void mRULE_INT() throws RecognitionException {
+ try {
+ int _type = RULE_INT;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:7667:10: ( ( '0' .. '9' )+ )
+ // InternalSensinact.g:7667:12: ( '0' .. '9' )+
+ {
+ // InternalSensinact.g:7667:12: ( '0' .. '9' )+
+ int cnt2=0;
+ loop2:
+ do {
+ int alt2=2;
+ int LA2_0 = input.LA(1);
+
+ if ( ((LA2_0>='0' && LA2_0<='9')) ) {
+ alt2=1;
+ }
+
+
+ switch (alt2) {
+ case 1 :
+ // InternalSensinact.g:7667:13: '0' .. '9'
+ {
+ matchRange('0','9');
+
+ }
+ break;
+
+ default :
+ if ( cnt2 >= 1 ) break loop2;
+ EarlyExitException eee =
+ new EarlyExitException(2, input);
+ throw eee;
+ }
+ cnt2++;
+ } while (true);
+
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "RULE_INT"
+
+ // $ANTLR start "RULE_ID"
+ public final void mRULE_ID() throws RecognitionException {
+ try {
+ int _type = RULE_ID;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:7669:9: ( ( 'a' .. 'z' | 'A' .. 'Z' | '_' | '0' .. '9' | ':' | '-' )+ )
+ // InternalSensinact.g:7669:11: ( 'a' .. 'z' | 'A' .. 'Z' | '_' | '0' .. '9' | ':' | '-' )+
+ {
+ // InternalSensinact.g:7669:11: ( 'a' .. 'z' | 'A' .. 'Z' | '_' | '0' .. '9' | ':' | '-' )+
+ int cnt3=0;
+ loop3:
+ do {
+ int alt3=2;
+ int LA3_0 = input.LA(1);
+
+ if ( (LA3_0=='-'||(LA3_0>='0' && LA3_0<=':')||(LA3_0>='A' && LA3_0<='Z')||LA3_0=='_'||(LA3_0>='a' && LA3_0<='z')) ) {
+ alt3=1;
+ }
+
+
+ switch (alt3) {
+ case 1 :
+ // InternalSensinact.g:
+ {
+ if ( input.LA(1)=='-'||(input.LA(1)>='0' && input.LA(1)<=':')||(input.LA(1)>='A' && input.LA(1)<='Z')||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='z') ) {
+ input.consume();
+
+ }
+ else {
+ MismatchedSetException mse = new MismatchedSetException(null,input);
+ recover(mse);
+ throw mse;}
+
+
+ }
+ break;
+
+ default :
+ if ( cnt3 >= 1 ) break loop3;
+ EarlyExitException eee =
+ new EarlyExitException(3, input);
+ throw eee;
+ }
+ cnt3++;
+ } while (true);
+
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "RULE_ID"
+
+ // $ANTLR start "RULE_STRING"
+ public final void mRULE_STRING() throws RecognitionException {
+ try {
+ int _type = RULE_STRING;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:7671:13: ( ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* '\"' | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* '\\'' ) )
+ // InternalSensinact.g:7671:15: ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* '\"' | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* '\\'' )
+ {
+ // InternalSensinact.g:7671:15: ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* '\"' | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* '\\'' )
+ int alt6=2;
+ int LA6_0 = input.LA(1);
+
+ if ( (LA6_0=='\"') ) {
+ alt6=1;
+ }
+ else if ( (LA6_0=='\'') ) {
+ alt6=2;
+ }
+ else {
+ NoViableAltException nvae =
+ new NoViableAltException("", 6, 0, input);
+
+ throw nvae;
+ }
+ switch (alt6) {
+ case 1 :
+ // InternalSensinact.g:7671:16: '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* '\"'
+ {
+ match('\"');
+ // InternalSensinact.g:7671:20: ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )*
+ loop4:
+ do {
+ int alt4=3;
+ int LA4_0 = input.LA(1);
+
+ if ( (LA4_0=='\\') ) {
+ alt4=1;
+ }
+ else if ( ((LA4_0>='\u0000' && LA4_0<='!')||(LA4_0>='#' && LA4_0<='[')||(LA4_0>=']' && LA4_0<='\uFFFF')) ) {
+ alt4=2;
+ }
+
+
+ switch (alt4) {
+ case 1 :
+ // InternalSensinact.g:7671:21: '\\\\' .
+ {
+ match('\\');
+ matchAny();
+
+ }
+ break;
+ case 2 :
+ // InternalSensinact.g:7671:28: ~ ( ( '\\\\' | '\"' ) )
+ {
+ if ( (input.LA(1)>='\u0000' && input.LA(1)<='!')||(input.LA(1)>='#' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFF') ) {
+ input.consume();
+
+ }
+ else {
+ MismatchedSetException mse = new MismatchedSetException(null,input);
+ recover(mse);
+ throw mse;}
+
+
+ }
+ break;
+
+ default :
+ break loop4;
+ }
+ } while (true);
+
+ match('\"');
+
+ }
+ break;
+ case 2 :
+ // InternalSensinact.g:7671:48: '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* '\\''
+ {
+ match('\'');
+ // InternalSensinact.g:7671:53: ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )*
+ loop5:
+ do {
+ int alt5=3;
+ int LA5_0 = input.LA(1);
+
+ if ( (LA5_0=='\\') ) {
+ alt5=1;
+ }
+ else if ( ((LA5_0>='\u0000' && LA5_0<='&')||(LA5_0>='(' && LA5_0<='[')||(LA5_0>=']' && LA5_0<='\uFFFF')) ) {
+ alt5=2;
+ }
+
+
+ switch (alt5) {
+ case 1 :
+ // InternalSensinact.g:7671:54: '\\\\' .
+ {
+ match('\\');
+ matchAny();
+
+ }
+ break;
+ case 2 :
+ // InternalSensinact.g:7671:61: ~ ( ( '\\\\' | '\\'' ) )
+ {
+ if ( (input.LA(1)>='\u0000' && input.LA(1)<='&')||(input.LA(1)>='(' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFF') ) {
+ input.consume();
+
+ }
+ else {
+ MismatchedSetException mse = new MismatchedSetException(null,input);
+ recover(mse);
+ throw mse;}
+
+
+ }
+ break;
+
+ default :
+ break loop5;
+ }
+ } while (true);
+
+ match('\'');
+
+ }
+ break;
+
+ }
+
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "RULE_STRING"
+
+ // $ANTLR start "RULE_ML_COMMENT"
+ public final void mRULE_ML_COMMENT() throws RecognitionException {
+ try {
+ int _type = RULE_ML_COMMENT;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:7673:17: ( '/*' ( options {greedy=false; } : . )* '*/' )
+ // InternalSensinact.g:7673:19: '/*' ( options {greedy=false; } : . )* '*/'
+ {
+ match("/*");
+
+ // InternalSensinact.g:7673:24: ( options {greedy=false; } : . )*
+ loop7:
+ do {
+ int alt7=2;
+ int LA7_0 = input.LA(1);
+
+ if ( (LA7_0=='*') ) {
+ int LA7_1 = input.LA(2);
+
+ if ( (LA7_1=='/') ) {
+ alt7=2;
+ }
+ else if ( ((LA7_1>='\u0000' && LA7_1<='.')||(LA7_1>='0' && LA7_1<='\uFFFF')) ) {
+ alt7=1;
+ }
+
+
+ }
+ else if ( ((LA7_0>='\u0000' && LA7_0<=')')||(LA7_0>='+' && LA7_0<='\uFFFF')) ) {
+ alt7=1;
+ }
+
+
+ switch (alt7) {
+ case 1 :
+ // InternalSensinact.g:7673:52: .
+ {
+ matchAny();
+
+ }
+ break;
+
+ default :
+ break loop7;
+ }
+ } while (true);
+
+ match("*/");
+
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "RULE_ML_COMMENT"
+
+ // $ANTLR start "RULE_SL_COMMENT"
+ public final void mRULE_SL_COMMENT() throws RecognitionException {
+ try {
+ int _type = RULE_SL_COMMENT;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:7675:17: ( '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )? )
+ // InternalSensinact.g:7675:19: '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )?
+ {
+ match("//");
+
+ // InternalSensinact.g:7675:24: (~ ( ( '\\n' | '\\r' ) ) )*
+ loop8:
+ do {
+ int alt8=2;
+ int LA8_0 = input.LA(1);
+
+ if ( ((LA8_0>='\u0000' && LA8_0<='\t')||(LA8_0>='\u000B' && LA8_0<='\f')||(LA8_0>='\u000E' && LA8_0<='\uFFFF')) ) {
+ alt8=1;
+ }
+
+
+ switch (alt8) {
+ case 1 :
+ // InternalSensinact.g:7675:24: ~ ( ( '\\n' | '\\r' ) )
+ {
+ if ( (input.LA(1)>='\u0000' && input.LA(1)<='\t')||(input.LA(1)>='\u000B' && input.LA(1)<='\f')||(input.LA(1)>='\u000E' && input.LA(1)<='\uFFFF') ) {
+ input.consume();
+
+ }
+ else {
+ MismatchedSetException mse = new MismatchedSetException(null,input);
+ recover(mse);
+ throw mse;}
+
+
+ }
+ break;
+
+ default :
+ break loop8;
+ }
+ } while (true);
+
+ // InternalSensinact.g:7675:40: ( ( '\\r' )? '\\n' )?
+ int alt10=2;
+ int LA10_0 = input.LA(1);
+
+ if ( (LA10_0=='\n'||LA10_0=='\r') ) {
+ alt10=1;
+ }
+ switch (alt10) {
+ case 1 :
+ // InternalSensinact.g:7675:41: ( '\\r' )? '\\n'
+ {
+ // InternalSensinact.g:7675:41: ( '\\r' )?
+ int alt9=2;
+ int LA9_0 = input.LA(1);
+
+ if ( (LA9_0=='\r') ) {
+ alt9=1;
+ }
+ switch (alt9) {
+ case 1 :
+ // InternalSensinact.g:7675:41: '\\r'
+ {
+ match('\r');
+
+ }
+ break;
+
+ }
+
+ match('\n');
+
+ }
+ break;
+
+ }
+
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "RULE_SL_COMMENT"
+
+ // $ANTLR start "RULE_WS"
+ public final void mRULE_WS() throws RecognitionException {
+ try {
+ int _type = RULE_WS;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:7677:9: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ )
+ // InternalSensinact.g:7677:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
+ {
+ // InternalSensinact.g:7677:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
+ int cnt11=0;
+ loop11:
+ do {
+ int alt11=2;
+ int LA11_0 = input.LA(1);
+
+ if ( ((LA11_0>='\t' && LA11_0<='\n')||LA11_0=='\r'||LA11_0==' ') ) {
+ alt11=1;
+ }
+
+
+ switch (alt11) {
+ case 1 :
+ // InternalSensinact.g:
+ {
+ if ( (input.LA(1)>='\t' && input.LA(1)<='\n')||input.LA(1)=='\r'||input.LA(1)==' ' ) {
+ input.consume();
+
+ }
+ else {
+ MismatchedSetException mse = new MismatchedSetException(null,input);
+ recover(mse);
+ throw mse;}
+
+
+ }
+ break;
+
+ default :
+ if ( cnt11 >= 1 ) break loop11;
+ EarlyExitException eee =
+ new EarlyExitException(11, input);
+ throw eee;
+ }
+ cnt11++;
+ } while (true);
+
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "RULE_WS"
+
+ // $ANTLR start "RULE_ANY_OTHER"
+ public final void mRULE_ANY_OTHER() throws RecognitionException {
+ try {
+ int _type = RULE_ANY_OTHER;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:7679:16: ( . )
+ // InternalSensinact.g:7679:18: .
+ {
+ matchAny();
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "RULE_ANY_OTHER"
+
+ public void mTokens() throws RecognitionException {
+ // InternalSensinact.g:1:8: ( T__12 | T__13 | T__14 | T__15 | T__16 | T__17 | T__18 | T__19 | T__20 | T__21 | T__22 | T__23 | T__24 | T__25 | T__26 | T__27 | T__28 | T__29 | T__30 | T__31 | T__32 | T__33 | T__34 | T__35 | T__36 | T__37 | T__38 | T__39 | T__40 | T__41 | T__42 | T__43 | T__44 | T__45 | T__46 | T__47 | T__48 | T__49 | T__50 | T__51 | T__52 | T__53 | RULE_BOOLEAN | RULE_INT | RULE_ID | RULE_STRING | RULE_ML_COMMENT | RULE_SL_COMMENT | RULE_WS | RULE_ANY_OTHER )
+ int alt12=50;
+ alt12 = dfa12.predict(input);
+ switch (alt12) {
+ case 1 :
+ // InternalSensinact.g:1:10: T__12
+ {
+ mT__12();
+
+ }
+ break;
+ case 2 :
+ // InternalSensinact.g:1:16: T__13
+ {
+ mT__13();
+
+ }
+ break;
+ case 3 :
+ // InternalSensinact.g:1:22: T__14
+ {
+ mT__14();
+
+ }
+ break;
+ case 4 :
+ // InternalSensinact.g:1:28: T__15
+ {
+ mT__15();
+
+ }
+ break;
+ case 5 :
+ // InternalSensinact.g:1:34: T__16
+ {
+ mT__16();
+
+ }
+ break;
+ case 6 :
+ // InternalSensinact.g:1:40: T__17
+ {
+ mT__17();
+
+ }
+ break;
+ case 7 :
+ // InternalSensinact.g:1:46: T__18
+ {
+ mT__18();
+
+ }
+ break;
+ case 8 :
+ // InternalSensinact.g:1:52: T__19
+ {
+ mT__19();
+
+ }
+ break;
+ case 9 :
+ // InternalSensinact.g:1:58: T__20
+ {
+ mT__20();
+
+ }
+ break;
+ case 10 :
+ // InternalSensinact.g:1:64: T__21
+ {
+ mT__21();
+
+ }
+ break;
+ case 11 :
+ // InternalSensinact.g:1:70: T__22
+ {
+ mT__22();
+
+ }
+ break;
+ case 12 :
+ // InternalSensinact.g:1:76: T__23
+ {
+ mT__23();
+
+ }
+ break;
+ case 13 :
+ // InternalSensinact.g:1:82: T__24
+ {
+ mT__24();
+
+ }
+ break;
+ case 14 :
+ // InternalSensinact.g:1:88: T__25
+ {
+ mT__25();
+
+ }
+ break;
+ case 15 :
+ // InternalSensinact.g:1:94: T__26
+ {
+ mT__26();
+
+ }
+ break;
+ case 16 :
+ // InternalSensinact.g:1:100: T__27
+ {
+ mT__27();
+
+ }
+ break;
+ case 17 :
+ // InternalSensinact.g:1:106: T__28
+ {
+ mT__28();
+
+ }
+ break;
+ case 18 :
+ // InternalSensinact.g:1:112: T__29
+ {
+ mT__29();
+
+ }
+ break;
+ case 19 :
+ // InternalSensinact.g:1:118: T__30
+ {
+ mT__30();
+
+ }
+ break;
+ case 20 :
+ // InternalSensinact.g:1:124: T__31
+ {
+ mT__31();
+
+ }
+ break;
+ case 21 :
+ // InternalSensinact.g:1:130: T__32
+ {
+ mT__32();
+
+ }
+ break;
+ case 22 :
+ // InternalSensinact.g:1:136: T__33
+ {
+ mT__33();
+
+ }
+ break;
+ case 23 :
+ // InternalSensinact.g:1:142: T__34
+ {
+ mT__34();
+
+ }
+ break;
+ case 24 :
+ // InternalSensinact.g:1:148: T__35
+ {
+ mT__35();
+
+ }
+ break;
+ case 25 :
+ // InternalSensinact.g:1:154: T__36
+ {
+ mT__36();
+
+ }
+ break;
+ case 26 :
+ // InternalSensinact.g:1:160: T__37
+ {
+ mT__37();
+
+ }
+ break;
+ case 27 :
+ // InternalSensinact.g:1:166: T__38
+ {
+ mT__38();
+
+ }
+ break;
+ case 28 :
+ // InternalSensinact.g:1:172: T__39
+ {
+ mT__39();
+
+ }
+ break;
+ case 29 :
+ // InternalSensinact.g:1:178: T__40
+ {
+ mT__40();
+
+ }
+ break;
+ case 30 :
+ // InternalSensinact.g:1:184: T__41
+ {
+ mT__41();
+
+ }
+ break;
+ case 31 :
+ // InternalSensinact.g:1:190: T__42
+ {
+ mT__42();
+
+ }
+ break;
+ case 32 :
+ // InternalSensinact.g:1:196: T__43
+ {
+ mT__43();
+
+ }
+ break;
+ case 33 :
+ // InternalSensinact.g:1:202: T__44
+ {
+ mT__44();
+
+ }
+ break;
+ case 34 :
+ // InternalSensinact.g:1:208: T__45
+ {
+ mT__45();
+
+ }
+ break;
+ case 35 :
+ // InternalSensinact.g:1:214: T__46
+ {
+ mT__46();
+
+ }
+ break;
+ case 36 :
+ // InternalSensinact.g:1:220: T__47
+ {
+ mT__47();
+
+ }
+ break;
+ case 37 :
+ // InternalSensinact.g:1:226: T__48
+ {
+ mT__48();
+
+ }
+ break;
+ case 38 :
+ // InternalSensinact.g:1:232: T__49
+ {
+ mT__49();
+
+ }
+ break;
+ case 39 :
+ // InternalSensinact.g:1:238: T__50
+ {
+ mT__50();
+
+ }
+ break;
+ case 40 :
+ // InternalSensinact.g:1:244: T__51
+ {
+ mT__51();
+
+ }
+ break;
+ case 41 :
+ // InternalSensinact.g:1:250: T__52
+ {
+ mT__52();
+
+ }
+ break;
+ case 42 :
+ // InternalSensinact.g:1:256: T__53
+ {
+ mT__53();
+
+ }
+ break;
+ case 43 :
+ // InternalSensinact.g:1:262: RULE_BOOLEAN
+ {
+ mRULE_BOOLEAN();
+
+ }
+ break;
+ case 44 :
+ // InternalSensinact.g:1:275: RULE_INT
+ {
+ mRULE_INT();
+
+ }
+ break;
+ case 45 :
+ // InternalSensinact.g:1:284: RULE_ID
+ {
+ mRULE_ID();
+
+ }
+ break;
+ case 46 :
+ // InternalSensinact.g:1:292: RULE_STRING
+ {
+ mRULE_STRING();
+
+ }
+ break;
+ case 47 :
+ // InternalSensinact.g:1:304: RULE_ML_COMMENT
+ {
+ mRULE_ML_COMMENT();
+
+ }
+ break;
+ case 48 :
+ // InternalSensinact.g:1:320: RULE_SL_COMMENT
+ {
+ mRULE_SL_COMMENT();
+
+ }
+ break;
+ case 49 :
+ // InternalSensinact.g:1:336: RULE_WS
+ {
+ mRULE_WS();
+
+ }
+ break;
+ case 50 :
+ // InternalSensinact.g:1:344: RULE_ANY_OTHER
+ {
+ mRULE_ANY_OTHER();
+
+ }
+ break;
+
+ }
+
+ }
+
+
+ protected DFA12 dfa12 = new DFA12(this);
+ static final String DFA12_eotS =
+ "\1\uffff\3\47\1\54\1\uffff\1\60\1\uffff\1\47\1\uffff\3\47\1\73\2\uffff\3\47\1\42\1\104\1\106\1\uffff\1\110\2\uffff\3\47\1\116\1\uffff\2\42\2\uffff\4\47\1\uffff\3\47\7\uffff\1\133\1\134\1\uffff\2\47\1\137\1\140\1\47\4\uffff\4\47\11\uffff\3\47\1\uffff\1\116\2\uffff\1\152\1\47\1\154\1\155\1\156\1\157\1\47\1\161\1\47\2\uffff\2\47\2\uffff\4\47\1\171\1\172\1\173\2\47\1\uffff\1\47\4\uffff\1\47\1\uffff\1\47\1\uffff\5\47\3\uffff\1\u0086\1\47\1\u0088\2\47\1\uffff\3\47\1\u0090\1\uffff\1\u0086\1\uffff\2\47\2\uffff\1\u0093\1\u0094\1\47\1\uffff\2\47\2\uffff\2\47\1\u009a\1\u009b\1\u009c\3\uffff";
+ static final String DFA12_eofS =
+ "\u009d\uffff";
+ static final String DFA12_minS =
+ "\1\0\1\143\2\145\1\75\1\uffff\1\52\1\uffff\1\156\1\uffff\1\154\1\146\1\145\1\147\2\uffff\1\145\1\157\1\141\3\75\1\uffff\1\55\2\uffff\1\157\1\162\1\141\1\55\1\uffff\2\0\2\uffff\2\164\1\147\1\144\1\uffff\1\143\1\142\1\163\7\uffff\2\55\1\uffff\1\144\1\163\2\55\1\146\4\uffff\1\146\1\151\1\156\1\170\11\uffff\1\164\1\165\1\154\1\uffff\1\55\2\uffff\1\55\1\145\4\55\1\163\1\55\1\157\2\uffff\1\40\1\145\2\uffff\1\151\1\157\2\156\3\55\1\145\1\163\1\uffff\1\162\4\uffff\1\143\1\uffff\1\165\1\uffff\1\40\1\156\1\162\1\143\1\164\3\uffff\1\55\1\145\1\55\2\162\1\144\2\145\1\151\1\55\1\uffff\1\55\1\uffff\1\151\1\143\2\uffff\2\55\1\144\1\uffff\1\142\1\145\2\uffff\2\145\3\55\3\uffff";
+ static final String DFA12_maxS =
+ "\1\uffff\1\166\1\165\1\145\1\75\1\uffff\1\57\1\uffff\1\162\1\uffff\1\156\1\146\1\157\1\147\2\uffff\1\145\1\157\1\151\3\75\1\uffff\1\172\2\uffff\1\157\1\162\1\141\1\172\1\uffff\2\uffff\2\uffff\2\164\1\147\1\144\1\uffff\1\164\1\155\1\163\7\uffff\2\172\1\uffff\1\144\1\163\2\172\1\146\4\uffff\1\146\1\165\1\156\1\170\11\uffff\1\164\1\165\1\154\1\uffff\1\172\2\uffff\1\172\1\145\4\172\1\163\1\172\1\157\2\uffff\1\40\1\145\2\uffff\1\151\1\157\2\156\3\172\1\145\1\163\1\uffff\1\162\4\uffff\1\143\1\uffff\1\165\1\uffff\1\40\1\156\1\162\1\143\1\164\3\uffff\1\172\1\145\1\172\2\162\1\151\2\145\1\151\1\172\1\uffff\1\172\1\uffff\1\151\1\143\2\uffff\2\172\1\144\1\uffff\1\142\1\145\2\uffff\2\145\3\172\3\uffff";
+ static final String DFA12_acceptS =
+ "\5\uffff\1\5\1\uffff\1\7\1\uffff\1\11\4\uffff\1\21\1\22\6\uffff\1\45\1\uffff\1\47\1\50\4\uffff\1\55\2\uffff\1\61\1\62\4\uffff\1\55\3\uffff\1\40\1\4\1\5\1\57\1\60\1\6\1\7\2\uffff\1\11\5\uffff\1\51\1\17\1\21\1\22\4\uffff\1\37\1\42\1\41\1\44\1\43\1\45\1\46\1\47\1\50\3\uffff\1\54\1\uffff\1\56\1\61\11\uffff\1\10\1\35\2\uffff\1\13\1\14\11\uffff\1\1\1\uffff\1\31\1\36\1\2\1\34\1\uffff\1\32\1\uffff\1\12\5\uffff\1\27\1\30\1\52\12\uffff\1\53\1\uffff\1\24\2\uffff\1\15\1\16\3\uffff\1\33\2\uffff\1\23\1\25\5\uffff\1\3\1\26\1\20";
+ static final String DFA12_specialS =
+ "\1\0\36\uffff\1\1\1\2\174\uffff}>";
+ static final String[] DFA12_transitionS = {
+ "\11\42\2\41\2\42\1\41\22\42\1\41\1\23\1\37\2\42\1\31\1\42\1\40\1\16\1\17\1\30\1\26\1\11\1\27\1\15\1\6\12\35\1\36\1\42\1\25\1\4\1\24\2\42\32\36\1\5\1\42\1\7\1\42\1\36\1\42\1\1\1\20\1\21\1\14\1\12\1\34\2\36\1\13\3\36\1\22\1\32\1\10\2\36\1\3\1\2\1\33\6\36\uff85\42",
+ "\1\43\2\uffff\1\44\7\uffff\1\46\7\uffff\1\45",
+ "\1\50\17\uffff\1\51",
+ "\1\52",
+ "\1\53",
+ "",
+ "\1\56\4\uffff\1\57",
+ "",
+ "\1\62\3\uffff\1\63",
+ "",
+ "\1\66\1\uffff\1\65",
+ "\1\67",
+ "\1\71\11\uffff\1\70",
+ "\1\72",
+ "",
+ "",
+ "\1\76",
+ "\1\77",
+ "\1\101\7\uffff\1\100",
+ "\1\102",
+ "\1\103",
+ "\1\105",
+ "",
+ "\1\47\2\uffff\13\47\6\uffff\32\47\4\uffff\1\47\1\uffff\32\47",
+ "",
+ "",
+ "\1\113",
+ "\1\114",
+ "\1\115",
+ "\1\47\2\uffff\12\117\1\47\6\uffff\32\47\4\uffff\1\47\1\uffff\32\47",
+ "",
+ "\0\120",
+ "\0\120",
+ "",
+ "",
+ "\1\122",
+ "\1\123",
+ "\1\124",
+ "\1\125",
+ "",
+ "\1\127\20\uffff\1\126",
+ "\1\130\12\uffff\1\131",
+ "\1\132",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "\1\47\2\uffff\13\47\6\uffff\32\47\4\uffff\1\47\1\uffff\32\47",
+ "\1\47\2\uffff\13\47\6\uffff\32\47\4\uffff\1\47\1\uffff\32\47",
+ "",
+ "\1\135",
+ "\1\136",
+ "\1\47\2\uffff\13\47\6\uffff\32\47\4\uffff\1\47\1\uffff\32\47",
+ "\1\47\2\uffff\13\47\6\uffff\32\47\4\uffff\1\47\1\uffff\32\47",
+ "\1\141",
+ "",
+ "",
+ "",
+ "",
+ "\1\142",
+ "\1\143\13\uffff\1\144",
+ "\1\145",
+ "\1\146",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "\1\147",
+ "\1\150",
+ "\1\151",
+ "",
+ "\1\47\2\uffff\12\117\1\47\6\uffff\32\47\4\uffff\1\47\1\uffff\32\47",
+ "",
+ "",
+ "\1\47\2\uffff\13\47\6\uffff\32\47\4\uffff\1\47\1\uffff\32\47",
+ "\1\153",
+ "\1\47\2\uffff\13\47\6\uffff\32\47\4\uffff\1\47\1\uffff\32\47",
+ "\1\47\2\uffff\13\47\6\uffff\32\47\4\uffff\1\47\1\uffff\32\47",
+ "\1\47\2\uffff\13\47\6\uffff\32\47\4\uffff\1\47\1\uffff\32\47",
+ "\1\47\2\uffff\13\47\6\uffff\32\47\4\uffff\1\47\1\uffff\32\47",
+ "\1\160",
+ "\1\47\2\uffff\13\47\6\uffff\32\47\4\uffff\1\47\1\uffff\32\47",
+ "\1\162",
+ "",
+ "",
+ "\1\163",
+ "\1\164",
+ "",
+ "",
+ "\1\165",
+ "\1\166",
+ "\1\167",
+ "\1\170",
+ "\1\47\2\uffff\13\47\6\uffff\32\47\4\uffff\1\47\1\uffff\32\47",
+ "\1\47\2\uffff\13\47\6\uffff\32\47\4\uffff\1\47\1\uffff\32\47",
+ "\1\47\2\uffff\13\47\6\uffff\32\47\4\uffff\1\47\1\uffff\32\47",
+ "\1\174",
+ "\1\175",
+ "",
+ "\1\176",
+ "",
+ "",
+ "",
+ "",
+ "\1\177",
+ "",
+ "\1\u0080",
+ "",
+ "\1\u0081",
+ "\1\u0082",
+ "\1\u0083",
+ "\1\u0084",
+ "\1\u0085",
+ "",
+ "",
+ "",
+ "\1\47\2\uffff\13\47\6\uffff\32\47\4\uffff\1\47\1\uffff\32\47",
+ "\1\u0087",
+ "\1\47\2\uffff\13\47\6\uffff\32\47\4\uffff\1\47\1\uffff\32\47",
+ "\1\u0089",
+ "\1\u008a",
+ "\1\u008c\4\uffff\1\u008b",
+ "\1\u008d",
+ "\1\u008e",
+ "\1\u008f",
+ "\1\47\2\uffff\13\47\6\uffff\32\47\4\uffff\1\47\1\uffff\32\47",
+ "",
+ "\1\47\2\uffff\13\47\6\uffff\32\47\4\uffff\1\47\1\uffff\32\47",
+ "",
+ "\1\u0091",
+ "\1\u0092",
+ "",
+ "",
+ "\1\47\2\uffff\13\47\6\uffff\32\47\4\uffff\1\47\1\uffff\32\47",
+ "\1\47\2\uffff\13\47\6\uffff\32\47\4\uffff\1\47\1\uffff\32\47",
+ "\1\u0095",
+ "",
+ "\1\u0096",
+ "\1\u0097",
+ "",
+ "",
+ "\1\u0098",
+ "\1\u0099",
+ "\1\47\2\uffff\13\47\6\uffff\32\47\4\uffff\1\47\1\uffff\32\47",
+ "\1\47\2\uffff\13\47\6\uffff\32\47\4\uffff\1\47\1\uffff\32\47",
+ "\1\47\2\uffff\13\47\6\uffff\32\47\4\uffff\1\47\1\uffff\32\47",
+ "",
+ "",
+ ""
+ };
+
+ static final short[] DFA12_eot = DFA.unpackEncodedString(DFA12_eotS);
+ static final short[] DFA12_eof = DFA.unpackEncodedString(DFA12_eofS);
+ static final char[] DFA12_min = DFA.unpackEncodedStringToUnsignedChars(DFA12_minS);
+ static final char[] DFA12_max = DFA.unpackEncodedStringToUnsignedChars(DFA12_maxS);
+ static final short[] DFA12_accept = DFA.unpackEncodedString(DFA12_acceptS);
+ static final short[] DFA12_special = DFA.unpackEncodedString(DFA12_specialS);
+ static final short[][] DFA12_transition;
+
+ static {
+ int numStates = DFA12_transitionS.length;
+ DFA12_transition = new short[numStates][];
+ for (int i=0; i<numStates; i++) {
+ DFA12_transition[i] = DFA.unpackEncodedString(DFA12_transitionS[i]);
+ }
+ }
+
+ class DFA12 extends DFA {
+
+ public DFA12(BaseRecognizer recognizer) {
+ this.recognizer = recognizer;
+ this.decisionNumber = 12;
+ this.eot = DFA12_eot;
+ this.eof = DFA12_eof;
+ this.min = DFA12_min;
+ this.max = DFA12_max;
+ this.accept = DFA12_accept;
+ this.special = DFA12_special;
+ this.transition = DFA12_transition;
+ }
+ public String getDescription() {
+ return "1:1: Tokens : ( T__12 | T__13 | T__14 | T__15 | T__16 | T__17 | T__18 | T__19 | T__20 | T__21 | T__22 | T__23 | T__24 | T__25 | T__26 | T__27 | T__28 | T__29 | T__30 | T__31 | T__32 | T__33 | T__34 | T__35 | T__36 | T__37 | T__38 | T__39 | T__40 | T__41 | T__42 | T__43 | T__44 | T__45 | T__46 | T__47 | T__48 | T__49 | T__50 | T__51 | T__52 | T__53 | RULE_BOOLEAN | RULE_INT | RULE_ID | RULE_STRING | RULE_ML_COMMENT | RULE_SL_COMMENT | RULE_WS | RULE_ANY_OTHER );";
+ }
+ public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+ IntStream input = _input;
+ int _s = s;
+ switch ( s ) {
+ case 0 :
+ int LA12_0 = input.LA(1);
+
+ s = -1;
+ if ( (LA12_0=='a') ) {s = 1;}
+
+ else if ( (LA12_0=='s') ) {s = 2;}
+
+ else if ( (LA12_0=='r') ) {s = 3;}
+
+ else if ( (LA12_0=='=') ) {s = 4;}
+
+ else if ( (LA12_0=='[') ) {s = 5;}
+
+ else if ( (LA12_0=='/') ) {s = 6;}
+
+ else if ( (LA12_0==']') ) {s = 7;}
+
+ else if ( (LA12_0=='o') ) {s = 8;}
+
+ else if ( (LA12_0==',') ) {s = 9;}
+
+ else if ( (LA12_0=='e') ) {s = 10;}
+
+ else if ( (LA12_0=='i') ) {s = 11;}
+
+ else if ( (LA12_0=='d') ) {s = 12;}
+
+ else if ( (LA12_0=='.') ) {s = 13;}
+
+ else if ( (LA12_0=='(') ) {s = 14;}
+
+ else if ( (LA12_0==')') ) {s = 15;}
+
+ else if ( (LA12_0=='b') ) {s = 16;}
+
+ else if ( (LA12_0=='c') ) {s = 17;}
+
+ else if ( (LA12_0=='m') ) {s = 18;}
+
+ else if ( (LA12_0=='!') ) {s = 19;}
+
+ else if ( (LA12_0=='>') ) {s = 20;}
+
+ else if ( (LA12_0=='<') ) {s = 21;}
+
+ else if ( (LA12_0=='+') ) {s = 22;}
+
+ else if ( (LA12_0=='-') ) {s = 23;}
+
+ else if ( (LA12_0=='*') ) {s = 24;}
+
+ else if ( (LA12_0=='%') ) {s = 25;}
+
+ else if ( (LA12_0=='n') ) {s = 26;}
+
+ else if ( (LA12_0=='t') ) {s = 27;}
+
+ else if ( (LA12_0=='f') ) {s = 28;}
+
+ else if ( ((LA12_0>='0' && LA12_0<='9')) ) {s = 29;}
+
+ else if ( (LA12_0==':'||(LA12_0>='A' && LA12_0<='Z')||LA12_0=='_'||(LA12_0>='g' && LA12_0<='h')||(LA12_0>='j' && LA12_0<='l')||(LA12_0>='p' && LA12_0<='q')||(LA12_0>='u' && LA12_0<='z')) ) {s = 30;}
+
+ else if ( (LA12_0=='\"') ) {s = 31;}
+
+ else if ( (LA12_0=='\'') ) {s = 32;}
+
+ else if ( ((LA12_0>='\t' && LA12_0<='\n')||LA12_0=='\r'||LA12_0==' ') ) {s = 33;}
+
+ else if ( ((LA12_0>='\u0000' && LA12_0<='\b')||(LA12_0>='\u000B' && LA12_0<='\f')||(LA12_0>='\u000E' && LA12_0<='\u001F')||(LA12_0>='#' && LA12_0<='$')||LA12_0=='&'||LA12_0==';'||(LA12_0>='?' && LA12_0<='@')||LA12_0=='\\'||LA12_0=='^'||LA12_0=='`'||(LA12_0>='{' && LA12_0<='\uFFFF')) ) {s = 34;}
+
+ if ( s>=0 ) return s;
+ break;
+ case 1 :
+ int LA12_31 = input.LA(1);
+
+ s = -1;
+ if ( ((LA12_31>='\u0000' && LA12_31<='\uFFFF')) ) {s = 80;}
+
+ else s = 34;
+
+ if ( s>=0 ) return s;
+ break;
+ case 2 :
+ int LA12_32 = input.LA(1);
+
+ s = -1;
+ if ( ((LA12_32>='\u0000' && LA12_32<='\uFFFF')) ) {s = 80;}
+
+ else s = 34;
+
+ if ( s>=0 ) return s;
+ break;
+ }
+ NoViableAltException nvae =
+ new NoViableAltException(getDescription(), 12, _s, input);
+ error(nvae);
+ throw nvae;
+ }
+ }
+
+
+}
\ No newline at end of file
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact.ide/src-gen/org/eclipse/sensinact/studio/language/ide/contentassist/antlr/internal/InternalSensinactParser.java b/xtext/org.eclipse.sensinact.studio.language.sensinact.ide/src-gen/org/eclipse/sensinact/studio/language/ide/contentassist/antlr/internal/InternalSensinactParser.java
new file mode 100644
index 0000000..cda8e2b
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact.ide/src-gen/org/eclipse/sensinact/studio/language/ide/contentassist/antlr/internal/InternalSensinactParser.java
@@ -0,0 +1,22938 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.language.ide.contentassist.antlr.internal;
+
+import java.io.InputStream;
+import org.eclipse.xtext.*;
+import org.eclipse.xtext.parser.*;
+import org.eclipse.xtext.parser.impl.*;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.xtext.parser.antlr.XtextTokenStream;
+import org.eclipse.xtext.parser.antlr.XtextTokenStream.HiddenTokens;
+import org.eclipse.xtext.ide.editor.contentassist.antlr.internal.AbstractInternalContentAssistParser;
+import org.eclipse.xtext.ide.editor.contentassist.antlr.internal.DFA;
+import org.eclipse.sensinact.studio.language.services.SensinactGrammarAccess;
+
+
+
+import org.antlr.runtime.*;
+import java.util.Stack;
+import java.util.List;
+import java.util.ArrayList;
+
+@SuppressWarnings("all")
+public class InternalSensinactParser extends AbstractInternalContentAssistParser {
+ public static final String[] tokenNames = new String[] {
+ "<invalid>", "<EOR>", "<DOWN>", "<UP>", "RULE_INT", "RULE_ID", "RULE_STRING", "RULE_BOOLEAN", "RULE_ML_COMMENT", "RULE_SL_COMMENT", "RULE_WS", "RULE_ANY_OTHER", "'act'", "'set'", "'resource'", "'='", "'['", "'/'", "']'", "'on'", "','", "'end if'", "'if'", "'do'", "'else if'", "'else do'", "'.'", "'subscribe'", "'('", "')'", "'define'", "'after'", "'before'", "'coincide'", "'min'", "'max'", "'avg'", "'sum'", "'count'", "'sec'", "'or'", "'and'", "'!='", "'=='", "'>'", "'>='", "'<'", "'<='", "'+'", "'-'", "'*'", "'%'", "'.get()'", "'not'"
+ };
+ public static final int T__50=50;
+ public static final int RULE_BOOLEAN=7;
+ public static final int T__19=19;
+ public static final int T__15=15;
+ public static final int T__16=16;
+ public static final int T__17=17;
+ public static final int T__18=18;
+ public static final int T__12=12;
+ public static final int T__13=13;
+ public static final int T__14=14;
+ public static final int T__51=51;
+ public static final int T__52=52;
+ public static final int T__53=53;
+ public static final int RULE_ID=5;
+ public static final int T__26=26;
+ public static final int T__27=27;
+ public static final int T__28=28;
+ public static final int RULE_INT=4;
+ public static final int T__29=29;
+ public static final int T__22=22;
+ public static final int RULE_ML_COMMENT=8;
+ public static final int T__23=23;
+ public static final int T__24=24;
+ public static final int T__25=25;
+ public static final int T__20=20;
+ public static final int T__21=21;
+ public static final int RULE_STRING=6;
+ public static final int RULE_SL_COMMENT=9;
+ public static final int T__37=37;
+ public static final int T__38=38;
+ public static final int T__39=39;
+ public static final int T__33=33;
+ public static final int T__34=34;
+ public static final int T__35=35;
+ public static final int T__36=36;
+ public static final int EOF=-1;
+ public static final int T__30=30;
+ public static final int T__31=31;
+ public static final int T__32=32;
+ public static final int RULE_WS=10;
+ public static final int RULE_ANY_OTHER=11;
+ public static final int T__48=48;
+ public static final int T__49=49;
+ public static final int T__44=44;
+ public static final int T__45=45;
+ public static final int T__46=46;
+ public static final int T__47=47;
+ public static final int T__40=40;
+ public static final int T__41=41;
+ public static final int T__42=42;
+ public static final int T__43=43;
+
+ // delegates
+ // delegators
+
+
+ public InternalSensinactParser(TokenStream input) {
+ this(input, new RecognizerSharedState());
+ }
+ public InternalSensinactParser(TokenStream input, RecognizerSharedState state) {
+ super(input, state);
+
+ }
+
+
+ public String[] getTokenNames() { return InternalSensinactParser.tokenNames; }
+ public String getGrammarFileName() { return "InternalSensinact.g"; }
+
+
+ private SensinactGrammarAccess grammarAccess;
+
+ public void setGrammarAccess(SensinactGrammarAccess grammarAccess) {
+ this.grammarAccess = grammarAccess;
+ }
+
+ @Override
+ protected Grammar getGrammar() {
+ return grammarAccess.getGrammar();
+ }
+
+ @Override
+ protected String getValueForTokenName(String tokenName) {
+ return tokenName;
+ }
+
+
+
+ // $ANTLR start "entryRuleSensinact"
+ // InternalSensinact.g:53:1: entryRuleSensinact : ruleSensinact EOF ;
+ public final void entryRuleSensinact() throws RecognitionException {
+ try {
+ // InternalSensinact.g:54:1: ( ruleSensinact EOF )
+ // InternalSensinact.g:55:1: ruleSensinact EOF
+ {
+ before(grammarAccess.getSensinactRule());
+ pushFollow(FOLLOW_1);
+ ruleSensinact();
+
+ state._fsp--;
+
+ after(grammarAccess.getSensinactRule());
+ match(input,EOF,FOLLOW_2);
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+ }
+ return ;
+ }
+ // $ANTLR end "entryRuleSensinact"
+
+
+ // $ANTLR start "ruleSensinact"
+ // InternalSensinact.g:62:1: ruleSensinact : ( ( rule__Sensinact__Group__0 ) ) ;
+ public final void ruleSensinact() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:66:2: ( ( ( rule__Sensinact__Group__0 ) ) )
+ // InternalSensinact.g:67:2: ( ( rule__Sensinact__Group__0 ) )
+ {
+ // InternalSensinact.g:67:2: ( ( rule__Sensinact__Group__0 ) )
+ // InternalSensinact.g:68:3: ( rule__Sensinact__Group__0 )
+ {
+ before(grammarAccess.getSensinactAccess().getGroup());
+ // InternalSensinact.g:69:3: ( rule__Sensinact__Group__0 )
+ // InternalSensinact.g:69:4: rule__Sensinact__Group__0
+ {
+ pushFollow(FOLLOW_2);
+ rule__Sensinact__Group__0();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getSensinactAccess().getGroup());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "ruleSensinact"
+
+
+ // $ANTLR start "entryRuleDSL_SENSINACT"
+ // InternalSensinact.g:78:1: entryRuleDSL_SENSINACT : ruleDSL_SENSINACT EOF ;
+ public final void entryRuleDSL_SENSINACT() throws RecognitionException {
+ try {
+ // InternalSensinact.g:79:1: ( ruleDSL_SENSINACT EOF )
+ // InternalSensinact.g:80:1: ruleDSL_SENSINACT EOF
+ {
+ before(grammarAccess.getDSL_SENSINACTRule());
+ pushFollow(FOLLOW_1);
+ ruleDSL_SENSINACT();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_SENSINACTRule());
+ match(input,EOF,FOLLOW_2);
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+ }
+ return ;
+ }
+ // $ANTLR end "entryRuleDSL_SENSINACT"
+
+
+ // $ANTLR start "ruleDSL_SENSINACT"
+ // InternalSensinact.g:87:1: ruleDSL_SENSINACT : ( ( rule__DSL_SENSINACT__Group__0 ) ) ;
+ public final void ruleDSL_SENSINACT() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:91:2: ( ( ( rule__DSL_SENSINACT__Group__0 ) ) )
+ // InternalSensinact.g:92:2: ( ( rule__DSL_SENSINACT__Group__0 ) )
+ {
+ // InternalSensinact.g:92:2: ( ( rule__DSL_SENSINACT__Group__0 ) )
+ // InternalSensinact.g:93:3: ( rule__DSL_SENSINACT__Group__0 )
+ {
+ before(grammarAccess.getDSL_SENSINACTAccess().getGroup());
+ // InternalSensinact.g:94:3: ( rule__DSL_SENSINACT__Group__0 )
+ // InternalSensinact.g:94:4: rule__DSL_SENSINACT__Group__0
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_SENSINACT__Group__0();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_SENSINACTAccess().getGroup());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "ruleDSL_SENSINACT"
+
+
+ // $ANTLR start "entryRuleDSL_Resource"
+ // InternalSensinact.g:103:1: entryRuleDSL_Resource : ruleDSL_Resource EOF ;
+ public final void entryRuleDSL_Resource() throws RecognitionException {
+ try {
+ // InternalSensinact.g:104:1: ( ruleDSL_Resource EOF )
+ // InternalSensinact.g:105:1: ruleDSL_Resource EOF
+ {
+ before(grammarAccess.getDSL_ResourceRule());
+ pushFollow(FOLLOW_1);
+ ruleDSL_Resource();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_ResourceRule());
+ match(input,EOF,FOLLOW_2);
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+ }
+ return ;
+ }
+ // $ANTLR end "entryRuleDSL_Resource"
+
+
+ // $ANTLR start "ruleDSL_Resource"
+ // InternalSensinact.g:112:1: ruleDSL_Resource : ( ( rule__DSL_Resource__Group__0 ) ) ;
+ public final void ruleDSL_Resource() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:116:2: ( ( ( rule__DSL_Resource__Group__0 ) ) )
+ // InternalSensinact.g:117:2: ( ( rule__DSL_Resource__Group__0 ) )
+ {
+ // InternalSensinact.g:117:2: ( ( rule__DSL_Resource__Group__0 ) )
+ // InternalSensinact.g:118:3: ( rule__DSL_Resource__Group__0 )
+ {
+ before(grammarAccess.getDSL_ResourceAccess().getGroup());
+ // InternalSensinact.g:119:3: ( rule__DSL_Resource__Group__0 )
+ // InternalSensinact.g:119:4: rule__DSL_Resource__Group__0
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Resource__Group__0();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_ResourceAccess().getGroup());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "ruleDSL_Resource"
+
+
+ // $ANTLR start "entryRuleDSL_On"
+ // InternalSensinact.g:128:1: entryRuleDSL_On : ruleDSL_On EOF ;
+ public final void entryRuleDSL_On() throws RecognitionException {
+ try {
+ // InternalSensinact.g:129:1: ( ruleDSL_On EOF )
+ // InternalSensinact.g:130:1: ruleDSL_On EOF
+ {
+ before(grammarAccess.getDSL_OnRule());
+ pushFollow(FOLLOW_1);
+ ruleDSL_On();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_OnRule());
+ match(input,EOF,FOLLOW_2);
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+ }
+ return ;
+ }
+ // $ANTLR end "entryRuleDSL_On"
+
+
+ // $ANTLR start "ruleDSL_On"
+ // InternalSensinact.g:137:1: ruleDSL_On : ( ( rule__DSL_On__Group__0 ) ) ;
+ public final void ruleDSL_On() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:141:2: ( ( ( rule__DSL_On__Group__0 ) ) )
+ // InternalSensinact.g:142:2: ( ( rule__DSL_On__Group__0 ) )
+ {
+ // InternalSensinact.g:142:2: ( ( rule__DSL_On__Group__0 ) )
+ // InternalSensinact.g:143:3: ( rule__DSL_On__Group__0 )
+ {
+ before(grammarAccess.getDSL_OnAccess().getGroup());
+ // InternalSensinact.g:144:3: ( rule__DSL_On__Group__0 )
+ // InternalSensinact.g:144:4: rule__DSL_On__Group__0
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_On__Group__0();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_OnAccess().getGroup());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "ruleDSL_On"
+
+
+ // $ANTLR start "entryRuleDSL_ECA_STATEMENT"
+ // InternalSensinact.g:153:1: entryRuleDSL_ECA_STATEMENT : ruleDSL_ECA_STATEMENT EOF ;
+ public final void entryRuleDSL_ECA_STATEMENT() throws RecognitionException {
+ try {
+ // InternalSensinact.g:154:1: ( ruleDSL_ECA_STATEMENT EOF )
+ // InternalSensinact.g:155:1: ruleDSL_ECA_STATEMENT EOF
+ {
+ before(grammarAccess.getDSL_ECA_STATEMENTRule());
+ pushFollow(FOLLOW_1);
+ ruleDSL_ECA_STATEMENT();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_ECA_STATEMENTRule());
+ match(input,EOF,FOLLOW_2);
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+ }
+ return ;
+ }
+ // $ANTLR end "entryRuleDSL_ECA_STATEMENT"
+
+
+ // $ANTLR start "ruleDSL_ECA_STATEMENT"
+ // InternalSensinact.g:162:1: ruleDSL_ECA_STATEMENT : ( ( rule__DSL_ECA_STATEMENT__Group__0 ) ) ;
+ public final void ruleDSL_ECA_STATEMENT() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:166:2: ( ( ( rule__DSL_ECA_STATEMENT__Group__0 ) ) )
+ // InternalSensinact.g:167:2: ( ( rule__DSL_ECA_STATEMENT__Group__0 ) )
+ {
+ // InternalSensinact.g:167:2: ( ( rule__DSL_ECA_STATEMENT__Group__0 ) )
+ // InternalSensinact.g:168:3: ( rule__DSL_ECA_STATEMENT__Group__0 )
+ {
+ before(grammarAccess.getDSL_ECA_STATEMENTAccess().getGroup());
+ // InternalSensinact.g:169:3: ( rule__DSL_ECA_STATEMENT__Group__0 )
+ // InternalSensinact.g:169:4: rule__DSL_ECA_STATEMENT__Group__0
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_ECA_STATEMENT__Group__0();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_ECA_STATEMENTAccess().getGroup());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "ruleDSL_ECA_STATEMENT"
+
+
+ // $ANTLR start "entryRuleDSL_IfDo"
+ // InternalSensinact.g:178:1: entryRuleDSL_IfDo : ruleDSL_IfDo EOF ;
+ public final void entryRuleDSL_IfDo() throws RecognitionException {
+ try {
+ // InternalSensinact.g:179:1: ( ruleDSL_IfDo EOF )
+ // InternalSensinact.g:180:1: ruleDSL_IfDo EOF
+ {
+ before(grammarAccess.getDSL_IfDoRule());
+ pushFollow(FOLLOW_1);
+ ruleDSL_IfDo();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_IfDoRule());
+ match(input,EOF,FOLLOW_2);
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+ }
+ return ;
+ }
+ // $ANTLR end "entryRuleDSL_IfDo"
+
+
+ // $ANTLR start "ruleDSL_IfDo"
+ // InternalSensinact.g:187:1: ruleDSL_IfDo : ( ( rule__DSL_IfDo__Group__0 ) ) ;
+ public final void ruleDSL_IfDo() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:191:2: ( ( ( rule__DSL_IfDo__Group__0 ) ) )
+ // InternalSensinact.g:192:2: ( ( rule__DSL_IfDo__Group__0 ) )
+ {
+ // InternalSensinact.g:192:2: ( ( rule__DSL_IfDo__Group__0 ) )
+ // InternalSensinact.g:193:3: ( rule__DSL_IfDo__Group__0 )
+ {
+ before(grammarAccess.getDSL_IfDoAccess().getGroup());
+ // InternalSensinact.g:194:3: ( rule__DSL_IfDo__Group__0 )
+ // InternalSensinact.g:194:4: rule__DSL_IfDo__Group__0
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_IfDo__Group__0();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_IfDoAccess().getGroup());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "ruleDSL_IfDo"
+
+
+ // $ANTLR start "entryRuleDSL_ElseIfDo"
+ // InternalSensinact.g:203:1: entryRuleDSL_ElseIfDo : ruleDSL_ElseIfDo EOF ;
+ public final void entryRuleDSL_ElseIfDo() throws RecognitionException {
+ try {
+ // InternalSensinact.g:204:1: ( ruleDSL_ElseIfDo EOF )
+ // InternalSensinact.g:205:1: ruleDSL_ElseIfDo EOF
+ {
+ before(grammarAccess.getDSL_ElseIfDoRule());
+ pushFollow(FOLLOW_1);
+ ruleDSL_ElseIfDo();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_ElseIfDoRule());
+ match(input,EOF,FOLLOW_2);
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+ }
+ return ;
+ }
+ // $ANTLR end "entryRuleDSL_ElseIfDo"
+
+
+ // $ANTLR start "ruleDSL_ElseIfDo"
+ // InternalSensinact.g:212:1: ruleDSL_ElseIfDo : ( ( rule__DSL_ElseIfDo__Group__0 ) ) ;
+ public final void ruleDSL_ElseIfDo() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:216:2: ( ( ( rule__DSL_ElseIfDo__Group__0 ) ) )
+ // InternalSensinact.g:217:2: ( ( rule__DSL_ElseIfDo__Group__0 ) )
+ {
+ // InternalSensinact.g:217:2: ( ( rule__DSL_ElseIfDo__Group__0 ) )
+ // InternalSensinact.g:218:3: ( rule__DSL_ElseIfDo__Group__0 )
+ {
+ before(grammarAccess.getDSL_ElseIfDoAccess().getGroup());
+ // InternalSensinact.g:219:3: ( rule__DSL_ElseIfDo__Group__0 )
+ // InternalSensinact.g:219:4: rule__DSL_ElseIfDo__Group__0
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_ElseIfDo__Group__0();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_ElseIfDoAccess().getGroup());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "ruleDSL_ElseIfDo"
+
+
+ // $ANTLR start "entryRuleDSL_ElseDo"
+ // InternalSensinact.g:228:1: entryRuleDSL_ElseDo : ruleDSL_ElseDo EOF ;
+ public final void entryRuleDSL_ElseDo() throws RecognitionException {
+ try {
+ // InternalSensinact.g:229:1: ( ruleDSL_ElseDo EOF )
+ // InternalSensinact.g:230:1: ruleDSL_ElseDo EOF
+ {
+ before(grammarAccess.getDSL_ElseDoRule());
+ pushFollow(FOLLOW_1);
+ ruleDSL_ElseDo();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_ElseDoRule());
+ match(input,EOF,FOLLOW_2);
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+ }
+ return ;
+ }
+ // $ANTLR end "entryRuleDSL_ElseDo"
+
+
+ // $ANTLR start "ruleDSL_ElseDo"
+ // InternalSensinact.g:237:1: ruleDSL_ElseDo : ( ( rule__DSL_ElseDo__Group__0 ) ) ;
+ public final void ruleDSL_ElseDo() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:241:2: ( ( ( rule__DSL_ElseDo__Group__0 ) ) )
+ // InternalSensinact.g:242:2: ( ( rule__DSL_ElseDo__Group__0 ) )
+ {
+ // InternalSensinact.g:242:2: ( ( rule__DSL_ElseDo__Group__0 ) )
+ // InternalSensinact.g:243:3: ( rule__DSL_ElseDo__Group__0 )
+ {
+ before(grammarAccess.getDSL_ElseDoAccess().getGroup());
+ // InternalSensinact.g:244:3: ( rule__DSL_ElseDo__Group__0 )
+ // InternalSensinact.g:244:4: rule__DSL_ElseDo__Group__0
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_ElseDo__Group__0();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_ElseDoAccess().getGroup());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "ruleDSL_ElseDo"
+
+
+ // $ANTLR start "entryRuleNUMBER"
+ // InternalSensinact.g:253:1: entryRuleNUMBER : ruleNUMBER EOF ;
+ public final void entryRuleNUMBER() throws RecognitionException {
+ try {
+ // InternalSensinact.g:254:1: ( ruleNUMBER EOF )
+ // InternalSensinact.g:255:1: ruleNUMBER EOF
+ {
+ before(grammarAccess.getNUMBERRule());
+ pushFollow(FOLLOW_1);
+ ruleNUMBER();
+
+ state._fsp--;
+
+ after(grammarAccess.getNUMBERRule());
+ match(input,EOF,FOLLOW_2);
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+ }
+ return ;
+ }
+ // $ANTLR end "entryRuleNUMBER"
+
+
+ // $ANTLR start "ruleNUMBER"
+ // InternalSensinact.g:262:1: ruleNUMBER : ( ( rule__NUMBER__Alternatives ) ) ;
+ public final void ruleNUMBER() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:266:2: ( ( ( rule__NUMBER__Alternatives ) ) )
+ // InternalSensinact.g:267:2: ( ( rule__NUMBER__Alternatives ) )
+ {
+ // InternalSensinact.g:267:2: ( ( rule__NUMBER__Alternatives ) )
+ // InternalSensinact.g:268:3: ( rule__NUMBER__Alternatives )
+ {
+ before(grammarAccess.getNUMBERAccess().getAlternatives());
+ // InternalSensinact.g:269:3: ( rule__NUMBER__Alternatives )
+ // InternalSensinact.g:269:4: rule__NUMBER__Alternatives
+ {
+ pushFollow(FOLLOW_2);
+ rule__NUMBER__Alternatives();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getNUMBERAccess().getAlternatives());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "ruleNUMBER"
+
+
+ // $ANTLR start "entryRuleEXTENDED_ID"
+ // InternalSensinact.g:278:1: entryRuleEXTENDED_ID : ruleEXTENDED_ID EOF ;
+ public final void entryRuleEXTENDED_ID() throws RecognitionException {
+ try {
+ // InternalSensinact.g:279:1: ( ruleEXTENDED_ID EOF )
+ // InternalSensinact.g:280:1: ruleEXTENDED_ID EOF
+ {
+ before(grammarAccess.getEXTENDED_IDRule());
+ pushFollow(FOLLOW_1);
+ ruleEXTENDED_ID();
+
+ state._fsp--;
+
+ after(grammarAccess.getEXTENDED_IDRule());
+ match(input,EOF,FOLLOW_2);
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+ }
+ return ;
+ }
+ // $ANTLR end "entryRuleEXTENDED_ID"
+
+
+ // $ANTLR start "ruleEXTENDED_ID"
+ // InternalSensinact.g:287:1: ruleEXTENDED_ID : ( ( rule__EXTENDED_ID__Group__0 ) ) ;
+ public final void ruleEXTENDED_ID() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:291:2: ( ( ( rule__EXTENDED_ID__Group__0 ) ) )
+ // InternalSensinact.g:292:2: ( ( rule__EXTENDED_ID__Group__0 ) )
+ {
+ // InternalSensinact.g:292:2: ( ( rule__EXTENDED_ID__Group__0 ) )
+ // InternalSensinact.g:293:3: ( rule__EXTENDED_ID__Group__0 )
+ {
+ before(grammarAccess.getEXTENDED_IDAccess().getGroup());
+ // InternalSensinact.g:294:3: ( rule__EXTENDED_ID__Group__0 )
+ // InternalSensinact.g:294:4: rule__EXTENDED_ID__Group__0
+ {
+ pushFollow(FOLLOW_2);
+ rule__EXTENDED_ID__Group__0();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getEXTENDED_IDAccess().getGroup());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "ruleEXTENDED_ID"
+
+
+ // $ANTLR start "entryRuleDSL_REF_CONDITION"
+ // InternalSensinact.g:303:1: entryRuleDSL_REF_CONDITION : ruleDSL_REF_CONDITION EOF ;
+ public final void entryRuleDSL_REF_CONDITION() throws RecognitionException {
+ try {
+ // InternalSensinact.g:304:1: ( ruleDSL_REF_CONDITION EOF )
+ // InternalSensinact.g:305:1: ruleDSL_REF_CONDITION EOF
+ {
+ before(grammarAccess.getDSL_REF_CONDITIONRule());
+ pushFollow(FOLLOW_1);
+ ruleDSL_REF_CONDITION();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_REF_CONDITIONRule());
+ match(input,EOF,FOLLOW_2);
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+ }
+ return ;
+ }
+ // $ANTLR end "entryRuleDSL_REF_CONDITION"
+
+
+ // $ANTLR start "ruleDSL_REF_CONDITION"
+ // InternalSensinact.g:312:1: ruleDSL_REF_CONDITION : ( ( rule__DSL_REF_CONDITION__Group__0 ) ) ;
+ public final void ruleDSL_REF_CONDITION() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:316:2: ( ( ( rule__DSL_REF_CONDITION__Group__0 ) ) )
+ // InternalSensinact.g:317:2: ( ( rule__DSL_REF_CONDITION__Group__0 ) )
+ {
+ // InternalSensinact.g:317:2: ( ( rule__DSL_REF_CONDITION__Group__0 ) )
+ // InternalSensinact.g:318:3: ( rule__DSL_REF_CONDITION__Group__0 )
+ {
+ before(grammarAccess.getDSL_REF_CONDITIONAccess().getGroup());
+ // InternalSensinact.g:319:3: ( rule__DSL_REF_CONDITION__Group__0 )
+ // InternalSensinact.g:319:4: rule__DSL_REF_CONDITION__Group__0
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_REF_CONDITION__Group__0();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_REF_CONDITIONAccess().getGroup());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "ruleDSL_REF_CONDITION"
+
+
+ // $ANTLR start "entryRuleDSL_CEP_STATEMENT"
+ // InternalSensinact.g:328:1: entryRuleDSL_CEP_STATEMENT : ruleDSL_CEP_STATEMENT EOF ;
+ public final void entryRuleDSL_CEP_STATEMENT() throws RecognitionException {
+ try {
+ // InternalSensinact.g:329:1: ( ruleDSL_CEP_STATEMENT EOF )
+ // InternalSensinact.g:330:1: ruleDSL_CEP_STATEMENT EOF
+ {
+ before(grammarAccess.getDSL_CEP_STATEMENTRule());
+ pushFollow(FOLLOW_1);
+ ruleDSL_CEP_STATEMENT();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_CEP_STATEMENTRule());
+ match(input,EOF,FOLLOW_2);
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+ }
+ return ;
+ }
+ // $ANTLR end "entryRuleDSL_CEP_STATEMENT"
+
+
+ // $ANTLR start "ruleDSL_CEP_STATEMENT"
+ // InternalSensinact.g:337:1: ruleDSL_CEP_STATEMENT : ( ( rule__DSL_CEP_STATEMENT__Group__0 ) ) ;
+ public final void ruleDSL_CEP_STATEMENT() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:341:2: ( ( ( rule__DSL_CEP_STATEMENT__Group__0 ) ) )
+ // InternalSensinact.g:342:2: ( ( rule__DSL_CEP_STATEMENT__Group__0 ) )
+ {
+ // InternalSensinact.g:342:2: ( ( rule__DSL_CEP_STATEMENT__Group__0 ) )
+ // InternalSensinact.g:343:3: ( rule__DSL_CEP_STATEMENT__Group__0 )
+ {
+ before(grammarAccess.getDSL_CEP_STATEMENTAccess().getGroup());
+ // InternalSensinact.g:344:3: ( rule__DSL_CEP_STATEMENT__Group__0 )
+ // InternalSensinact.g:344:4: rule__DSL_CEP_STATEMENT__Group__0
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_STATEMENT__Group__0();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_CEP_STATEMENTAccess().getGroup());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "ruleDSL_CEP_STATEMENT"
+
+
+ // $ANTLR start "entryRuleDSL_CEP_AFTER"
+ // InternalSensinact.g:353:1: entryRuleDSL_CEP_AFTER : ruleDSL_CEP_AFTER EOF ;
+ public final void entryRuleDSL_CEP_AFTER() throws RecognitionException {
+ try {
+ // InternalSensinact.g:354:1: ( ruleDSL_CEP_AFTER EOF )
+ // InternalSensinact.g:355:1: ruleDSL_CEP_AFTER EOF
+ {
+ before(grammarAccess.getDSL_CEP_AFTERRule());
+ pushFollow(FOLLOW_1);
+ ruleDSL_CEP_AFTER();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_CEP_AFTERRule());
+ match(input,EOF,FOLLOW_2);
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+ }
+ return ;
+ }
+ // $ANTLR end "entryRuleDSL_CEP_AFTER"
+
+
+ // $ANTLR start "ruleDSL_CEP_AFTER"
+ // InternalSensinact.g:362:1: ruleDSL_CEP_AFTER : ( ( rule__DSL_CEP_AFTER__Group__0 ) ) ;
+ public final void ruleDSL_CEP_AFTER() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:366:2: ( ( ( rule__DSL_CEP_AFTER__Group__0 ) ) )
+ // InternalSensinact.g:367:2: ( ( rule__DSL_CEP_AFTER__Group__0 ) )
+ {
+ // InternalSensinact.g:367:2: ( ( rule__DSL_CEP_AFTER__Group__0 ) )
+ // InternalSensinact.g:368:3: ( rule__DSL_CEP_AFTER__Group__0 )
+ {
+ before(grammarAccess.getDSL_CEP_AFTERAccess().getGroup());
+ // InternalSensinact.g:369:3: ( rule__DSL_CEP_AFTER__Group__0 )
+ // InternalSensinact.g:369:4: rule__DSL_CEP_AFTER__Group__0
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_AFTER__Group__0();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_CEP_AFTERAccess().getGroup());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "ruleDSL_CEP_AFTER"
+
+
+ // $ANTLR start "entryRuleDSL_CEP_BEFORE"
+ // InternalSensinact.g:378:1: entryRuleDSL_CEP_BEFORE : ruleDSL_CEP_BEFORE EOF ;
+ public final void entryRuleDSL_CEP_BEFORE() throws RecognitionException {
+ try {
+ // InternalSensinact.g:379:1: ( ruleDSL_CEP_BEFORE EOF )
+ // InternalSensinact.g:380:1: ruleDSL_CEP_BEFORE EOF
+ {
+ before(grammarAccess.getDSL_CEP_BEFORERule());
+ pushFollow(FOLLOW_1);
+ ruleDSL_CEP_BEFORE();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_CEP_BEFORERule());
+ match(input,EOF,FOLLOW_2);
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+ }
+ return ;
+ }
+ // $ANTLR end "entryRuleDSL_CEP_BEFORE"
+
+
+ // $ANTLR start "ruleDSL_CEP_BEFORE"
+ // InternalSensinact.g:387:1: ruleDSL_CEP_BEFORE : ( ( rule__DSL_CEP_BEFORE__Group__0 ) ) ;
+ public final void ruleDSL_CEP_BEFORE() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:391:2: ( ( ( rule__DSL_CEP_BEFORE__Group__0 ) ) )
+ // InternalSensinact.g:392:2: ( ( rule__DSL_CEP_BEFORE__Group__0 ) )
+ {
+ // InternalSensinact.g:392:2: ( ( rule__DSL_CEP_BEFORE__Group__0 ) )
+ // InternalSensinact.g:393:3: ( rule__DSL_CEP_BEFORE__Group__0 )
+ {
+ before(grammarAccess.getDSL_CEP_BEFOREAccess().getGroup());
+ // InternalSensinact.g:394:3: ( rule__DSL_CEP_BEFORE__Group__0 )
+ // InternalSensinact.g:394:4: rule__DSL_CEP_BEFORE__Group__0
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_BEFORE__Group__0();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_CEP_BEFOREAccess().getGroup());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "ruleDSL_CEP_BEFORE"
+
+
+ // $ANTLR start "entryRuleDSL_CEP_COINCIDE"
+ // InternalSensinact.g:403:1: entryRuleDSL_CEP_COINCIDE : ruleDSL_CEP_COINCIDE EOF ;
+ public final void entryRuleDSL_CEP_COINCIDE() throws RecognitionException {
+ try {
+ // InternalSensinact.g:404:1: ( ruleDSL_CEP_COINCIDE EOF )
+ // InternalSensinact.g:405:1: ruleDSL_CEP_COINCIDE EOF
+ {
+ before(grammarAccess.getDSL_CEP_COINCIDERule());
+ pushFollow(FOLLOW_1);
+ ruleDSL_CEP_COINCIDE();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_CEP_COINCIDERule());
+ match(input,EOF,FOLLOW_2);
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+ }
+ return ;
+ }
+ // $ANTLR end "entryRuleDSL_CEP_COINCIDE"
+
+
+ // $ANTLR start "ruleDSL_CEP_COINCIDE"
+ // InternalSensinact.g:412:1: ruleDSL_CEP_COINCIDE : ( ( rule__DSL_CEP_COINCIDE__Group__0 ) ) ;
+ public final void ruleDSL_CEP_COINCIDE() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:416:2: ( ( ( rule__DSL_CEP_COINCIDE__Group__0 ) ) )
+ // InternalSensinact.g:417:2: ( ( rule__DSL_CEP_COINCIDE__Group__0 ) )
+ {
+ // InternalSensinact.g:417:2: ( ( rule__DSL_CEP_COINCIDE__Group__0 ) )
+ // InternalSensinact.g:418:3: ( rule__DSL_CEP_COINCIDE__Group__0 )
+ {
+ before(grammarAccess.getDSL_CEP_COINCIDEAccess().getGroup());
+ // InternalSensinact.g:419:3: ( rule__DSL_CEP_COINCIDE__Group__0 )
+ // InternalSensinact.g:419:4: rule__DSL_CEP_COINCIDE__Group__0
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_COINCIDE__Group__0();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_CEP_COINCIDEAccess().getGroup());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "ruleDSL_CEP_COINCIDE"
+
+
+ // $ANTLR start "entryRuleDSL_CEP_MIN"
+ // InternalSensinact.g:428:1: entryRuleDSL_CEP_MIN : ruleDSL_CEP_MIN EOF ;
+ public final void entryRuleDSL_CEP_MIN() throws RecognitionException {
+ try {
+ // InternalSensinact.g:429:1: ( ruleDSL_CEP_MIN EOF )
+ // InternalSensinact.g:430:1: ruleDSL_CEP_MIN EOF
+ {
+ before(grammarAccess.getDSL_CEP_MINRule());
+ pushFollow(FOLLOW_1);
+ ruleDSL_CEP_MIN();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_CEP_MINRule());
+ match(input,EOF,FOLLOW_2);
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+ }
+ return ;
+ }
+ // $ANTLR end "entryRuleDSL_CEP_MIN"
+
+
+ // $ANTLR start "ruleDSL_CEP_MIN"
+ // InternalSensinact.g:437:1: ruleDSL_CEP_MIN : ( ( rule__DSL_CEP_MIN__Group__0 ) ) ;
+ public final void ruleDSL_CEP_MIN() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:441:2: ( ( ( rule__DSL_CEP_MIN__Group__0 ) ) )
+ // InternalSensinact.g:442:2: ( ( rule__DSL_CEP_MIN__Group__0 ) )
+ {
+ // InternalSensinact.g:442:2: ( ( rule__DSL_CEP_MIN__Group__0 ) )
+ // InternalSensinact.g:443:3: ( rule__DSL_CEP_MIN__Group__0 )
+ {
+ before(grammarAccess.getDSL_CEP_MINAccess().getGroup());
+ // InternalSensinact.g:444:3: ( rule__DSL_CEP_MIN__Group__0 )
+ // InternalSensinact.g:444:4: rule__DSL_CEP_MIN__Group__0
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_MIN__Group__0();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_CEP_MINAccess().getGroup());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "ruleDSL_CEP_MIN"
+
+
+ // $ANTLR start "entryRuleDSL_CEP_MAX"
+ // InternalSensinact.g:453:1: entryRuleDSL_CEP_MAX : ruleDSL_CEP_MAX EOF ;
+ public final void entryRuleDSL_CEP_MAX() throws RecognitionException {
+ try {
+ // InternalSensinact.g:454:1: ( ruleDSL_CEP_MAX EOF )
+ // InternalSensinact.g:455:1: ruleDSL_CEP_MAX EOF
+ {
+ before(grammarAccess.getDSL_CEP_MAXRule());
+ pushFollow(FOLLOW_1);
+ ruleDSL_CEP_MAX();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_CEP_MAXRule());
+ match(input,EOF,FOLLOW_2);
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+ }
+ return ;
+ }
+ // $ANTLR end "entryRuleDSL_CEP_MAX"
+
+
+ // $ANTLR start "ruleDSL_CEP_MAX"
+ // InternalSensinact.g:462:1: ruleDSL_CEP_MAX : ( ( rule__DSL_CEP_MAX__Group__0 ) ) ;
+ public final void ruleDSL_CEP_MAX() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:466:2: ( ( ( rule__DSL_CEP_MAX__Group__0 ) ) )
+ // InternalSensinact.g:467:2: ( ( rule__DSL_CEP_MAX__Group__0 ) )
+ {
+ // InternalSensinact.g:467:2: ( ( rule__DSL_CEP_MAX__Group__0 ) )
+ // InternalSensinact.g:468:3: ( rule__DSL_CEP_MAX__Group__0 )
+ {
+ before(grammarAccess.getDSL_CEP_MAXAccess().getGroup());
+ // InternalSensinact.g:469:3: ( rule__DSL_CEP_MAX__Group__0 )
+ // InternalSensinact.g:469:4: rule__DSL_CEP_MAX__Group__0
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_MAX__Group__0();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_CEP_MAXAccess().getGroup());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "ruleDSL_CEP_MAX"
+
+
+ // $ANTLR start "entryRuleDSL_CEP_AVG"
+ // InternalSensinact.g:478:1: entryRuleDSL_CEP_AVG : ruleDSL_CEP_AVG EOF ;
+ public final void entryRuleDSL_CEP_AVG() throws RecognitionException {
+ try {
+ // InternalSensinact.g:479:1: ( ruleDSL_CEP_AVG EOF )
+ // InternalSensinact.g:480:1: ruleDSL_CEP_AVG EOF
+ {
+ before(grammarAccess.getDSL_CEP_AVGRule());
+ pushFollow(FOLLOW_1);
+ ruleDSL_CEP_AVG();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_CEP_AVGRule());
+ match(input,EOF,FOLLOW_2);
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+ }
+ return ;
+ }
+ // $ANTLR end "entryRuleDSL_CEP_AVG"
+
+
+ // $ANTLR start "ruleDSL_CEP_AVG"
+ // InternalSensinact.g:487:1: ruleDSL_CEP_AVG : ( ( rule__DSL_CEP_AVG__Group__0 ) ) ;
+ public final void ruleDSL_CEP_AVG() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:491:2: ( ( ( rule__DSL_CEP_AVG__Group__0 ) ) )
+ // InternalSensinact.g:492:2: ( ( rule__DSL_CEP_AVG__Group__0 ) )
+ {
+ // InternalSensinact.g:492:2: ( ( rule__DSL_CEP_AVG__Group__0 ) )
+ // InternalSensinact.g:493:3: ( rule__DSL_CEP_AVG__Group__0 )
+ {
+ before(grammarAccess.getDSL_CEP_AVGAccess().getGroup());
+ // InternalSensinact.g:494:3: ( rule__DSL_CEP_AVG__Group__0 )
+ // InternalSensinact.g:494:4: rule__DSL_CEP_AVG__Group__0
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_AVG__Group__0();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_CEP_AVGAccess().getGroup());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "ruleDSL_CEP_AVG"
+
+
+ // $ANTLR start "entryRuleDSL_CEP_SUM"
+ // InternalSensinact.g:503:1: entryRuleDSL_CEP_SUM : ruleDSL_CEP_SUM EOF ;
+ public final void entryRuleDSL_CEP_SUM() throws RecognitionException {
+ try {
+ // InternalSensinact.g:504:1: ( ruleDSL_CEP_SUM EOF )
+ // InternalSensinact.g:505:1: ruleDSL_CEP_SUM EOF
+ {
+ before(grammarAccess.getDSL_CEP_SUMRule());
+ pushFollow(FOLLOW_1);
+ ruleDSL_CEP_SUM();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_CEP_SUMRule());
+ match(input,EOF,FOLLOW_2);
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+ }
+ return ;
+ }
+ // $ANTLR end "entryRuleDSL_CEP_SUM"
+
+
+ // $ANTLR start "ruleDSL_CEP_SUM"
+ // InternalSensinact.g:512:1: ruleDSL_CEP_SUM : ( ( rule__DSL_CEP_SUM__Group__0 ) ) ;
+ public final void ruleDSL_CEP_SUM() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:516:2: ( ( ( rule__DSL_CEP_SUM__Group__0 ) ) )
+ // InternalSensinact.g:517:2: ( ( rule__DSL_CEP_SUM__Group__0 ) )
+ {
+ // InternalSensinact.g:517:2: ( ( rule__DSL_CEP_SUM__Group__0 ) )
+ // InternalSensinact.g:518:3: ( rule__DSL_CEP_SUM__Group__0 )
+ {
+ before(grammarAccess.getDSL_CEP_SUMAccess().getGroup());
+ // InternalSensinact.g:519:3: ( rule__DSL_CEP_SUM__Group__0 )
+ // InternalSensinact.g:519:4: rule__DSL_CEP_SUM__Group__0
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_SUM__Group__0();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_CEP_SUMAccess().getGroup());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "ruleDSL_CEP_SUM"
+
+
+ // $ANTLR start "entryRuleDSL_CEP_COUNT"
+ // InternalSensinact.g:528:1: entryRuleDSL_CEP_COUNT : ruleDSL_CEP_COUNT EOF ;
+ public final void entryRuleDSL_CEP_COUNT() throws RecognitionException {
+ try {
+ // InternalSensinact.g:529:1: ( ruleDSL_CEP_COUNT EOF )
+ // InternalSensinact.g:530:1: ruleDSL_CEP_COUNT EOF
+ {
+ before(grammarAccess.getDSL_CEP_COUNTRule());
+ pushFollow(FOLLOW_1);
+ ruleDSL_CEP_COUNT();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_CEP_COUNTRule());
+ match(input,EOF,FOLLOW_2);
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+ }
+ return ;
+ }
+ // $ANTLR end "entryRuleDSL_CEP_COUNT"
+
+
+ // $ANTLR start "ruleDSL_CEP_COUNT"
+ // InternalSensinact.g:537:1: ruleDSL_CEP_COUNT : ( ( rule__DSL_CEP_COUNT__Group__0 ) ) ;
+ public final void ruleDSL_CEP_COUNT() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:541:2: ( ( ( rule__DSL_CEP_COUNT__Group__0 ) ) )
+ // InternalSensinact.g:542:2: ( ( rule__DSL_CEP_COUNT__Group__0 ) )
+ {
+ // InternalSensinact.g:542:2: ( ( rule__DSL_CEP_COUNT__Group__0 ) )
+ // InternalSensinact.g:543:3: ( rule__DSL_CEP_COUNT__Group__0 )
+ {
+ before(grammarAccess.getDSL_CEP_COUNTAccess().getGroup());
+ // InternalSensinact.g:544:3: ( rule__DSL_CEP_COUNT__Group__0 )
+ // InternalSensinact.g:544:4: rule__DSL_CEP_COUNT__Group__0
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_COUNT__Group__0();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_CEP_COUNTAccess().getGroup());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "ruleDSL_CEP_COUNT"
+
+
+ // $ANTLR start "entryRuleDSL_CEP_DURATION"
+ // InternalSensinact.g:553:1: entryRuleDSL_CEP_DURATION : ruleDSL_CEP_DURATION EOF ;
+ public final void entryRuleDSL_CEP_DURATION() throws RecognitionException {
+ try {
+ // InternalSensinact.g:554:1: ( ruleDSL_CEP_DURATION EOF )
+ // InternalSensinact.g:555:1: ruleDSL_CEP_DURATION EOF
+ {
+ before(grammarAccess.getDSL_CEP_DURATIONRule());
+ pushFollow(FOLLOW_1);
+ ruleDSL_CEP_DURATION();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_CEP_DURATIONRule());
+ match(input,EOF,FOLLOW_2);
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+ }
+ return ;
+ }
+ // $ANTLR end "entryRuleDSL_CEP_DURATION"
+
+
+ // $ANTLR start "ruleDSL_CEP_DURATION"
+ // InternalSensinact.g:562:1: ruleDSL_CEP_DURATION : ( ( ( rule__DSL_CEP_DURATION__UnitsAssignment ) ) ( ( rule__DSL_CEP_DURATION__UnitsAssignment )* ) ) ;
+ public final void ruleDSL_CEP_DURATION() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:566:2: ( ( ( ( rule__DSL_CEP_DURATION__UnitsAssignment ) ) ( ( rule__DSL_CEP_DURATION__UnitsAssignment )* ) ) )
+ // InternalSensinact.g:567:2: ( ( ( rule__DSL_CEP_DURATION__UnitsAssignment ) ) ( ( rule__DSL_CEP_DURATION__UnitsAssignment )* ) )
+ {
+ // InternalSensinact.g:567:2: ( ( ( rule__DSL_CEP_DURATION__UnitsAssignment ) ) ( ( rule__DSL_CEP_DURATION__UnitsAssignment )* ) )
+ // InternalSensinact.g:568:3: ( ( rule__DSL_CEP_DURATION__UnitsAssignment ) ) ( ( rule__DSL_CEP_DURATION__UnitsAssignment )* )
+ {
+ // InternalSensinact.g:568:3: ( ( rule__DSL_CEP_DURATION__UnitsAssignment ) )
+ // InternalSensinact.g:569:4: ( rule__DSL_CEP_DURATION__UnitsAssignment )
+ {
+ before(grammarAccess.getDSL_CEP_DURATIONAccess().getUnitsAssignment());
+ // InternalSensinact.g:570:4: ( rule__DSL_CEP_DURATION__UnitsAssignment )
+ // InternalSensinact.g:570:5: rule__DSL_CEP_DURATION__UnitsAssignment
+ {
+ pushFollow(FOLLOW_3);
+ rule__DSL_CEP_DURATION__UnitsAssignment();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_CEP_DURATIONAccess().getUnitsAssignment());
+
+ }
+
+ // InternalSensinact.g:573:3: ( ( rule__DSL_CEP_DURATION__UnitsAssignment )* )
+ // InternalSensinact.g:574:4: ( rule__DSL_CEP_DURATION__UnitsAssignment )*
+ {
+ before(grammarAccess.getDSL_CEP_DURATIONAccess().getUnitsAssignment());
+ // InternalSensinact.g:575:4: ( rule__DSL_CEP_DURATION__UnitsAssignment )*
+ loop1:
+ do {
+ int alt1=2;
+ int LA1_0 = input.LA(1);
+
+ if ( (LA1_0==RULE_INT) ) {
+ alt1=1;
+ }
+
+
+ switch (alt1) {
+ case 1 :
+ // InternalSensinact.g:575:5: rule__DSL_CEP_DURATION__UnitsAssignment
+ {
+ pushFollow(FOLLOW_3);
+ rule__DSL_CEP_DURATION__UnitsAssignment();
+
+ state._fsp--;
+
+
+ }
+ break;
+
+ default :
+ break loop1;
+ }
+ } while (true);
+
+ after(grammarAccess.getDSL_CEP_DURATIONAccess().getUnitsAssignment());
+
+ }
+
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "ruleDSL_CEP_DURATION"
+
+
+ // $ANTLR start "entryRuleDSL_CEP_DURATION_MIN"
+ // InternalSensinact.g:585:1: entryRuleDSL_CEP_DURATION_MIN : ruleDSL_CEP_DURATION_MIN EOF ;
+ public final void entryRuleDSL_CEP_DURATION_MIN() throws RecognitionException {
+ try {
+ // InternalSensinact.g:586:1: ( ruleDSL_CEP_DURATION_MIN EOF )
+ // InternalSensinact.g:587:1: ruleDSL_CEP_DURATION_MIN EOF
+ {
+ before(grammarAccess.getDSL_CEP_DURATION_MINRule());
+ pushFollow(FOLLOW_1);
+ ruleDSL_CEP_DURATION_MIN();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_CEP_DURATION_MINRule());
+ match(input,EOF,FOLLOW_2);
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+ }
+ return ;
+ }
+ // $ANTLR end "entryRuleDSL_CEP_DURATION_MIN"
+
+
+ // $ANTLR start "ruleDSL_CEP_DURATION_MIN"
+ // InternalSensinact.g:594:1: ruleDSL_CEP_DURATION_MIN : ( ( rule__DSL_CEP_DURATION_MIN__Group__0 ) ) ;
+ public final void ruleDSL_CEP_DURATION_MIN() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:598:2: ( ( ( rule__DSL_CEP_DURATION_MIN__Group__0 ) ) )
+ // InternalSensinact.g:599:2: ( ( rule__DSL_CEP_DURATION_MIN__Group__0 ) )
+ {
+ // InternalSensinact.g:599:2: ( ( rule__DSL_CEP_DURATION_MIN__Group__0 ) )
+ // InternalSensinact.g:600:3: ( rule__DSL_CEP_DURATION_MIN__Group__0 )
+ {
+ before(grammarAccess.getDSL_CEP_DURATION_MINAccess().getGroup());
+ // InternalSensinact.g:601:3: ( rule__DSL_CEP_DURATION_MIN__Group__0 )
+ // InternalSensinact.g:601:4: rule__DSL_CEP_DURATION_MIN__Group__0
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_DURATION_MIN__Group__0();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_CEP_DURATION_MINAccess().getGroup());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "ruleDSL_CEP_DURATION_MIN"
+
+
+ // $ANTLR start "entryRuleDSL_CEP_DURATION_SEC"
+ // InternalSensinact.g:610:1: entryRuleDSL_CEP_DURATION_SEC : ruleDSL_CEP_DURATION_SEC EOF ;
+ public final void entryRuleDSL_CEP_DURATION_SEC() throws RecognitionException {
+ try {
+ // InternalSensinact.g:611:1: ( ruleDSL_CEP_DURATION_SEC EOF )
+ // InternalSensinact.g:612:1: ruleDSL_CEP_DURATION_SEC EOF
+ {
+ before(grammarAccess.getDSL_CEP_DURATION_SECRule());
+ pushFollow(FOLLOW_1);
+ ruleDSL_CEP_DURATION_SEC();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_CEP_DURATION_SECRule());
+ match(input,EOF,FOLLOW_2);
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+ }
+ return ;
+ }
+ // $ANTLR end "entryRuleDSL_CEP_DURATION_SEC"
+
+
+ // $ANTLR start "ruleDSL_CEP_DURATION_SEC"
+ // InternalSensinact.g:619:1: ruleDSL_CEP_DURATION_SEC : ( ( rule__DSL_CEP_DURATION_SEC__Group__0 ) ) ;
+ public final void ruleDSL_CEP_DURATION_SEC() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:623:2: ( ( ( rule__DSL_CEP_DURATION_SEC__Group__0 ) ) )
+ // InternalSensinact.g:624:2: ( ( rule__DSL_CEP_DURATION_SEC__Group__0 ) )
+ {
+ // InternalSensinact.g:624:2: ( ( rule__DSL_CEP_DURATION_SEC__Group__0 ) )
+ // InternalSensinact.g:625:3: ( rule__DSL_CEP_DURATION_SEC__Group__0 )
+ {
+ before(grammarAccess.getDSL_CEP_DURATION_SECAccess().getGroup());
+ // InternalSensinact.g:626:3: ( rule__DSL_CEP_DURATION_SEC__Group__0 )
+ // InternalSensinact.g:626:4: rule__DSL_CEP_DURATION_SEC__Group__0
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_DURATION_SEC__Group__0();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_CEP_DURATION_SECAccess().getGroup());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "ruleDSL_CEP_DURATION_SEC"
+
+
+ // $ANTLR start "entryRuleDSL_ListActions"
+ // InternalSensinact.g:635:1: entryRuleDSL_ListActions : ruleDSL_ListActions EOF ;
+ public final void entryRuleDSL_ListActions() throws RecognitionException {
+ try {
+ // InternalSensinact.g:636:1: ( ruleDSL_ListActions EOF )
+ // InternalSensinact.g:637:1: ruleDSL_ListActions EOF
+ {
+ before(grammarAccess.getDSL_ListActionsRule());
+ pushFollow(FOLLOW_1);
+ ruleDSL_ListActions();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_ListActionsRule());
+ match(input,EOF,FOLLOW_2);
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+ }
+ return ;
+ }
+ // $ANTLR end "entryRuleDSL_ListActions"
+
+
+ // $ANTLR start "ruleDSL_ListActions"
+ // InternalSensinact.g:644:1: ruleDSL_ListActions : ( ( rule__DSL_ListActions__Group__0 ) ) ;
+ public final void ruleDSL_ListActions() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:648:2: ( ( ( rule__DSL_ListActions__Group__0 ) ) )
+ // InternalSensinact.g:649:2: ( ( rule__DSL_ListActions__Group__0 ) )
+ {
+ // InternalSensinact.g:649:2: ( ( rule__DSL_ListActions__Group__0 ) )
+ // InternalSensinact.g:650:3: ( rule__DSL_ListActions__Group__0 )
+ {
+ before(grammarAccess.getDSL_ListActionsAccess().getGroup());
+ // InternalSensinact.g:651:3: ( rule__DSL_ListActions__Group__0 )
+ // InternalSensinact.g:651:4: rule__DSL_ListActions__Group__0
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_ListActions__Group__0();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_ListActionsAccess().getGroup());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "ruleDSL_ListActions"
+
+
+ // $ANTLR start "entryRuleDSL_ResourceAction"
+ // InternalSensinact.g:660:1: entryRuleDSL_ResourceAction : ruleDSL_ResourceAction EOF ;
+ public final void entryRuleDSL_ResourceAction() throws RecognitionException {
+ try {
+ // InternalSensinact.g:661:1: ( ruleDSL_ResourceAction EOF )
+ // InternalSensinact.g:662:1: ruleDSL_ResourceAction EOF
+ {
+ before(grammarAccess.getDSL_ResourceActionRule());
+ pushFollow(FOLLOW_1);
+ ruleDSL_ResourceAction();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_ResourceActionRule());
+ match(input,EOF,FOLLOW_2);
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+ }
+ return ;
+ }
+ // $ANTLR end "entryRuleDSL_ResourceAction"
+
+
+ // $ANTLR start "ruleDSL_ResourceAction"
+ // InternalSensinact.g:669:1: ruleDSL_ResourceAction : ( ( rule__DSL_ResourceAction__Group__0 ) ) ;
+ public final void ruleDSL_ResourceAction() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:673:2: ( ( ( rule__DSL_ResourceAction__Group__0 ) ) )
+ // InternalSensinact.g:674:2: ( ( rule__DSL_ResourceAction__Group__0 ) )
+ {
+ // InternalSensinact.g:674:2: ( ( rule__DSL_ResourceAction__Group__0 ) )
+ // InternalSensinact.g:675:3: ( rule__DSL_ResourceAction__Group__0 )
+ {
+ before(grammarAccess.getDSL_ResourceActionAccess().getGroup());
+ // InternalSensinact.g:676:3: ( rule__DSL_ResourceAction__Group__0 )
+ // InternalSensinact.g:676:4: rule__DSL_ResourceAction__Group__0
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_ResourceAction__Group__0();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_ResourceActionAccess().getGroup());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "ruleDSL_ResourceAction"
+
+
+ // $ANTLR start "entryRuleDSL_ListParam"
+ // InternalSensinact.g:685:1: entryRuleDSL_ListParam : ruleDSL_ListParam EOF ;
+ public final void entryRuleDSL_ListParam() throws RecognitionException {
+ try {
+ // InternalSensinact.g:686:1: ( ruleDSL_ListParam EOF )
+ // InternalSensinact.g:687:1: ruleDSL_ListParam EOF
+ {
+ before(grammarAccess.getDSL_ListParamRule());
+ pushFollow(FOLLOW_1);
+ ruleDSL_ListParam();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_ListParamRule());
+ match(input,EOF,FOLLOW_2);
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+ }
+ return ;
+ }
+ // $ANTLR end "entryRuleDSL_ListParam"
+
+
+ // $ANTLR start "ruleDSL_ListParam"
+ // InternalSensinact.g:694:1: ruleDSL_ListParam : ( ( rule__DSL_ListParam__Group__0 ) ) ;
+ public final void ruleDSL_ListParam() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:698:2: ( ( ( rule__DSL_ListParam__Group__0 ) ) )
+ // InternalSensinact.g:699:2: ( ( rule__DSL_ListParam__Group__0 ) )
+ {
+ // InternalSensinact.g:699:2: ( ( rule__DSL_ListParam__Group__0 ) )
+ // InternalSensinact.g:700:3: ( rule__DSL_ListParam__Group__0 )
+ {
+ before(grammarAccess.getDSL_ListParamAccess().getGroup());
+ // InternalSensinact.g:701:3: ( rule__DSL_ListParam__Group__0 )
+ // InternalSensinact.g:701:4: rule__DSL_ListParam__Group__0
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_ListParam__Group__0();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_ListParamAccess().getGroup());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "ruleDSL_ListParam"
+
+
+ // $ANTLR start "entryRuleDSL_Expression_Or"
+ // InternalSensinact.g:710:1: entryRuleDSL_Expression_Or : ruleDSL_Expression_Or EOF ;
+ public final void entryRuleDSL_Expression_Or() throws RecognitionException {
+ try {
+ // InternalSensinact.g:711:1: ( ruleDSL_Expression_Or EOF )
+ // InternalSensinact.g:712:1: ruleDSL_Expression_Or EOF
+ {
+ before(grammarAccess.getDSL_Expression_OrRule());
+ pushFollow(FOLLOW_1);
+ ruleDSL_Expression_Or();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_Expression_OrRule());
+ match(input,EOF,FOLLOW_2);
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+ }
+ return ;
+ }
+ // $ANTLR end "entryRuleDSL_Expression_Or"
+
+
+ // $ANTLR start "ruleDSL_Expression_Or"
+ // InternalSensinact.g:719:1: ruleDSL_Expression_Or : ( ( rule__DSL_Expression_Or__Group__0 ) ) ;
+ public final void ruleDSL_Expression_Or() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:723:2: ( ( ( rule__DSL_Expression_Or__Group__0 ) ) )
+ // InternalSensinact.g:724:2: ( ( rule__DSL_Expression_Or__Group__0 ) )
+ {
+ // InternalSensinact.g:724:2: ( ( rule__DSL_Expression_Or__Group__0 ) )
+ // InternalSensinact.g:725:3: ( rule__DSL_Expression_Or__Group__0 )
+ {
+ before(grammarAccess.getDSL_Expression_OrAccess().getGroup());
+ // InternalSensinact.g:726:3: ( rule__DSL_Expression_Or__Group__0 )
+ // InternalSensinact.g:726:4: rule__DSL_Expression_Or__Group__0
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_Or__Group__0();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_Expression_OrAccess().getGroup());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "ruleDSL_Expression_Or"
+
+
+ // $ANTLR start "entryRuleDSL_Expression_And"
+ // InternalSensinact.g:735:1: entryRuleDSL_Expression_And : ruleDSL_Expression_And EOF ;
+ public final void entryRuleDSL_Expression_And() throws RecognitionException {
+ try {
+ // InternalSensinact.g:736:1: ( ruleDSL_Expression_And EOF )
+ // InternalSensinact.g:737:1: ruleDSL_Expression_And EOF
+ {
+ before(grammarAccess.getDSL_Expression_AndRule());
+ pushFollow(FOLLOW_1);
+ ruleDSL_Expression_And();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_Expression_AndRule());
+ match(input,EOF,FOLLOW_2);
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+ }
+ return ;
+ }
+ // $ANTLR end "entryRuleDSL_Expression_And"
+
+
+ // $ANTLR start "ruleDSL_Expression_And"
+ // InternalSensinact.g:744:1: ruleDSL_Expression_And : ( ( rule__DSL_Expression_And__Group__0 ) ) ;
+ public final void ruleDSL_Expression_And() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:748:2: ( ( ( rule__DSL_Expression_And__Group__0 ) ) )
+ // InternalSensinact.g:749:2: ( ( rule__DSL_Expression_And__Group__0 ) )
+ {
+ // InternalSensinact.g:749:2: ( ( rule__DSL_Expression_And__Group__0 ) )
+ // InternalSensinact.g:750:3: ( rule__DSL_Expression_And__Group__0 )
+ {
+ before(grammarAccess.getDSL_Expression_AndAccess().getGroup());
+ // InternalSensinact.g:751:3: ( rule__DSL_Expression_And__Group__0 )
+ // InternalSensinact.g:751:4: rule__DSL_Expression_And__Group__0
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_And__Group__0();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_Expression_AndAccess().getGroup());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "ruleDSL_Expression_And"
+
+
+ // $ANTLR start "entryRuleDSL_Expression_DiffEqual"
+ // InternalSensinact.g:760:1: entryRuleDSL_Expression_DiffEqual : ruleDSL_Expression_DiffEqual EOF ;
+ public final void entryRuleDSL_Expression_DiffEqual() throws RecognitionException {
+ try {
+ // InternalSensinact.g:761:1: ( ruleDSL_Expression_DiffEqual EOF )
+ // InternalSensinact.g:762:1: ruleDSL_Expression_DiffEqual EOF
+ {
+ before(grammarAccess.getDSL_Expression_DiffEqualRule());
+ pushFollow(FOLLOW_1);
+ ruleDSL_Expression_DiffEqual();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_Expression_DiffEqualRule());
+ match(input,EOF,FOLLOW_2);
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+ }
+ return ;
+ }
+ // $ANTLR end "entryRuleDSL_Expression_DiffEqual"
+
+
+ // $ANTLR start "ruleDSL_Expression_DiffEqual"
+ // InternalSensinact.g:769:1: ruleDSL_Expression_DiffEqual : ( ( rule__DSL_Expression_DiffEqual__Group__0 ) ) ;
+ public final void ruleDSL_Expression_DiffEqual() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:773:2: ( ( ( rule__DSL_Expression_DiffEqual__Group__0 ) ) )
+ // InternalSensinact.g:774:2: ( ( rule__DSL_Expression_DiffEqual__Group__0 ) )
+ {
+ // InternalSensinact.g:774:2: ( ( rule__DSL_Expression_DiffEqual__Group__0 ) )
+ // InternalSensinact.g:775:3: ( rule__DSL_Expression_DiffEqual__Group__0 )
+ {
+ before(grammarAccess.getDSL_Expression_DiffEqualAccess().getGroup());
+ // InternalSensinact.g:776:3: ( rule__DSL_Expression_DiffEqual__Group__0 )
+ // InternalSensinact.g:776:4: rule__DSL_Expression_DiffEqual__Group__0
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_DiffEqual__Group__0();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_Expression_DiffEqualAccess().getGroup());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "ruleDSL_Expression_DiffEqual"
+
+
+ // $ANTLR start "entryRuleDSL_Expression_Compare"
+ // InternalSensinact.g:785:1: entryRuleDSL_Expression_Compare : ruleDSL_Expression_Compare EOF ;
+ public final void entryRuleDSL_Expression_Compare() throws RecognitionException {
+ try {
+ // InternalSensinact.g:786:1: ( ruleDSL_Expression_Compare EOF )
+ // InternalSensinact.g:787:1: ruleDSL_Expression_Compare EOF
+ {
+ before(grammarAccess.getDSL_Expression_CompareRule());
+ pushFollow(FOLLOW_1);
+ ruleDSL_Expression_Compare();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_Expression_CompareRule());
+ match(input,EOF,FOLLOW_2);
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+ }
+ return ;
+ }
+ // $ANTLR end "entryRuleDSL_Expression_Compare"
+
+
+ // $ANTLR start "ruleDSL_Expression_Compare"
+ // InternalSensinact.g:794:1: ruleDSL_Expression_Compare : ( ( rule__DSL_Expression_Compare__Group__0 ) ) ;
+ public final void ruleDSL_Expression_Compare() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:798:2: ( ( ( rule__DSL_Expression_Compare__Group__0 ) ) )
+ // InternalSensinact.g:799:2: ( ( rule__DSL_Expression_Compare__Group__0 ) )
+ {
+ // InternalSensinact.g:799:2: ( ( rule__DSL_Expression_Compare__Group__0 ) )
+ // InternalSensinact.g:800:3: ( rule__DSL_Expression_Compare__Group__0 )
+ {
+ before(grammarAccess.getDSL_Expression_CompareAccess().getGroup());
+ // InternalSensinact.g:801:3: ( rule__DSL_Expression_Compare__Group__0 )
+ // InternalSensinact.g:801:4: rule__DSL_Expression_Compare__Group__0
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_Compare__Group__0();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_Expression_CompareAccess().getGroup());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "ruleDSL_Expression_Compare"
+
+
+ // $ANTLR start "entryRuleDSL_Expression_PlusMinus"
+ // InternalSensinact.g:810:1: entryRuleDSL_Expression_PlusMinus : ruleDSL_Expression_PlusMinus EOF ;
+ public final void entryRuleDSL_Expression_PlusMinus() throws RecognitionException {
+ try {
+ // InternalSensinact.g:811:1: ( ruleDSL_Expression_PlusMinus EOF )
+ // InternalSensinact.g:812:1: ruleDSL_Expression_PlusMinus EOF
+ {
+ before(grammarAccess.getDSL_Expression_PlusMinusRule());
+ pushFollow(FOLLOW_1);
+ ruleDSL_Expression_PlusMinus();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_Expression_PlusMinusRule());
+ match(input,EOF,FOLLOW_2);
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+ }
+ return ;
+ }
+ // $ANTLR end "entryRuleDSL_Expression_PlusMinus"
+
+
+ // $ANTLR start "ruleDSL_Expression_PlusMinus"
+ // InternalSensinact.g:819:1: ruleDSL_Expression_PlusMinus : ( ( rule__DSL_Expression_PlusMinus__Group__0 ) ) ;
+ public final void ruleDSL_Expression_PlusMinus() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:823:2: ( ( ( rule__DSL_Expression_PlusMinus__Group__0 ) ) )
+ // InternalSensinact.g:824:2: ( ( rule__DSL_Expression_PlusMinus__Group__0 ) )
+ {
+ // InternalSensinact.g:824:2: ( ( rule__DSL_Expression_PlusMinus__Group__0 ) )
+ // InternalSensinact.g:825:3: ( rule__DSL_Expression_PlusMinus__Group__0 )
+ {
+ before(grammarAccess.getDSL_Expression_PlusMinusAccess().getGroup());
+ // InternalSensinact.g:826:3: ( rule__DSL_Expression_PlusMinus__Group__0 )
+ // InternalSensinact.g:826:4: rule__DSL_Expression_PlusMinus__Group__0
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_PlusMinus__Group__0();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_Expression_PlusMinusAccess().getGroup());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "ruleDSL_Expression_PlusMinus"
+
+
+ // $ANTLR start "entryRuleDSL_Expression_MultiplicationDivision"
+ // InternalSensinact.g:835:1: entryRuleDSL_Expression_MultiplicationDivision : ruleDSL_Expression_MultiplicationDivision EOF ;
+ public final void entryRuleDSL_Expression_MultiplicationDivision() throws RecognitionException {
+ try {
+ // InternalSensinact.g:836:1: ( ruleDSL_Expression_MultiplicationDivision EOF )
+ // InternalSensinact.g:837:1: ruleDSL_Expression_MultiplicationDivision EOF
+ {
+ before(grammarAccess.getDSL_Expression_MultiplicationDivisionRule());
+ pushFollow(FOLLOW_1);
+ ruleDSL_Expression_MultiplicationDivision();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_Expression_MultiplicationDivisionRule());
+ match(input,EOF,FOLLOW_2);
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+ }
+ return ;
+ }
+ // $ANTLR end "entryRuleDSL_Expression_MultiplicationDivision"
+
+
+ // $ANTLR start "ruleDSL_Expression_MultiplicationDivision"
+ // InternalSensinact.g:844:1: ruleDSL_Expression_MultiplicationDivision : ( ( rule__DSL_Expression_MultiplicationDivision__Group__0 ) ) ;
+ public final void ruleDSL_Expression_MultiplicationDivision() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:848:2: ( ( ( rule__DSL_Expression_MultiplicationDivision__Group__0 ) ) )
+ // InternalSensinact.g:849:2: ( ( rule__DSL_Expression_MultiplicationDivision__Group__0 ) )
+ {
+ // InternalSensinact.g:849:2: ( ( rule__DSL_Expression_MultiplicationDivision__Group__0 ) )
+ // InternalSensinact.g:850:3: ( rule__DSL_Expression_MultiplicationDivision__Group__0 )
+ {
+ before(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getGroup());
+ // InternalSensinact.g:851:3: ( rule__DSL_Expression_MultiplicationDivision__Group__0 )
+ // InternalSensinact.g:851:4: rule__DSL_Expression_MultiplicationDivision__Group__0
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_MultiplicationDivision__Group__0();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getGroup());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "ruleDSL_Expression_MultiplicationDivision"
+
+
+ // $ANTLR start "entryRuleDSL_Expression_Unary"
+ // InternalSensinact.g:860:1: entryRuleDSL_Expression_Unary : ruleDSL_Expression_Unary EOF ;
+ public final void entryRuleDSL_Expression_Unary() throws RecognitionException {
+ try {
+ // InternalSensinact.g:861:1: ( ruleDSL_Expression_Unary EOF )
+ // InternalSensinact.g:862:1: ruleDSL_Expression_Unary EOF
+ {
+ before(grammarAccess.getDSL_Expression_UnaryRule());
+ pushFollow(FOLLOW_1);
+ ruleDSL_Expression_Unary();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_Expression_UnaryRule());
+ match(input,EOF,FOLLOW_2);
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+ }
+ return ;
+ }
+ // $ANTLR end "entryRuleDSL_Expression_Unary"
+
+
+ // $ANTLR start "ruleDSL_Expression_Unary"
+ // InternalSensinact.g:869:1: ruleDSL_Expression_Unary : ( ( rule__DSL_Expression_Unary__Alternatives ) ) ;
+ public final void ruleDSL_Expression_Unary() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:873:2: ( ( ( rule__DSL_Expression_Unary__Alternatives ) ) )
+ // InternalSensinact.g:874:2: ( ( rule__DSL_Expression_Unary__Alternatives ) )
+ {
+ // InternalSensinact.g:874:2: ( ( rule__DSL_Expression_Unary__Alternatives ) )
+ // InternalSensinact.g:875:3: ( rule__DSL_Expression_Unary__Alternatives )
+ {
+ before(grammarAccess.getDSL_Expression_UnaryAccess().getAlternatives());
+ // InternalSensinact.g:876:3: ( rule__DSL_Expression_Unary__Alternatives )
+ // InternalSensinact.g:876:4: rule__DSL_Expression_Unary__Alternatives
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_Unary__Alternatives();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_Expression_UnaryAccess().getAlternatives());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "ruleDSL_Expression_Unary"
+
+
+ // $ANTLR start "rule__NUMBER__Alternatives"
+ // InternalSensinact.g:884:1: rule__NUMBER__Alternatives : ( ( RULE_INT ) | ( ( rule__NUMBER__Group_1__0 ) ) );
+ public final void rule__NUMBER__Alternatives() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:888:1: ( ( RULE_INT ) | ( ( rule__NUMBER__Group_1__0 ) ) )
+ int alt2=2;
+ int LA2_0 = input.LA(1);
+
+ if ( (LA2_0==RULE_INT) ) {
+ int LA2_1 = input.LA(2);
+
+ if ( (LA2_1==EOF||LA2_1==17||LA2_1==20||LA2_1==23||LA2_1==29||LA2_1==34||(LA2_1>=39 && LA2_1<=51)) ) {
+ alt2=1;
+ }
+ else if ( (LA2_1==26) ) {
+ alt2=2;
+ }
+ else {
+ NoViableAltException nvae =
+ new NoViableAltException("", 2, 1, input);
+
+ throw nvae;
+ }
+ }
+ else {
+ NoViableAltException nvae =
+ new NoViableAltException("", 2, 0, input);
+
+ throw nvae;
+ }
+ switch (alt2) {
+ case 1 :
+ // InternalSensinact.g:889:2: ( RULE_INT )
+ {
+ // InternalSensinact.g:889:2: ( RULE_INT )
+ // InternalSensinact.g:890:3: RULE_INT
+ {
+ before(grammarAccess.getNUMBERAccess().getINTTerminalRuleCall_0());
+ match(input,RULE_INT,FOLLOW_2);
+ after(grammarAccess.getNUMBERAccess().getINTTerminalRuleCall_0());
+
+ }
+
+
+ }
+ break;
+ case 2 :
+ // InternalSensinact.g:895:2: ( ( rule__NUMBER__Group_1__0 ) )
+ {
+ // InternalSensinact.g:895:2: ( ( rule__NUMBER__Group_1__0 ) )
+ // InternalSensinact.g:896:3: ( rule__NUMBER__Group_1__0 )
+ {
+ before(grammarAccess.getNUMBERAccess().getGroup_1());
+ // InternalSensinact.g:897:3: ( rule__NUMBER__Group_1__0 )
+ // InternalSensinact.g:897:4: rule__NUMBER__Group_1__0
+ {
+ pushFollow(FOLLOW_2);
+ rule__NUMBER__Group_1__0();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getNUMBERAccess().getGroup_1());
+
+ }
+
+
+ }
+ break;
+
+ }
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__NUMBER__Alternatives"
+
+
+ // $ANTLR start "rule__DSL_CEP_STATEMENT__OperationAlternatives_3_0"
+ // InternalSensinact.g:905:1: rule__DSL_CEP_STATEMENT__OperationAlternatives_3_0 : ( ( ruleDSL_CEP_AFTER ) | ( ruleDSL_CEP_BEFORE ) | ( ruleDSL_CEP_COINCIDE ) | ( ruleDSL_CEP_MIN ) | ( ruleDSL_CEP_MAX ) | ( ruleDSL_CEP_AVG ) | ( ruleDSL_CEP_SUM ) | ( ruleDSL_CEP_COUNT ) );
+ public final void rule__DSL_CEP_STATEMENT__OperationAlternatives_3_0() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:909:1: ( ( ruleDSL_CEP_AFTER ) | ( ruleDSL_CEP_BEFORE ) | ( ruleDSL_CEP_COINCIDE ) | ( ruleDSL_CEP_MIN ) | ( ruleDSL_CEP_MAX ) | ( ruleDSL_CEP_AVG ) | ( ruleDSL_CEP_SUM ) | ( ruleDSL_CEP_COUNT ) )
+ int alt3=8;
+ switch ( input.LA(1) ) {
+ case 31:
+ {
+ alt3=1;
+ }
+ break;
+ case 32:
+ {
+ alt3=2;
+ }
+ break;
+ case 33:
+ {
+ alt3=3;
+ }
+ break;
+ case 34:
+ {
+ alt3=4;
+ }
+ break;
+ case 35:
+ {
+ alt3=5;
+ }
+ break;
+ case 36:
+ {
+ alt3=6;
+ }
+ break;
+ case 37:
+ {
+ alt3=7;
+ }
+ break;
+ case 38:
+ {
+ alt3=8;
+ }
+ break;
+ default:
+ NoViableAltException nvae =
+ new NoViableAltException("", 3, 0, input);
+
+ throw nvae;
+ }
+
+ switch (alt3) {
+ case 1 :
+ // InternalSensinact.g:910:2: ( ruleDSL_CEP_AFTER )
+ {
+ // InternalSensinact.g:910:2: ( ruleDSL_CEP_AFTER )
+ // InternalSensinact.g:911:3: ruleDSL_CEP_AFTER
+ {
+ before(grammarAccess.getDSL_CEP_STATEMENTAccess().getOperationDSL_CEP_AFTERParserRuleCall_3_0_0());
+ pushFollow(FOLLOW_2);
+ ruleDSL_CEP_AFTER();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_CEP_STATEMENTAccess().getOperationDSL_CEP_AFTERParserRuleCall_3_0_0());
+
+ }
+
+
+ }
+ break;
+ case 2 :
+ // InternalSensinact.g:916:2: ( ruleDSL_CEP_BEFORE )
+ {
+ // InternalSensinact.g:916:2: ( ruleDSL_CEP_BEFORE )
+ // InternalSensinact.g:917:3: ruleDSL_CEP_BEFORE
+ {
+ before(grammarAccess.getDSL_CEP_STATEMENTAccess().getOperationDSL_CEP_BEFOREParserRuleCall_3_0_1());
+ pushFollow(FOLLOW_2);
+ ruleDSL_CEP_BEFORE();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_CEP_STATEMENTAccess().getOperationDSL_CEP_BEFOREParserRuleCall_3_0_1());
+
+ }
+
+
+ }
+ break;
+ case 3 :
+ // InternalSensinact.g:922:2: ( ruleDSL_CEP_COINCIDE )
+ {
+ // InternalSensinact.g:922:2: ( ruleDSL_CEP_COINCIDE )
+ // InternalSensinact.g:923:3: ruleDSL_CEP_COINCIDE
+ {
+ before(grammarAccess.getDSL_CEP_STATEMENTAccess().getOperationDSL_CEP_COINCIDEParserRuleCall_3_0_2());
+ pushFollow(FOLLOW_2);
+ ruleDSL_CEP_COINCIDE();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_CEP_STATEMENTAccess().getOperationDSL_CEP_COINCIDEParserRuleCall_3_0_2());
+
+ }
+
+
+ }
+ break;
+ case 4 :
+ // InternalSensinact.g:928:2: ( ruleDSL_CEP_MIN )
+ {
+ // InternalSensinact.g:928:2: ( ruleDSL_CEP_MIN )
+ // InternalSensinact.g:929:3: ruleDSL_CEP_MIN
+ {
+ before(grammarAccess.getDSL_CEP_STATEMENTAccess().getOperationDSL_CEP_MINParserRuleCall_3_0_3());
+ pushFollow(FOLLOW_2);
+ ruleDSL_CEP_MIN();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_CEP_STATEMENTAccess().getOperationDSL_CEP_MINParserRuleCall_3_0_3());
+
+ }
+
+
+ }
+ break;
+ case 5 :
+ // InternalSensinact.g:934:2: ( ruleDSL_CEP_MAX )
+ {
+ // InternalSensinact.g:934:2: ( ruleDSL_CEP_MAX )
+ // InternalSensinact.g:935:3: ruleDSL_CEP_MAX
+ {
+ before(grammarAccess.getDSL_CEP_STATEMENTAccess().getOperationDSL_CEP_MAXParserRuleCall_3_0_4());
+ pushFollow(FOLLOW_2);
+ ruleDSL_CEP_MAX();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_CEP_STATEMENTAccess().getOperationDSL_CEP_MAXParserRuleCall_3_0_4());
+
+ }
+
+
+ }
+ break;
+ case 6 :
+ // InternalSensinact.g:940:2: ( ruleDSL_CEP_AVG )
+ {
+ // InternalSensinact.g:940:2: ( ruleDSL_CEP_AVG )
+ // InternalSensinact.g:941:3: ruleDSL_CEP_AVG
+ {
+ before(grammarAccess.getDSL_CEP_STATEMENTAccess().getOperationDSL_CEP_AVGParserRuleCall_3_0_5());
+ pushFollow(FOLLOW_2);
+ ruleDSL_CEP_AVG();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_CEP_STATEMENTAccess().getOperationDSL_CEP_AVGParserRuleCall_3_0_5());
+
+ }
+
+
+ }
+ break;
+ case 7 :
+ // InternalSensinact.g:946:2: ( ruleDSL_CEP_SUM )
+ {
+ // InternalSensinact.g:946:2: ( ruleDSL_CEP_SUM )
+ // InternalSensinact.g:947:3: ruleDSL_CEP_SUM
+ {
+ before(grammarAccess.getDSL_CEP_STATEMENTAccess().getOperationDSL_CEP_SUMParserRuleCall_3_0_6());
+ pushFollow(FOLLOW_2);
+ ruleDSL_CEP_SUM();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_CEP_STATEMENTAccess().getOperationDSL_CEP_SUMParserRuleCall_3_0_6());
+
+ }
+
+
+ }
+ break;
+ case 8 :
+ // InternalSensinact.g:952:2: ( ruleDSL_CEP_COUNT )
+ {
+ // InternalSensinact.g:952:2: ( ruleDSL_CEP_COUNT )
+ // InternalSensinact.g:953:3: ruleDSL_CEP_COUNT
+ {
+ before(grammarAccess.getDSL_CEP_STATEMENTAccess().getOperationDSL_CEP_COUNTParserRuleCall_3_0_7());
+ pushFollow(FOLLOW_2);
+ ruleDSL_CEP_COUNT();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_CEP_STATEMENTAccess().getOperationDSL_CEP_COUNTParserRuleCall_3_0_7());
+
+ }
+
+
+ }
+ break;
+
+ }
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_STATEMENT__OperationAlternatives_3_0"
+
+
+ // $ANTLR start "rule__DSL_CEP_DURATION__UnitsAlternatives_0"
+ // InternalSensinact.g:962:1: rule__DSL_CEP_DURATION__UnitsAlternatives_0 : ( ( ruleDSL_CEP_DURATION_MIN ) | ( ruleDSL_CEP_DURATION_SEC ) );
+ public final void rule__DSL_CEP_DURATION__UnitsAlternatives_0() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:966:1: ( ( ruleDSL_CEP_DURATION_MIN ) | ( ruleDSL_CEP_DURATION_SEC ) )
+ int alt4=2;
+ int LA4_0 = input.LA(1);
+
+ if ( (LA4_0==RULE_INT) ) {
+ switch ( input.LA(2) ) {
+ case 26:
+ {
+ int LA4_2 = input.LA(3);
+
+ if ( (LA4_2==RULE_INT) ) {
+ int LA4_5 = input.LA(4);
+
+ if ( (LA4_5==39) ) {
+ alt4=2;
+ }
+ else if ( (LA4_5==34) ) {
+ alt4=1;
+ }
+ else {
+ NoViableAltException nvae =
+ new NoViableAltException("", 4, 5, input);
+
+ throw nvae;
+ }
+ }
+ else {
+ NoViableAltException nvae =
+ new NoViableAltException("", 4, 2, input);
+
+ throw nvae;
+ }
+ }
+ break;
+ case 39:
+ {
+ alt4=2;
+ }
+ break;
+ case 34:
+ {
+ alt4=1;
+ }
+ break;
+ default:
+ NoViableAltException nvae =
+ new NoViableAltException("", 4, 1, input);
+
+ throw nvae;
+ }
+
+ }
+ else {
+ NoViableAltException nvae =
+ new NoViableAltException("", 4, 0, input);
+
+ throw nvae;
+ }
+ switch (alt4) {
+ case 1 :
+ // InternalSensinact.g:967:2: ( ruleDSL_CEP_DURATION_MIN )
+ {
+ // InternalSensinact.g:967:2: ( ruleDSL_CEP_DURATION_MIN )
+ // InternalSensinact.g:968:3: ruleDSL_CEP_DURATION_MIN
+ {
+ before(grammarAccess.getDSL_CEP_DURATIONAccess().getUnitsDSL_CEP_DURATION_MINParserRuleCall_0_0());
+ pushFollow(FOLLOW_2);
+ ruleDSL_CEP_DURATION_MIN();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_CEP_DURATIONAccess().getUnitsDSL_CEP_DURATION_MINParserRuleCall_0_0());
+
+ }
+
+
+ }
+ break;
+ case 2 :
+ // InternalSensinact.g:973:2: ( ruleDSL_CEP_DURATION_SEC )
+ {
+ // InternalSensinact.g:973:2: ( ruleDSL_CEP_DURATION_SEC )
+ // InternalSensinact.g:974:3: ruleDSL_CEP_DURATION_SEC
+ {
+ before(grammarAccess.getDSL_CEP_DURATIONAccess().getUnitsDSL_CEP_DURATION_SECParserRuleCall_0_1());
+ pushFollow(FOLLOW_2);
+ ruleDSL_CEP_DURATION_SEC();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_CEP_DURATIONAccess().getUnitsDSL_CEP_DURATION_SECParserRuleCall_0_1());
+
+ }
+
+
+ }
+ break;
+
+ }
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_DURATION__UnitsAlternatives_0"
+
+
+ // $ANTLR start "rule__DSL_ResourceAction__ActiontypeAlternatives_3_0"
+ // InternalSensinact.g:983:1: rule__DSL_ResourceAction__ActiontypeAlternatives_3_0 : ( ( 'act' ) | ( 'set' ) );
+ public final void rule__DSL_ResourceAction__ActiontypeAlternatives_3_0() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:987:1: ( ( 'act' ) | ( 'set' ) )
+ int alt5=2;
+ int LA5_0 = input.LA(1);
+
+ if ( (LA5_0==12) ) {
+ alt5=1;
+ }
+ else if ( (LA5_0==13) ) {
+ alt5=2;
+ }
+ else {
+ NoViableAltException nvae =
+ new NoViableAltException("", 5, 0, input);
+
+ throw nvae;
+ }
+ switch (alt5) {
+ case 1 :
+ // InternalSensinact.g:988:2: ( 'act' )
+ {
+ // InternalSensinact.g:988:2: ( 'act' )
+ // InternalSensinact.g:989:3: 'act'
+ {
+ before(grammarAccess.getDSL_ResourceActionAccess().getActiontypeActKeyword_3_0_0());
+ match(input,12,FOLLOW_2);
+ after(grammarAccess.getDSL_ResourceActionAccess().getActiontypeActKeyword_3_0_0());
+
+ }
+
+
+ }
+ break;
+ case 2 :
+ // InternalSensinact.g:994:2: ( 'set' )
+ {
+ // InternalSensinact.g:994:2: ( 'set' )
+ // InternalSensinact.g:995:3: 'set'
+ {
+ before(grammarAccess.getDSL_ResourceActionAccess().getActiontypeSetKeyword_3_0_1());
+ match(input,13,FOLLOW_2);
+ after(grammarAccess.getDSL_ResourceActionAccess().getActiontypeSetKeyword_3_0_1());
+
+ }
+
+
+ }
+ break;
+
+ }
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_ResourceAction__ActiontypeAlternatives_3_0"
+
+
+ // $ANTLR start "rule__DSL_Expression_DiffEqual__Alternatives_1"
+ // InternalSensinact.g:1004:1: rule__DSL_Expression_DiffEqual__Alternatives_1 : ( ( ( rule__DSL_Expression_DiffEqual__Group_1_0__0 ) ) | ( ( rule__DSL_Expression_DiffEqual__Group_1_1__0 ) ) );
+ public final void rule__DSL_Expression_DiffEqual__Alternatives_1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:1008:1: ( ( ( rule__DSL_Expression_DiffEqual__Group_1_0__0 ) ) | ( ( rule__DSL_Expression_DiffEqual__Group_1_1__0 ) ) )
+ int alt6=2;
+ int LA6_0 = input.LA(1);
+
+ if ( (LA6_0==42) ) {
+ alt6=1;
+ }
+ else if ( (LA6_0==43) ) {
+ alt6=2;
+ }
+ else {
+ NoViableAltException nvae =
+ new NoViableAltException("", 6, 0, input);
+
+ throw nvae;
+ }
+ switch (alt6) {
+ case 1 :
+ // InternalSensinact.g:1009:2: ( ( rule__DSL_Expression_DiffEqual__Group_1_0__0 ) )
+ {
+ // InternalSensinact.g:1009:2: ( ( rule__DSL_Expression_DiffEqual__Group_1_0__0 ) )
+ // InternalSensinact.g:1010:3: ( rule__DSL_Expression_DiffEqual__Group_1_0__0 )
+ {
+ before(grammarAccess.getDSL_Expression_DiffEqualAccess().getGroup_1_0());
+ // InternalSensinact.g:1011:3: ( rule__DSL_Expression_DiffEqual__Group_1_0__0 )
+ // InternalSensinact.g:1011:4: rule__DSL_Expression_DiffEqual__Group_1_0__0
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_DiffEqual__Group_1_0__0();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_Expression_DiffEqualAccess().getGroup_1_0());
+
+ }
+
+
+ }
+ break;
+ case 2 :
+ // InternalSensinact.g:1015:2: ( ( rule__DSL_Expression_DiffEqual__Group_1_1__0 ) )
+ {
+ // InternalSensinact.g:1015:2: ( ( rule__DSL_Expression_DiffEqual__Group_1_1__0 ) )
+ // InternalSensinact.g:1016:3: ( rule__DSL_Expression_DiffEqual__Group_1_1__0 )
+ {
+ before(grammarAccess.getDSL_Expression_DiffEqualAccess().getGroup_1_1());
+ // InternalSensinact.g:1017:3: ( rule__DSL_Expression_DiffEqual__Group_1_1__0 )
+ // InternalSensinact.g:1017:4: rule__DSL_Expression_DiffEqual__Group_1_1__0
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_DiffEqual__Group_1_1__0();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_Expression_DiffEqualAccess().getGroup_1_1());
+
+ }
+
+
+ }
+ break;
+
+ }
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_DiffEqual__Alternatives_1"
+
+
+ // $ANTLR start "rule__DSL_Expression_Compare__Alternatives_1"
+ // InternalSensinact.g:1025:1: rule__DSL_Expression_Compare__Alternatives_1 : ( ( ( rule__DSL_Expression_Compare__Group_1_0__0 ) ) | ( ( rule__DSL_Expression_Compare__Group_1_1__0 ) ) | ( ( rule__DSL_Expression_Compare__Group_1_2__0 ) ) | ( ( rule__DSL_Expression_Compare__Group_1_3__0 ) ) );
+ public final void rule__DSL_Expression_Compare__Alternatives_1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:1029:1: ( ( ( rule__DSL_Expression_Compare__Group_1_0__0 ) ) | ( ( rule__DSL_Expression_Compare__Group_1_1__0 ) ) | ( ( rule__DSL_Expression_Compare__Group_1_2__0 ) ) | ( ( rule__DSL_Expression_Compare__Group_1_3__0 ) ) )
+ int alt7=4;
+ switch ( input.LA(1) ) {
+ case 44:
+ {
+ alt7=1;
+ }
+ break;
+ case 45:
+ {
+ alt7=2;
+ }
+ break;
+ case 46:
+ {
+ alt7=3;
+ }
+ break;
+ case 47:
+ {
+ alt7=4;
+ }
+ break;
+ default:
+ NoViableAltException nvae =
+ new NoViableAltException("", 7, 0, input);
+
+ throw nvae;
+ }
+
+ switch (alt7) {
+ case 1 :
+ // InternalSensinact.g:1030:2: ( ( rule__DSL_Expression_Compare__Group_1_0__0 ) )
+ {
+ // InternalSensinact.g:1030:2: ( ( rule__DSL_Expression_Compare__Group_1_0__0 ) )
+ // InternalSensinact.g:1031:3: ( rule__DSL_Expression_Compare__Group_1_0__0 )
+ {
+ before(grammarAccess.getDSL_Expression_CompareAccess().getGroup_1_0());
+ // InternalSensinact.g:1032:3: ( rule__DSL_Expression_Compare__Group_1_0__0 )
+ // InternalSensinact.g:1032:4: rule__DSL_Expression_Compare__Group_1_0__0
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_Compare__Group_1_0__0();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_Expression_CompareAccess().getGroup_1_0());
+
+ }
+
+
+ }
+ break;
+ case 2 :
+ // InternalSensinact.g:1036:2: ( ( rule__DSL_Expression_Compare__Group_1_1__0 ) )
+ {
+ // InternalSensinact.g:1036:2: ( ( rule__DSL_Expression_Compare__Group_1_1__0 ) )
+ // InternalSensinact.g:1037:3: ( rule__DSL_Expression_Compare__Group_1_1__0 )
+ {
+ before(grammarAccess.getDSL_Expression_CompareAccess().getGroup_1_1());
+ // InternalSensinact.g:1038:3: ( rule__DSL_Expression_Compare__Group_1_1__0 )
+ // InternalSensinact.g:1038:4: rule__DSL_Expression_Compare__Group_1_1__0
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_Compare__Group_1_1__0();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_Expression_CompareAccess().getGroup_1_1());
+
+ }
+
+
+ }
+ break;
+ case 3 :
+ // InternalSensinact.g:1042:2: ( ( rule__DSL_Expression_Compare__Group_1_2__0 ) )
+ {
+ // InternalSensinact.g:1042:2: ( ( rule__DSL_Expression_Compare__Group_1_2__0 ) )
+ // InternalSensinact.g:1043:3: ( rule__DSL_Expression_Compare__Group_1_2__0 )
+ {
+ before(grammarAccess.getDSL_Expression_CompareAccess().getGroup_1_2());
+ // InternalSensinact.g:1044:3: ( rule__DSL_Expression_Compare__Group_1_2__0 )
+ // InternalSensinact.g:1044:4: rule__DSL_Expression_Compare__Group_1_2__0
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_Compare__Group_1_2__0();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_Expression_CompareAccess().getGroup_1_2());
+
+ }
+
+
+ }
+ break;
+ case 4 :
+ // InternalSensinact.g:1048:2: ( ( rule__DSL_Expression_Compare__Group_1_3__0 ) )
+ {
+ // InternalSensinact.g:1048:2: ( ( rule__DSL_Expression_Compare__Group_1_3__0 ) )
+ // InternalSensinact.g:1049:3: ( rule__DSL_Expression_Compare__Group_1_3__0 )
+ {
+ before(grammarAccess.getDSL_Expression_CompareAccess().getGroup_1_3());
+ // InternalSensinact.g:1050:3: ( rule__DSL_Expression_Compare__Group_1_3__0 )
+ // InternalSensinact.g:1050:4: rule__DSL_Expression_Compare__Group_1_3__0
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_Compare__Group_1_3__0();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_Expression_CompareAccess().getGroup_1_3());
+
+ }
+
+
+ }
+ break;
+
+ }
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Compare__Alternatives_1"
+
+
+ // $ANTLR start "rule__DSL_Expression_PlusMinus__Alternatives_1"
+ // InternalSensinact.g:1058:1: rule__DSL_Expression_PlusMinus__Alternatives_1 : ( ( ( rule__DSL_Expression_PlusMinus__Group_1_0__0 ) ) | ( ( rule__DSL_Expression_PlusMinus__Group_1_1__0 ) ) );
+ public final void rule__DSL_Expression_PlusMinus__Alternatives_1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:1062:1: ( ( ( rule__DSL_Expression_PlusMinus__Group_1_0__0 ) ) | ( ( rule__DSL_Expression_PlusMinus__Group_1_1__0 ) ) )
+ int alt8=2;
+ int LA8_0 = input.LA(1);
+
+ if ( (LA8_0==48) ) {
+ alt8=1;
+ }
+ else if ( (LA8_0==49) ) {
+ alt8=2;
+ }
+ else {
+ NoViableAltException nvae =
+ new NoViableAltException("", 8, 0, input);
+
+ throw nvae;
+ }
+ switch (alt8) {
+ case 1 :
+ // InternalSensinact.g:1063:2: ( ( rule__DSL_Expression_PlusMinus__Group_1_0__0 ) )
+ {
+ // InternalSensinact.g:1063:2: ( ( rule__DSL_Expression_PlusMinus__Group_1_0__0 ) )
+ // InternalSensinact.g:1064:3: ( rule__DSL_Expression_PlusMinus__Group_1_0__0 )
+ {
+ before(grammarAccess.getDSL_Expression_PlusMinusAccess().getGroup_1_0());
+ // InternalSensinact.g:1065:3: ( rule__DSL_Expression_PlusMinus__Group_1_0__0 )
+ // InternalSensinact.g:1065:4: rule__DSL_Expression_PlusMinus__Group_1_0__0
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_PlusMinus__Group_1_0__0();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_Expression_PlusMinusAccess().getGroup_1_0());
+
+ }
+
+
+ }
+ break;
+ case 2 :
+ // InternalSensinact.g:1069:2: ( ( rule__DSL_Expression_PlusMinus__Group_1_1__0 ) )
+ {
+ // InternalSensinact.g:1069:2: ( ( rule__DSL_Expression_PlusMinus__Group_1_1__0 ) )
+ // InternalSensinact.g:1070:3: ( rule__DSL_Expression_PlusMinus__Group_1_1__0 )
+ {
+ before(grammarAccess.getDSL_Expression_PlusMinusAccess().getGroup_1_1());
+ // InternalSensinact.g:1071:3: ( rule__DSL_Expression_PlusMinus__Group_1_1__0 )
+ // InternalSensinact.g:1071:4: rule__DSL_Expression_PlusMinus__Group_1_1__0
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_PlusMinus__Group_1_1__0();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_Expression_PlusMinusAccess().getGroup_1_1());
+
+ }
+
+
+ }
+ break;
+
+ }
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_PlusMinus__Alternatives_1"
+
+
+ // $ANTLR start "rule__DSL_Expression_MultiplicationDivision__Alternatives_1"
+ // InternalSensinact.g:1079:1: rule__DSL_Expression_MultiplicationDivision__Alternatives_1 : ( ( ( rule__DSL_Expression_MultiplicationDivision__Group_1_0__0 ) ) | ( ( rule__DSL_Expression_MultiplicationDivision__Group_1_1__0 ) ) | ( ( rule__DSL_Expression_MultiplicationDivision__Group_1_2__0 ) ) );
+ public final void rule__DSL_Expression_MultiplicationDivision__Alternatives_1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:1083:1: ( ( ( rule__DSL_Expression_MultiplicationDivision__Group_1_0__0 ) ) | ( ( rule__DSL_Expression_MultiplicationDivision__Group_1_1__0 ) ) | ( ( rule__DSL_Expression_MultiplicationDivision__Group_1_2__0 ) ) )
+ int alt9=3;
+ switch ( input.LA(1) ) {
+ case 50:
+ {
+ alt9=1;
+ }
+ break;
+ case 17:
+ {
+ alt9=2;
+ }
+ break;
+ case 51:
+ {
+ alt9=3;
+ }
+ break;
+ default:
+ NoViableAltException nvae =
+ new NoViableAltException("", 9, 0, input);
+
+ throw nvae;
+ }
+
+ switch (alt9) {
+ case 1 :
+ // InternalSensinact.g:1084:2: ( ( rule__DSL_Expression_MultiplicationDivision__Group_1_0__0 ) )
+ {
+ // InternalSensinact.g:1084:2: ( ( rule__DSL_Expression_MultiplicationDivision__Group_1_0__0 ) )
+ // InternalSensinact.g:1085:3: ( rule__DSL_Expression_MultiplicationDivision__Group_1_0__0 )
+ {
+ before(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getGroup_1_0());
+ // InternalSensinact.g:1086:3: ( rule__DSL_Expression_MultiplicationDivision__Group_1_0__0 )
+ // InternalSensinact.g:1086:4: rule__DSL_Expression_MultiplicationDivision__Group_1_0__0
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_MultiplicationDivision__Group_1_0__0();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getGroup_1_0());
+
+ }
+
+
+ }
+ break;
+ case 2 :
+ // InternalSensinact.g:1090:2: ( ( rule__DSL_Expression_MultiplicationDivision__Group_1_1__0 ) )
+ {
+ // InternalSensinact.g:1090:2: ( ( rule__DSL_Expression_MultiplicationDivision__Group_1_1__0 ) )
+ // InternalSensinact.g:1091:3: ( rule__DSL_Expression_MultiplicationDivision__Group_1_1__0 )
+ {
+ before(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getGroup_1_1());
+ // InternalSensinact.g:1092:3: ( rule__DSL_Expression_MultiplicationDivision__Group_1_1__0 )
+ // InternalSensinact.g:1092:4: rule__DSL_Expression_MultiplicationDivision__Group_1_1__0
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_MultiplicationDivision__Group_1_1__0();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getGroup_1_1());
+
+ }
+
+
+ }
+ break;
+ case 3 :
+ // InternalSensinact.g:1096:2: ( ( rule__DSL_Expression_MultiplicationDivision__Group_1_2__0 ) )
+ {
+ // InternalSensinact.g:1096:2: ( ( rule__DSL_Expression_MultiplicationDivision__Group_1_2__0 ) )
+ // InternalSensinact.g:1097:3: ( rule__DSL_Expression_MultiplicationDivision__Group_1_2__0 )
+ {
+ before(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getGroup_1_2());
+ // InternalSensinact.g:1098:3: ( rule__DSL_Expression_MultiplicationDivision__Group_1_2__0 )
+ // InternalSensinact.g:1098:4: rule__DSL_Expression_MultiplicationDivision__Group_1_2__0
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_MultiplicationDivision__Group_1_2__0();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getGroup_1_2());
+
+ }
+
+
+ }
+ break;
+
+ }
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_MultiplicationDivision__Alternatives_1"
+
+
+ // $ANTLR start "rule__DSL_Expression_Unary__Alternatives"
+ // InternalSensinact.g:1106:1: rule__DSL_Expression_Unary__Alternatives : ( ( ( rule__DSL_Expression_Unary__Group_0__0 ) ) | ( ( rule__DSL_Expression_Unary__Group_1__0 ) ) | ( ( rule__DSL_Expression_Unary__Group_2__0 ) ) | ( ( rule__DSL_Expression_Unary__Group_3__0 ) ) | ( ( rule__DSL_Expression_Unary__Group_4__0 ) ) | ( ( rule__DSL_Expression_Unary__Group_5__0 ) ) );
+ public final void rule__DSL_Expression_Unary__Alternatives() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:1110:1: ( ( ( rule__DSL_Expression_Unary__Group_0__0 ) ) | ( ( rule__DSL_Expression_Unary__Group_1__0 ) ) | ( ( rule__DSL_Expression_Unary__Group_2__0 ) ) | ( ( rule__DSL_Expression_Unary__Group_3__0 ) ) | ( ( rule__DSL_Expression_Unary__Group_4__0 ) ) | ( ( rule__DSL_Expression_Unary__Group_5__0 ) ) )
+ int alt10=6;
+ switch ( input.LA(1) ) {
+ case RULE_INT:
+ {
+ alt10=1;
+ }
+ break;
+ case RULE_STRING:
+ {
+ alt10=2;
+ }
+ break;
+ case RULE_BOOLEAN:
+ {
+ alt10=3;
+ }
+ break;
+ case RULE_ID:
+ {
+ alt10=4;
+ }
+ break;
+ case 28:
+ {
+ alt10=5;
+ }
+ break;
+ case 53:
+ {
+ alt10=6;
+ }
+ break;
+ default:
+ NoViableAltException nvae =
+ new NoViableAltException("", 10, 0, input);
+
+ throw nvae;
+ }
+
+ switch (alt10) {
+ case 1 :
+ // InternalSensinact.g:1111:2: ( ( rule__DSL_Expression_Unary__Group_0__0 ) )
+ {
+ // InternalSensinact.g:1111:2: ( ( rule__DSL_Expression_Unary__Group_0__0 ) )
+ // InternalSensinact.g:1112:3: ( rule__DSL_Expression_Unary__Group_0__0 )
+ {
+ before(grammarAccess.getDSL_Expression_UnaryAccess().getGroup_0());
+ // InternalSensinact.g:1113:3: ( rule__DSL_Expression_Unary__Group_0__0 )
+ // InternalSensinact.g:1113:4: rule__DSL_Expression_Unary__Group_0__0
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_Unary__Group_0__0();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_Expression_UnaryAccess().getGroup_0());
+
+ }
+
+
+ }
+ break;
+ case 2 :
+ // InternalSensinact.g:1117:2: ( ( rule__DSL_Expression_Unary__Group_1__0 ) )
+ {
+ // InternalSensinact.g:1117:2: ( ( rule__DSL_Expression_Unary__Group_1__0 ) )
+ // InternalSensinact.g:1118:3: ( rule__DSL_Expression_Unary__Group_1__0 )
+ {
+ before(grammarAccess.getDSL_Expression_UnaryAccess().getGroup_1());
+ // InternalSensinact.g:1119:3: ( rule__DSL_Expression_Unary__Group_1__0 )
+ // InternalSensinact.g:1119:4: rule__DSL_Expression_Unary__Group_1__0
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_Unary__Group_1__0();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_Expression_UnaryAccess().getGroup_1());
+
+ }
+
+
+ }
+ break;
+ case 3 :
+ // InternalSensinact.g:1123:2: ( ( rule__DSL_Expression_Unary__Group_2__0 ) )
+ {
+ // InternalSensinact.g:1123:2: ( ( rule__DSL_Expression_Unary__Group_2__0 ) )
+ // InternalSensinact.g:1124:3: ( rule__DSL_Expression_Unary__Group_2__0 )
+ {
+ before(grammarAccess.getDSL_Expression_UnaryAccess().getGroup_2());
+ // InternalSensinact.g:1125:3: ( rule__DSL_Expression_Unary__Group_2__0 )
+ // InternalSensinact.g:1125:4: rule__DSL_Expression_Unary__Group_2__0
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_Unary__Group_2__0();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_Expression_UnaryAccess().getGroup_2());
+
+ }
+
+
+ }
+ break;
+ case 4 :
+ // InternalSensinact.g:1129:2: ( ( rule__DSL_Expression_Unary__Group_3__0 ) )
+ {
+ // InternalSensinact.g:1129:2: ( ( rule__DSL_Expression_Unary__Group_3__0 ) )
+ // InternalSensinact.g:1130:3: ( rule__DSL_Expression_Unary__Group_3__0 )
+ {
+ before(grammarAccess.getDSL_Expression_UnaryAccess().getGroup_3());
+ // InternalSensinact.g:1131:3: ( rule__DSL_Expression_Unary__Group_3__0 )
+ // InternalSensinact.g:1131:4: rule__DSL_Expression_Unary__Group_3__0
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_Unary__Group_3__0();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_Expression_UnaryAccess().getGroup_3());
+
+ }
+
+
+ }
+ break;
+ case 5 :
+ // InternalSensinact.g:1135:2: ( ( rule__DSL_Expression_Unary__Group_4__0 ) )
+ {
+ // InternalSensinact.g:1135:2: ( ( rule__DSL_Expression_Unary__Group_4__0 ) )
+ // InternalSensinact.g:1136:3: ( rule__DSL_Expression_Unary__Group_4__0 )
+ {
+ before(grammarAccess.getDSL_Expression_UnaryAccess().getGroup_4());
+ // InternalSensinact.g:1137:3: ( rule__DSL_Expression_Unary__Group_4__0 )
+ // InternalSensinact.g:1137:4: rule__DSL_Expression_Unary__Group_4__0
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_Unary__Group_4__0();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_Expression_UnaryAccess().getGroup_4());
+
+ }
+
+
+ }
+ break;
+ case 6 :
+ // InternalSensinact.g:1141:2: ( ( rule__DSL_Expression_Unary__Group_5__0 ) )
+ {
+ // InternalSensinact.g:1141:2: ( ( rule__DSL_Expression_Unary__Group_5__0 ) )
+ // InternalSensinact.g:1142:3: ( rule__DSL_Expression_Unary__Group_5__0 )
+ {
+ before(grammarAccess.getDSL_Expression_UnaryAccess().getGroup_5());
+ // InternalSensinact.g:1143:3: ( rule__DSL_Expression_Unary__Group_5__0 )
+ // InternalSensinact.g:1143:4: rule__DSL_Expression_Unary__Group_5__0
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_Unary__Group_5__0();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_Expression_UnaryAccess().getGroup_5());
+
+ }
+
+
+ }
+ break;
+
+ }
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Unary__Alternatives"
+
+
+ // $ANTLR start "rule__Sensinact__Group__0"
+ // InternalSensinact.g:1151:1: rule__Sensinact__Group__0 : rule__Sensinact__Group__0__Impl rule__Sensinact__Group__1 ;
+ public final void rule__Sensinact__Group__0() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:1155:1: ( rule__Sensinact__Group__0__Impl rule__Sensinact__Group__1 )
+ // InternalSensinact.g:1156:2: rule__Sensinact__Group__0__Impl rule__Sensinact__Group__1
+ {
+ pushFollow(FOLLOW_4);
+ rule__Sensinact__Group__0__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__Sensinact__Group__1();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__Sensinact__Group__0"
+
+
+ // $ANTLR start "rule__Sensinact__Group__0__Impl"
+ // InternalSensinact.g:1163:1: rule__Sensinact__Group__0__Impl : ( () ) ;
+ public final void rule__Sensinact__Group__0__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:1167:1: ( ( () ) )
+ // InternalSensinact.g:1168:1: ( () )
+ {
+ // InternalSensinact.g:1168:1: ( () )
+ // InternalSensinact.g:1169:2: ()
+ {
+ before(grammarAccess.getSensinactAccess().getSensinactAction_0());
+ // InternalSensinact.g:1170:2: ()
+ // InternalSensinact.g:1170:3:
+ {
+ }
+
+ after(grammarAccess.getSensinactAccess().getSensinactAction_0());
+
+ }
+
+
+ }
+
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__Sensinact__Group__0__Impl"
+
+
+ // $ANTLR start "rule__Sensinact__Group__1"
+ // InternalSensinact.g:1178:1: rule__Sensinact__Group__1 : rule__Sensinact__Group__1__Impl ;
+ public final void rule__Sensinact__Group__1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:1182:1: ( rule__Sensinact__Group__1__Impl )
+ // InternalSensinact.g:1183:2: rule__Sensinact__Group__1__Impl
+ {
+ pushFollow(FOLLOW_2);
+ rule__Sensinact__Group__1__Impl();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__Sensinact__Group__1"
+
+
+ // $ANTLR start "rule__Sensinact__Group__1__Impl"
+ // InternalSensinact.g:1189:1: rule__Sensinact__Group__1__Impl : ( ( rule__Sensinact__EcaAssignment_1 ) ) ;
+ public final void rule__Sensinact__Group__1__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:1193:1: ( ( ( rule__Sensinact__EcaAssignment_1 ) ) )
+ // InternalSensinact.g:1194:1: ( ( rule__Sensinact__EcaAssignment_1 ) )
+ {
+ // InternalSensinact.g:1194:1: ( ( rule__Sensinact__EcaAssignment_1 ) )
+ // InternalSensinact.g:1195:2: ( rule__Sensinact__EcaAssignment_1 )
+ {
+ before(grammarAccess.getSensinactAccess().getEcaAssignment_1());
+ // InternalSensinact.g:1196:2: ( rule__Sensinact__EcaAssignment_1 )
+ // InternalSensinact.g:1196:3: rule__Sensinact__EcaAssignment_1
+ {
+ pushFollow(FOLLOW_2);
+ rule__Sensinact__EcaAssignment_1();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getSensinactAccess().getEcaAssignment_1());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__Sensinact__Group__1__Impl"
+
+
+ // $ANTLR start "rule__DSL_SENSINACT__Group__0"
+ // InternalSensinact.g:1205:1: rule__DSL_SENSINACT__Group__0 : rule__DSL_SENSINACT__Group__0__Impl rule__DSL_SENSINACT__Group__1 ;
+ public final void rule__DSL_SENSINACT__Group__0() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:1209:1: ( rule__DSL_SENSINACT__Group__0__Impl rule__DSL_SENSINACT__Group__1 )
+ // InternalSensinact.g:1210:2: rule__DSL_SENSINACT__Group__0__Impl rule__DSL_SENSINACT__Group__1
+ {
+ pushFollow(FOLLOW_5);
+ rule__DSL_SENSINACT__Group__0__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_SENSINACT__Group__1();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_SENSINACT__Group__0"
+
+
+ // $ANTLR start "rule__DSL_SENSINACT__Group__0__Impl"
+ // InternalSensinact.g:1217:1: rule__DSL_SENSINACT__Group__0__Impl : ( ( ( rule__DSL_SENSINACT__ResourcesAssignment_0 ) ) ( ( rule__DSL_SENSINACT__ResourcesAssignment_0 )* ) ) ;
+ public final void rule__DSL_SENSINACT__Group__0__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:1221:1: ( ( ( ( rule__DSL_SENSINACT__ResourcesAssignment_0 ) ) ( ( rule__DSL_SENSINACT__ResourcesAssignment_0 )* ) ) )
+ // InternalSensinact.g:1222:1: ( ( ( rule__DSL_SENSINACT__ResourcesAssignment_0 ) ) ( ( rule__DSL_SENSINACT__ResourcesAssignment_0 )* ) )
+ {
+ // InternalSensinact.g:1222:1: ( ( ( rule__DSL_SENSINACT__ResourcesAssignment_0 ) ) ( ( rule__DSL_SENSINACT__ResourcesAssignment_0 )* ) )
+ // InternalSensinact.g:1223:2: ( ( rule__DSL_SENSINACT__ResourcesAssignment_0 ) ) ( ( rule__DSL_SENSINACT__ResourcesAssignment_0 )* )
+ {
+ // InternalSensinact.g:1223:2: ( ( rule__DSL_SENSINACT__ResourcesAssignment_0 ) )
+ // InternalSensinact.g:1224:3: ( rule__DSL_SENSINACT__ResourcesAssignment_0 )
+ {
+ before(grammarAccess.getDSL_SENSINACTAccess().getResourcesAssignment_0());
+ // InternalSensinact.g:1225:3: ( rule__DSL_SENSINACT__ResourcesAssignment_0 )
+ // InternalSensinact.g:1225:4: rule__DSL_SENSINACT__ResourcesAssignment_0
+ {
+ pushFollow(FOLLOW_6);
+ rule__DSL_SENSINACT__ResourcesAssignment_0();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_SENSINACTAccess().getResourcesAssignment_0());
+
+ }
+
+ // InternalSensinact.g:1228:2: ( ( rule__DSL_SENSINACT__ResourcesAssignment_0 )* )
+ // InternalSensinact.g:1229:3: ( rule__DSL_SENSINACT__ResourcesAssignment_0 )*
+ {
+ before(grammarAccess.getDSL_SENSINACTAccess().getResourcesAssignment_0());
+ // InternalSensinact.g:1230:3: ( rule__DSL_SENSINACT__ResourcesAssignment_0 )*
+ loop11:
+ do {
+ int alt11=2;
+ int LA11_0 = input.LA(1);
+
+ if ( (LA11_0==14) ) {
+ alt11=1;
+ }
+
+
+ switch (alt11) {
+ case 1 :
+ // InternalSensinact.g:1230:4: rule__DSL_SENSINACT__ResourcesAssignment_0
+ {
+ pushFollow(FOLLOW_6);
+ rule__DSL_SENSINACT__ResourcesAssignment_0();
+
+ state._fsp--;
+
+
+ }
+ break;
+
+ default :
+ break loop11;
+ }
+ } while (true);
+
+ after(grammarAccess.getDSL_SENSINACTAccess().getResourcesAssignment_0());
+
+ }
+
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_SENSINACT__Group__0__Impl"
+
+
+ // $ANTLR start "rule__DSL_SENSINACT__Group__1"
+ // InternalSensinact.g:1239:1: rule__DSL_SENSINACT__Group__1 : rule__DSL_SENSINACT__Group__1__Impl rule__DSL_SENSINACT__Group__2 ;
+ public final void rule__DSL_SENSINACT__Group__1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:1243:1: ( rule__DSL_SENSINACT__Group__1__Impl rule__DSL_SENSINACT__Group__2 )
+ // InternalSensinact.g:1244:2: rule__DSL_SENSINACT__Group__1__Impl rule__DSL_SENSINACT__Group__2
+ {
+ pushFollow(FOLLOW_5);
+ rule__DSL_SENSINACT__Group__1__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_SENSINACT__Group__2();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_SENSINACT__Group__1"
+
+
+ // $ANTLR start "rule__DSL_SENSINACT__Group__1__Impl"
+ // InternalSensinact.g:1251:1: rule__DSL_SENSINACT__Group__1__Impl : ( ( rule__DSL_SENSINACT__CepAssignment_1 )* ) ;
+ public final void rule__DSL_SENSINACT__Group__1__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:1255:1: ( ( ( rule__DSL_SENSINACT__CepAssignment_1 )* ) )
+ // InternalSensinact.g:1256:1: ( ( rule__DSL_SENSINACT__CepAssignment_1 )* )
+ {
+ // InternalSensinact.g:1256:1: ( ( rule__DSL_SENSINACT__CepAssignment_1 )* )
+ // InternalSensinact.g:1257:2: ( rule__DSL_SENSINACT__CepAssignment_1 )*
+ {
+ before(grammarAccess.getDSL_SENSINACTAccess().getCepAssignment_1());
+ // InternalSensinact.g:1258:2: ( rule__DSL_SENSINACT__CepAssignment_1 )*
+ loop12:
+ do {
+ int alt12=2;
+ int LA12_0 = input.LA(1);
+
+ if ( (LA12_0==30) ) {
+ alt12=1;
+ }
+
+
+ switch (alt12) {
+ case 1 :
+ // InternalSensinact.g:1258:3: rule__DSL_SENSINACT__CepAssignment_1
+ {
+ pushFollow(FOLLOW_7);
+ rule__DSL_SENSINACT__CepAssignment_1();
+
+ state._fsp--;
+
+
+ }
+ break;
+
+ default :
+ break loop12;
+ }
+ } while (true);
+
+ after(grammarAccess.getDSL_SENSINACTAccess().getCepAssignment_1());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_SENSINACT__Group__1__Impl"
+
+
+ // $ANTLR start "rule__DSL_SENSINACT__Group__2"
+ // InternalSensinact.g:1266:1: rule__DSL_SENSINACT__Group__2 : rule__DSL_SENSINACT__Group__2__Impl rule__DSL_SENSINACT__Group__3 ;
+ public final void rule__DSL_SENSINACT__Group__2() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:1270:1: ( rule__DSL_SENSINACT__Group__2__Impl rule__DSL_SENSINACT__Group__3 )
+ // InternalSensinact.g:1271:2: rule__DSL_SENSINACT__Group__2__Impl rule__DSL_SENSINACT__Group__3
+ {
+ pushFollow(FOLLOW_8);
+ rule__DSL_SENSINACT__Group__2__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_SENSINACT__Group__3();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_SENSINACT__Group__2"
+
+
+ // $ANTLR start "rule__DSL_SENSINACT__Group__2__Impl"
+ // InternalSensinact.g:1278:1: rule__DSL_SENSINACT__Group__2__Impl : ( ( rule__DSL_SENSINACT__OnAssignment_2 ) ) ;
+ public final void rule__DSL_SENSINACT__Group__2__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:1282:1: ( ( ( rule__DSL_SENSINACT__OnAssignment_2 ) ) )
+ // InternalSensinact.g:1283:1: ( ( rule__DSL_SENSINACT__OnAssignment_2 ) )
+ {
+ // InternalSensinact.g:1283:1: ( ( rule__DSL_SENSINACT__OnAssignment_2 ) )
+ // InternalSensinact.g:1284:2: ( rule__DSL_SENSINACT__OnAssignment_2 )
+ {
+ before(grammarAccess.getDSL_SENSINACTAccess().getOnAssignment_2());
+ // InternalSensinact.g:1285:2: ( rule__DSL_SENSINACT__OnAssignment_2 )
+ // InternalSensinact.g:1285:3: rule__DSL_SENSINACT__OnAssignment_2
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_SENSINACT__OnAssignment_2();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_SENSINACTAccess().getOnAssignment_2());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_SENSINACT__Group__2__Impl"
+
+
+ // $ANTLR start "rule__DSL_SENSINACT__Group__3"
+ // InternalSensinact.g:1293:1: rule__DSL_SENSINACT__Group__3 : rule__DSL_SENSINACT__Group__3__Impl ;
+ public final void rule__DSL_SENSINACT__Group__3() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:1297:1: ( rule__DSL_SENSINACT__Group__3__Impl )
+ // InternalSensinact.g:1298:2: rule__DSL_SENSINACT__Group__3__Impl
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_SENSINACT__Group__3__Impl();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_SENSINACT__Group__3"
+
+
+ // $ANTLR start "rule__DSL_SENSINACT__Group__3__Impl"
+ // InternalSensinact.g:1304:1: rule__DSL_SENSINACT__Group__3__Impl : ( ( rule__DSL_SENSINACT__EcaAssignment_3 ) ) ;
+ public final void rule__DSL_SENSINACT__Group__3__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:1308:1: ( ( ( rule__DSL_SENSINACT__EcaAssignment_3 ) ) )
+ // InternalSensinact.g:1309:1: ( ( rule__DSL_SENSINACT__EcaAssignment_3 ) )
+ {
+ // InternalSensinact.g:1309:1: ( ( rule__DSL_SENSINACT__EcaAssignment_3 ) )
+ // InternalSensinact.g:1310:2: ( rule__DSL_SENSINACT__EcaAssignment_3 )
+ {
+ before(grammarAccess.getDSL_SENSINACTAccess().getEcaAssignment_3());
+ // InternalSensinact.g:1311:2: ( rule__DSL_SENSINACT__EcaAssignment_3 )
+ // InternalSensinact.g:1311:3: rule__DSL_SENSINACT__EcaAssignment_3
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_SENSINACT__EcaAssignment_3();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_SENSINACTAccess().getEcaAssignment_3());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_SENSINACT__Group__3__Impl"
+
+
+ // $ANTLR start "rule__DSL_Resource__Group__0"
+ // InternalSensinact.g:1320:1: rule__DSL_Resource__Group__0 : rule__DSL_Resource__Group__0__Impl rule__DSL_Resource__Group__1 ;
+ public final void rule__DSL_Resource__Group__0() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:1324:1: ( rule__DSL_Resource__Group__0__Impl rule__DSL_Resource__Group__1 )
+ // InternalSensinact.g:1325:2: rule__DSL_Resource__Group__0__Impl rule__DSL_Resource__Group__1
+ {
+ pushFollow(FOLLOW_9);
+ rule__DSL_Resource__Group__0__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_Resource__Group__1();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Resource__Group__0"
+
+
+ // $ANTLR start "rule__DSL_Resource__Group__0__Impl"
+ // InternalSensinact.g:1332:1: rule__DSL_Resource__Group__0__Impl : ( 'resource' ) ;
+ public final void rule__DSL_Resource__Group__0__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:1336:1: ( ( 'resource' ) )
+ // InternalSensinact.g:1337:1: ( 'resource' )
+ {
+ // InternalSensinact.g:1337:1: ( 'resource' )
+ // InternalSensinact.g:1338:2: 'resource'
+ {
+ before(grammarAccess.getDSL_ResourceAccess().getResourceKeyword_0());
+ match(input,14,FOLLOW_2);
+ after(grammarAccess.getDSL_ResourceAccess().getResourceKeyword_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Resource__Group__0__Impl"
+
+
+ // $ANTLR start "rule__DSL_Resource__Group__1"
+ // InternalSensinact.g:1347:1: rule__DSL_Resource__Group__1 : rule__DSL_Resource__Group__1__Impl rule__DSL_Resource__Group__2 ;
+ public final void rule__DSL_Resource__Group__1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:1351:1: ( rule__DSL_Resource__Group__1__Impl rule__DSL_Resource__Group__2 )
+ // InternalSensinact.g:1352:2: rule__DSL_Resource__Group__1__Impl rule__DSL_Resource__Group__2
+ {
+ pushFollow(FOLLOW_10);
+ rule__DSL_Resource__Group__1__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_Resource__Group__2();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Resource__Group__1"
+
+
+ // $ANTLR start "rule__DSL_Resource__Group__1__Impl"
+ // InternalSensinact.g:1359:1: rule__DSL_Resource__Group__1__Impl : ( ( rule__DSL_Resource__NameAssignment_1 ) ) ;
+ public final void rule__DSL_Resource__Group__1__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:1363:1: ( ( ( rule__DSL_Resource__NameAssignment_1 ) ) )
+ // InternalSensinact.g:1364:1: ( ( rule__DSL_Resource__NameAssignment_1 ) )
+ {
+ // InternalSensinact.g:1364:1: ( ( rule__DSL_Resource__NameAssignment_1 ) )
+ // InternalSensinact.g:1365:2: ( rule__DSL_Resource__NameAssignment_1 )
+ {
+ before(grammarAccess.getDSL_ResourceAccess().getNameAssignment_1());
+ // InternalSensinact.g:1366:2: ( rule__DSL_Resource__NameAssignment_1 )
+ // InternalSensinact.g:1366:3: rule__DSL_Resource__NameAssignment_1
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Resource__NameAssignment_1();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_ResourceAccess().getNameAssignment_1());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Resource__Group__1__Impl"
+
+
+ // $ANTLR start "rule__DSL_Resource__Group__2"
+ // InternalSensinact.g:1374:1: rule__DSL_Resource__Group__2 : rule__DSL_Resource__Group__2__Impl rule__DSL_Resource__Group__3 ;
+ public final void rule__DSL_Resource__Group__2() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:1378:1: ( rule__DSL_Resource__Group__2__Impl rule__DSL_Resource__Group__3 )
+ // InternalSensinact.g:1379:2: rule__DSL_Resource__Group__2__Impl rule__DSL_Resource__Group__3
+ {
+ pushFollow(FOLLOW_11);
+ rule__DSL_Resource__Group__2__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_Resource__Group__3();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Resource__Group__2"
+
+
+ // $ANTLR start "rule__DSL_Resource__Group__2__Impl"
+ // InternalSensinact.g:1386:1: rule__DSL_Resource__Group__2__Impl : ( '=' ) ;
+ public final void rule__DSL_Resource__Group__2__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:1390:1: ( ( '=' ) )
+ // InternalSensinact.g:1391:1: ( '=' )
+ {
+ // InternalSensinact.g:1391:1: ( '=' )
+ // InternalSensinact.g:1392:2: '='
+ {
+ before(grammarAccess.getDSL_ResourceAccess().getEqualsSignKeyword_2());
+ match(input,15,FOLLOW_2);
+ after(grammarAccess.getDSL_ResourceAccess().getEqualsSignKeyword_2());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Resource__Group__2__Impl"
+
+
+ // $ANTLR start "rule__DSL_Resource__Group__3"
+ // InternalSensinact.g:1401:1: rule__DSL_Resource__Group__3 : rule__DSL_Resource__Group__3__Impl rule__DSL_Resource__Group__4 ;
+ public final void rule__DSL_Resource__Group__3() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:1405:1: ( rule__DSL_Resource__Group__3__Impl rule__DSL_Resource__Group__4 )
+ // InternalSensinact.g:1406:2: rule__DSL_Resource__Group__3__Impl rule__DSL_Resource__Group__4
+ {
+ pushFollow(FOLLOW_9);
+ rule__DSL_Resource__Group__3__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_Resource__Group__4();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Resource__Group__3"
+
+
+ // $ANTLR start "rule__DSL_Resource__Group__3__Impl"
+ // InternalSensinact.g:1413:1: rule__DSL_Resource__Group__3__Impl : ( '[' ) ;
+ public final void rule__DSL_Resource__Group__3__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:1417:1: ( ( '[' ) )
+ // InternalSensinact.g:1418:1: ( '[' )
+ {
+ // InternalSensinact.g:1418:1: ( '[' )
+ // InternalSensinact.g:1419:2: '['
+ {
+ before(grammarAccess.getDSL_ResourceAccess().getLeftSquareBracketKeyword_3());
+ match(input,16,FOLLOW_2);
+ after(grammarAccess.getDSL_ResourceAccess().getLeftSquareBracketKeyword_3());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Resource__Group__3__Impl"
+
+
+ // $ANTLR start "rule__DSL_Resource__Group__4"
+ // InternalSensinact.g:1428:1: rule__DSL_Resource__Group__4 : rule__DSL_Resource__Group__4__Impl rule__DSL_Resource__Group__5 ;
+ public final void rule__DSL_Resource__Group__4() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:1432:1: ( rule__DSL_Resource__Group__4__Impl rule__DSL_Resource__Group__5 )
+ // InternalSensinact.g:1433:2: rule__DSL_Resource__Group__4__Impl rule__DSL_Resource__Group__5
+ {
+ pushFollow(FOLLOW_12);
+ rule__DSL_Resource__Group__4__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_Resource__Group__5();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Resource__Group__4"
+
+
+ // $ANTLR start "rule__DSL_Resource__Group__4__Impl"
+ // InternalSensinact.g:1440:1: rule__DSL_Resource__Group__4__Impl : ( ( rule__DSL_Resource__GatewayIDAssignment_4 ) ) ;
+ public final void rule__DSL_Resource__Group__4__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:1444:1: ( ( ( rule__DSL_Resource__GatewayIDAssignment_4 ) ) )
+ // InternalSensinact.g:1445:1: ( ( rule__DSL_Resource__GatewayIDAssignment_4 ) )
+ {
+ // InternalSensinact.g:1445:1: ( ( rule__DSL_Resource__GatewayIDAssignment_4 ) )
+ // InternalSensinact.g:1446:2: ( rule__DSL_Resource__GatewayIDAssignment_4 )
+ {
+ before(grammarAccess.getDSL_ResourceAccess().getGatewayIDAssignment_4());
+ // InternalSensinact.g:1447:2: ( rule__DSL_Resource__GatewayIDAssignment_4 )
+ // InternalSensinact.g:1447:3: rule__DSL_Resource__GatewayIDAssignment_4
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Resource__GatewayIDAssignment_4();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_ResourceAccess().getGatewayIDAssignment_4());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Resource__Group__4__Impl"
+
+
+ // $ANTLR start "rule__DSL_Resource__Group__5"
+ // InternalSensinact.g:1455:1: rule__DSL_Resource__Group__5 : rule__DSL_Resource__Group__5__Impl rule__DSL_Resource__Group__6 ;
+ public final void rule__DSL_Resource__Group__5() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:1459:1: ( rule__DSL_Resource__Group__5__Impl rule__DSL_Resource__Group__6 )
+ // InternalSensinact.g:1460:2: rule__DSL_Resource__Group__5__Impl rule__DSL_Resource__Group__6
+ {
+ pushFollow(FOLLOW_9);
+ rule__DSL_Resource__Group__5__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_Resource__Group__6();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Resource__Group__5"
+
+
+ // $ANTLR start "rule__DSL_Resource__Group__5__Impl"
+ // InternalSensinact.g:1467:1: rule__DSL_Resource__Group__5__Impl : ( '/' ) ;
+ public final void rule__DSL_Resource__Group__5__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:1471:1: ( ( '/' ) )
+ // InternalSensinact.g:1472:1: ( '/' )
+ {
+ // InternalSensinact.g:1472:1: ( '/' )
+ // InternalSensinact.g:1473:2: '/'
+ {
+ before(grammarAccess.getDSL_ResourceAccess().getSolidusKeyword_5());
+ match(input,17,FOLLOW_2);
+ after(grammarAccess.getDSL_ResourceAccess().getSolidusKeyword_5());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Resource__Group__5__Impl"
+
+
+ // $ANTLR start "rule__DSL_Resource__Group__6"
+ // InternalSensinact.g:1482:1: rule__DSL_Resource__Group__6 : rule__DSL_Resource__Group__6__Impl rule__DSL_Resource__Group__7 ;
+ public final void rule__DSL_Resource__Group__6() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:1486:1: ( rule__DSL_Resource__Group__6__Impl rule__DSL_Resource__Group__7 )
+ // InternalSensinact.g:1487:2: rule__DSL_Resource__Group__6__Impl rule__DSL_Resource__Group__7
+ {
+ pushFollow(FOLLOW_12);
+ rule__DSL_Resource__Group__6__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_Resource__Group__7();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Resource__Group__6"
+
+
+ // $ANTLR start "rule__DSL_Resource__Group__6__Impl"
+ // InternalSensinact.g:1494:1: rule__DSL_Resource__Group__6__Impl : ( ( rule__DSL_Resource__DeviceIDAssignment_6 ) ) ;
+ public final void rule__DSL_Resource__Group__6__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:1498:1: ( ( ( rule__DSL_Resource__DeviceIDAssignment_6 ) ) )
+ // InternalSensinact.g:1499:1: ( ( rule__DSL_Resource__DeviceIDAssignment_6 ) )
+ {
+ // InternalSensinact.g:1499:1: ( ( rule__DSL_Resource__DeviceIDAssignment_6 ) )
+ // InternalSensinact.g:1500:2: ( rule__DSL_Resource__DeviceIDAssignment_6 )
+ {
+ before(grammarAccess.getDSL_ResourceAccess().getDeviceIDAssignment_6());
+ // InternalSensinact.g:1501:2: ( rule__DSL_Resource__DeviceIDAssignment_6 )
+ // InternalSensinact.g:1501:3: rule__DSL_Resource__DeviceIDAssignment_6
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Resource__DeviceIDAssignment_6();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_ResourceAccess().getDeviceIDAssignment_6());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Resource__Group__6__Impl"
+
+
+ // $ANTLR start "rule__DSL_Resource__Group__7"
+ // InternalSensinact.g:1509:1: rule__DSL_Resource__Group__7 : rule__DSL_Resource__Group__7__Impl rule__DSL_Resource__Group__8 ;
+ public final void rule__DSL_Resource__Group__7() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:1513:1: ( rule__DSL_Resource__Group__7__Impl rule__DSL_Resource__Group__8 )
+ // InternalSensinact.g:1514:2: rule__DSL_Resource__Group__7__Impl rule__DSL_Resource__Group__8
+ {
+ pushFollow(FOLLOW_9);
+ rule__DSL_Resource__Group__7__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_Resource__Group__8();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Resource__Group__7"
+
+
+ // $ANTLR start "rule__DSL_Resource__Group__7__Impl"
+ // InternalSensinact.g:1521:1: rule__DSL_Resource__Group__7__Impl : ( '/' ) ;
+ public final void rule__DSL_Resource__Group__7__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:1525:1: ( ( '/' ) )
+ // InternalSensinact.g:1526:1: ( '/' )
+ {
+ // InternalSensinact.g:1526:1: ( '/' )
+ // InternalSensinact.g:1527:2: '/'
+ {
+ before(grammarAccess.getDSL_ResourceAccess().getSolidusKeyword_7());
+ match(input,17,FOLLOW_2);
+ after(grammarAccess.getDSL_ResourceAccess().getSolidusKeyword_7());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Resource__Group__7__Impl"
+
+
+ // $ANTLR start "rule__DSL_Resource__Group__8"
+ // InternalSensinact.g:1536:1: rule__DSL_Resource__Group__8 : rule__DSL_Resource__Group__8__Impl rule__DSL_Resource__Group__9 ;
+ public final void rule__DSL_Resource__Group__8() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:1540:1: ( rule__DSL_Resource__Group__8__Impl rule__DSL_Resource__Group__9 )
+ // InternalSensinact.g:1541:2: rule__DSL_Resource__Group__8__Impl rule__DSL_Resource__Group__9
+ {
+ pushFollow(FOLLOW_12);
+ rule__DSL_Resource__Group__8__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_Resource__Group__9();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Resource__Group__8"
+
+
+ // $ANTLR start "rule__DSL_Resource__Group__8__Impl"
+ // InternalSensinact.g:1548:1: rule__DSL_Resource__Group__8__Impl : ( ( rule__DSL_Resource__ServiceIDAssignment_8 ) ) ;
+ public final void rule__DSL_Resource__Group__8__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:1552:1: ( ( ( rule__DSL_Resource__ServiceIDAssignment_8 ) ) )
+ // InternalSensinact.g:1553:1: ( ( rule__DSL_Resource__ServiceIDAssignment_8 ) )
+ {
+ // InternalSensinact.g:1553:1: ( ( rule__DSL_Resource__ServiceIDAssignment_8 ) )
+ // InternalSensinact.g:1554:2: ( rule__DSL_Resource__ServiceIDAssignment_8 )
+ {
+ before(grammarAccess.getDSL_ResourceAccess().getServiceIDAssignment_8());
+ // InternalSensinact.g:1555:2: ( rule__DSL_Resource__ServiceIDAssignment_8 )
+ // InternalSensinact.g:1555:3: rule__DSL_Resource__ServiceIDAssignment_8
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Resource__ServiceIDAssignment_8();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_ResourceAccess().getServiceIDAssignment_8());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Resource__Group__8__Impl"
+
+
+ // $ANTLR start "rule__DSL_Resource__Group__9"
+ // InternalSensinact.g:1563:1: rule__DSL_Resource__Group__9 : rule__DSL_Resource__Group__9__Impl rule__DSL_Resource__Group__10 ;
+ public final void rule__DSL_Resource__Group__9() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:1567:1: ( rule__DSL_Resource__Group__9__Impl rule__DSL_Resource__Group__10 )
+ // InternalSensinact.g:1568:2: rule__DSL_Resource__Group__9__Impl rule__DSL_Resource__Group__10
+ {
+ pushFollow(FOLLOW_9);
+ rule__DSL_Resource__Group__9__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_Resource__Group__10();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Resource__Group__9"
+
+
+ // $ANTLR start "rule__DSL_Resource__Group__9__Impl"
+ // InternalSensinact.g:1575:1: rule__DSL_Resource__Group__9__Impl : ( '/' ) ;
+ public final void rule__DSL_Resource__Group__9__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:1579:1: ( ( '/' ) )
+ // InternalSensinact.g:1580:1: ( '/' )
+ {
+ // InternalSensinact.g:1580:1: ( '/' )
+ // InternalSensinact.g:1581:2: '/'
+ {
+ before(grammarAccess.getDSL_ResourceAccess().getSolidusKeyword_9());
+ match(input,17,FOLLOW_2);
+ after(grammarAccess.getDSL_ResourceAccess().getSolidusKeyword_9());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Resource__Group__9__Impl"
+
+
+ // $ANTLR start "rule__DSL_Resource__Group__10"
+ // InternalSensinact.g:1590:1: rule__DSL_Resource__Group__10 : rule__DSL_Resource__Group__10__Impl rule__DSL_Resource__Group__11 ;
+ public final void rule__DSL_Resource__Group__10() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:1594:1: ( rule__DSL_Resource__Group__10__Impl rule__DSL_Resource__Group__11 )
+ // InternalSensinact.g:1595:2: rule__DSL_Resource__Group__10__Impl rule__DSL_Resource__Group__11
+ {
+ pushFollow(FOLLOW_13);
+ rule__DSL_Resource__Group__10__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_Resource__Group__11();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Resource__Group__10"
+
+
+ // $ANTLR start "rule__DSL_Resource__Group__10__Impl"
+ // InternalSensinact.g:1602:1: rule__DSL_Resource__Group__10__Impl : ( ( rule__DSL_Resource__ResourceIDAssignment_10 ) ) ;
+ public final void rule__DSL_Resource__Group__10__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:1606:1: ( ( ( rule__DSL_Resource__ResourceIDAssignment_10 ) ) )
+ // InternalSensinact.g:1607:1: ( ( rule__DSL_Resource__ResourceIDAssignment_10 ) )
+ {
+ // InternalSensinact.g:1607:1: ( ( rule__DSL_Resource__ResourceIDAssignment_10 ) )
+ // InternalSensinact.g:1608:2: ( rule__DSL_Resource__ResourceIDAssignment_10 )
+ {
+ before(grammarAccess.getDSL_ResourceAccess().getResourceIDAssignment_10());
+ // InternalSensinact.g:1609:2: ( rule__DSL_Resource__ResourceIDAssignment_10 )
+ // InternalSensinact.g:1609:3: rule__DSL_Resource__ResourceIDAssignment_10
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Resource__ResourceIDAssignment_10();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_ResourceAccess().getResourceIDAssignment_10());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Resource__Group__10__Impl"
+
+
+ // $ANTLR start "rule__DSL_Resource__Group__11"
+ // InternalSensinact.g:1617:1: rule__DSL_Resource__Group__11 : rule__DSL_Resource__Group__11__Impl ;
+ public final void rule__DSL_Resource__Group__11() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:1621:1: ( rule__DSL_Resource__Group__11__Impl )
+ // InternalSensinact.g:1622:2: rule__DSL_Resource__Group__11__Impl
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Resource__Group__11__Impl();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Resource__Group__11"
+
+
+ // $ANTLR start "rule__DSL_Resource__Group__11__Impl"
+ // InternalSensinact.g:1628:1: rule__DSL_Resource__Group__11__Impl : ( ']' ) ;
+ public final void rule__DSL_Resource__Group__11__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:1632:1: ( ( ']' ) )
+ // InternalSensinact.g:1633:1: ( ']' )
+ {
+ // InternalSensinact.g:1633:1: ( ']' )
+ // InternalSensinact.g:1634:2: ']'
+ {
+ before(grammarAccess.getDSL_ResourceAccess().getRightSquareBracketKeyword_11());
+ match(input,18,FOLLOW_2);
+ after(grammarAccess.getDSL_ResourceAccess().getRightSquareBracketKeyword_11());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Resource__Group__11__Impl"
+
+
+ // $ANTLR start "rule__DSL_On__Group__0"
+ // InternalSensinact.g:1644:1: rule__DSL_On__Group__0 : rule__DSL_On__Group__0__Impl rule__DSL_On__Group__1 ;
+ public final void rule__DSL_On__Group__0() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:1648:1: ( rule__DSL_On__Group__0__Impl rule__DSL_On__Group__1 )
+ // InternalSensinact.g:1649:2: rule__DSL_On__Group__0__Impl rule__DSL_On__Group__1
+ {
+ pushFollow(FOLLOW_9);
+ rule__DSL_On__Group__0__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_On__Group__1();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_On__Group__0"
+
+
+ // $ANTLR start "rule__DSL_On__Group__0__Impl"
+ // InternalSensinact.g:1656:1: rule__DSL_On__Group__0__Impl : ( 'on' ) ;
+ public final void rule__DSL_On__Group__0__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:1660:1: ( ( 'on' ) )
+ // InternalSensinact.g:1661:1: ( 'on' )
+ {
+ // InternalSensinact.g:1661:1: ( 'on' )
+ // InternalSensinact.g:1662:2: 'on'
+ {
+ before(grammarAccess.getDSL_OnAccess().getOnKeyword_0());
+ match(input,19,FOLLOW_2);
+ after(grammarAccess.getDSL_OnAccess().getOnKeyword_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_On__Group__0__Impl"
+
+
+ // $ANTLR start "rule__DSL_On__Group__1"
+ // InternalSensinact.g:1671:1: rule__DSL_On__Group__1 : rule__DSL_On__Group__1__Impl rule__DSL_On__Group__2 ;
+ public final void rule__DSL_On__Group__1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:1675:1: ( rule__DSL_On__Group__1__Impl rule__DSL_On__Group__2 )
+ // InternalSensinact.g:1676:2: rule__DSL_On__Group__1__Impl rule__DSL_On__Group__2
+ {
+ pushFollow(FOLLOW_14);
+ rule__DSL_On__Group__1__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_On__Group__2();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_On__Group__1"
+
+
+ // $ANTLR start "rule__DSL_On__Group__1__Impl"
+ // InternalSensinact.g:1683:1: rule__DSL_On__Group__1__Impl : ( ( rule__DSL_On__TriggersAssignment_1 ) ) ;
+ public final void rule__DSL_On__Group__1__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:1687:1: ( ( ( rule__DSL_On__TriggersAssignment_1 ) ) )
+ // InternalSensinact.g:1688:1: ( ( rule__DSL_On__TriggersAssignment_1 ) )
+ {
+ // InternalSensinact.g:1688:1: ( ( rule__DSL_On__TriggersAssignment_1 ) )
+ // InternalSensinact.g:1689:2: ( rule__DSL_On__TriggersAssignment_1 )
+ {
+ before(grammarAccess.getDSL_OnAccess().getTriggersAssignment_1());
+ // InternalSensinact.g:1690:2: ( rule__DSL_On__TriggersAssignment_1 )
+ // InternalSensinact.g:1690:3: rule__DSL_On__TriggersAssignment_1
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_On__TriggersAssignment_1();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_OnAccess().getTriggersAssignment_1());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_On__Group__1__Impl"
+
+
+ // $ANTLR start "rule__DSL_On__Group__2"
+ // InternalSensinact.g:1698:1: rule__DSL_On__Group__2 : rule__DSL_On__Group__2__Impl ;
+ public final void rule__DSL_On__Group__2() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:1702:1: ( rule__DSL_On__Group__2__Impl )
+ // InternalSensinact.g:1703:2: rule__DSL_On__Group__2__Impl
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_On__Group__2__Impl();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_On__Group__2"
+
+
+ // $ANTLR start "rule__DSL_On__Group__2__Impl"
+ // InternalSensinact.g:1709:1: rule__DSL_On__Group__2__Impl : ( ( rule__DSL_On__Group_2__0 )* ) ;
+ public final void rule__DSL_On__Group__2__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:1713:1: ( ( ( rule__DSL_On__Group_2__0 )* ) )
+ // InternalSensinact.g:1714:1: ( ( rule__DSL_On__Group_2__0 )* )
+ {
+ // InternalSensinact.g:1714:1: ( ( rule__DSL_On__Group_2__0 )* )
+ // InternalSensinact.g:1715:2: ( rule__DSL_On__Group_2__0 )*
+ {
+ before(grammarAccess.getDSL_OnAccess().getGroup_2());
+ // InternalSensinact.g:1716:2: ( rule__DSL_On__Group_2__0 )*
+ loop13:
+ do {
+ int alt13=2;
+ int LA13_0 = input.LA(1);
+
+ if ( (LA13_0==20) ) {
+ alt13=1;
+ }
+
+
+ switch (alt13) {
+ case 1 :
+ // InternalSensinact.g:1716:3: rule__DSL_On__Group_2__0
+ {
+ pushFollow(FOLLOW_15);
+ rule__DSL_On__Group_2__0();
+
+ state._fsp--;
+
+
+ }
+ break;
+
+ default :
+ break loop13;
+ }
+ } while (true);
+
+ after(grammarAccess.getDSL_OnAccess().getGroup_2());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_On__Group__2__Impl"
+
+
+ // $ANTLR start "rule__DSL_On__Group_2__0"
+ // InternalSensinact.g:1725:1: rule__DSL_On__Group_2__0 : rule__DSL_On__Group_2__0__Impl rule__DSL_On__Group_2__1 ;
+ public final void rule__DSL_On__Group_2__0() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:1729:1: ( rule__DSL_On__Group_2__0__Impl rule__DSL_On__Group_2__1 )
+ // InternalSensinact.g:1730:2: rule__DSL_On__Group_2__0__Impl rule__DSL_On__Group_2__1
+ {
+ pushFollow(FOLLOW_9);
+ rule__DSL_On__Group_2__0__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_On__Group_2__1();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_On__Group_2__0"
+
+
+ // $ANTLR start "rule__DSL_On__Group_2__0__Impl"
+ // InternalSensinact.g:1737:1: rule__DSL_On__Group_2__0__Impl : ( ',' ) ;
+ public final void rule__DSL_On__Group_2__0__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:1741:1: ( ( ',' ) )
+ // InternalSensinact.g:1742:1: ( ',' )
+ {
+ // InternalSensinact.g:1742:1: ( ',' )
+ // InternalSensinact.g:1743:2: ','
+ {
+ before(grammarAccess.getDSL_OnAccess().getCommaKeyword_2_0());
+ match(input,20,FOLLOW_2);
+ after(grammarAccess.getDSL_OnAccess().getCommaKeyword_2_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_On__Group_2__0__Impl"
+
+
+ // $ANTLR start "rule__DSL_On__Group_2__1"
+ // InternalSensinact.g:1752:1: rule__DSL_On__Group_2__1 : rule__DSL_On__Group_2__1__Impl ;
+ public final void rule__DSL_On__Group_2__1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:1756:1: ( rule__DSL_On__Group_2__1__Impl )
+ // InternalSensinact.g:1757:2: rule__DSL_On__Group_2__1__Impl
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_On__Group_2__1__Impl();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_On__Group_2__1"
+
+
+ // $ANTLR start "rule__DSL_On__Group_2__1__Impl"
+ // InternalSensinact.g:1763:1: rule__DSL_On__Group_2__1__Impl : ( ( rule__DSL_On__TriggersAssignment_2_1 ) ) ;
+ public final void rule__DSL_On__Group_2__1__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:1767:1: ( ( ( rule__DSL_On__TriggersAssignment_2_1 ) ) )
+ // InternalSensinact.g:1768:1: ( ( rule__DSL_On__TriggersAssignment_2_1 ) )
+ {
+ // InternalSensinact.g:1768:1: ( ( rule__DSL_On__TriggersAssignment_2_1 ) )
+ // InternalSensinact.g:1769:2: ( rule__DSL_On__TriggersAssignment_2_1 )
+ {
+ before(grammarAccess.getDSL_OnAccess().getTriggersAssignment_2_1());
+ // InternalSensinact.g:1770:2: ( rule__DSL_On__TriggersAssignment_2_1 )
+ // InternalSensinact.g:1770:3: rule__DSL_On__TriggersAssignment_2_1
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_On__TriggersAssignment_2_1();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_OnAccess().getTriggersAssignment_2_1());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_On__Group_2__1__Impl"
+
+
+ // $ANTLR start "rule__DSL_ECA_STATEMENT__Group__0"
+ // InternalSensinact.g:1779:1: rule__DSL_ECA_STATEMENT__Group__0 : rule__DSL_ECA_STATEMENT__Group__0__Impl rule__DSL_ECA_STATEMENT__Group__1 ;
+ public final void rule__DSL_ECA_STATEMENT__Group__0() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:1783:1: ( rule__DSL_ECA_STATEMENT__Group__0__Impl rule__DSL_ECA_STATEMENT__Group__1 )
+ // InternalSensinact.g:1784:2: rule__DSL_ECA_STATEMENT__Group__0__Impl rule__DSL_ECA_STATEMENT__Group__1
+ {
+ pushFollow(FOLLOW_16);
+ rule__DSL_ECA_STATEMENT__Group__0__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_ECA_STATEMENT__Group__1();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_ECA_STATEMENT__Group__0"
+
+
+ // $ANTLR start "rule__DSL_ECA_STATEMENT__Group__0__Impl"
+ // InternalSensinact.g:1791:1: rule__DSL_ECA_STATEMENT__Group__0__Impl : ( ( rule__DSL_ECA_STATEMENT__IfdoAssignment_0 ) ) ;
+ public final void rule__DSL_ECA_STATEMENT__Group__0__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:1795:1: ( ( ( rule__DSL_ECA_STATEMENT__IfdoAssignment_0 ) ) )
+ // InternalSensinact.g:1796:1: ( ( rule__DSL_ECA_STATEMENT__IfdoAssignment_0 ) )
+ {
+ // InternalSensinact.g:1796:1: ( ( rule__DSL_ECA_STATEMENT__IfdoAssignment_0 ) )
+ // InternalSensinact.g:1797:2: ( rule__DSL_ECA_STATEMENT__IfdoAssignment_0 )
+ {
+ before(grammarAccess.getDSL_ECA_STATEMENTAccess().getIfdoAssignment_0());
+ // InternalSensinact.g:1798:2: ( rule__DSL_ECA_STATEMENT__IfdoAssignment_0 )
+ // InternalSensinact.g:1798:3: rule__DSL_ECA_STATEMENT__IfdoAssignment_0
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_ECA_STATEMENT__IfdoAssignment_0();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_ECA_STATEMENTAccess().getIfdoAssignment_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_ECA_STATEMENT__Group__0__Impl"
+
+
+ // $ANTLR start "rule__DSL_ECA_STATEMENT__Group__1"
+ // InternalSensinact.g:1806:1: rule__DSL_ECA_STATEMENT__Group__1 : rule__DSL_ECA_STATEMENT__Group__1__Impl rule__DSL_ECA_STATEMENT__Group__2 ;
+ public final void rule__DSL_ECA_STATEMENT__Group__1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:1810:1: ( rule__DSL_ECA_STATEMENT__Group__1__Impl rule__DSL_ECA_STATEMENT__Group__2 )
+ // InternalSensinact.g:1811:2: rule__DSL_ECA_STATEMENT__Group__1__Impl rule__DSL_ECA_STATEMENT__Group__2
+ {
+ pushFollow(FOLLOW_16);
+ rule__DSL_ECA_STATEMENT__Group__1__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_ECA_STATEMENT__Group__2();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_ECA_STATEMENT__Group__1"
+
+
+ // $ANTLR start "rule__DSL_ECA_STATEMENT__Group__1__Impl"
+ // InternalSensinact.g:1818:1: rule__DSL_ECA_STATEMENT__Group__1__Impl : ( ( rule__DSL_ECA_STATEMENT__ElseIfdoAssignment_1 )* ) ;
+ public final void rule__DSL_ECA_STATEMENT__Group__1__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:1822:1: ( ( ( rule__DSL_ECA_STATEMENT__ElseIfdoAssignment_1 )* ) )
+ // InternalSensinact.g:1823:1: ( ( rule__DSL_ECA_STATEMENT__ElseIfdoAssignment_1 )* )
+ {
+ // InternalSensinact.g:1823:1: ( ( rule__DSL_ECA_STATEMENT__ElseIfdoAssignment_1 )* )
+ // InternalSensinact.g:1824:2: ( rule__DSL_ECA_STATEMENT__ElseIfdoAssignment_1 )*
+ {
+ before(grammarAccess.getDSL_ECA_STATEMENTAccess().getElseIfdoAssignment_1());
+ // InternalSensinact.g:1825:2: ( rule__DSL_ECA_STATEMENT__ElseIfdoAssignment_1 )*
+ loop14:
+ do {
+ int alt14=2;
+ int LA14_0 = input.LA(1);
+
+ if ( (LA14_0==24) ) {
+ alt14=1;
+ }
+
+
+ switch (alt14) {
+ case 1 :
+ // InternalSensinact.g:1825:3: rule__DSL_ECA_STATEMENT__ElseIfdoAssignment_1
+ {
+ pushFollow(FOLLOW_17);
+ rule__DSL_ECA_STATEMENT__ElseIfdoAssignment_1();
+
+ state._fsp--;
+
+
+ }
+ break;
+
+ default :
+ break loop14;
+ }
+ } while (true);
+
+ after(grammarAccess.getDSL_ECA_STATEMENTAccess().getElseIfdoAssignment_1());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_ECA_STATEMENT__Group__1__Impl"
+
+
+ // $ANTLR start "rule__DSL_ECA_STATEMENT__Group__2"
+ // InternalSensinact.g:1833:1: rule__DSL_ECA_STATEMENT__Group__2 : rule__DSL_ECA_STATEMENT__Group__2__Impl rule__DSL_ECA_STATEMENT__Group__3 ;
+ public final void rule__DSL_ECA_STATEMENT__Group__2() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:1837:1: ( rule__DSL_ECA_STATEMENT__Group__2__Impl rule__DSL_ECA_STATEMENT__Group__3 )
+ // InternalSensinact.g:1838:2: rule__DSL_ECA_STATEMENT__Group__2__Impl rule__DSL_ECA_STATEMENT__Group__3
+ {
+ pushFollow(FOLLOW_16);
+ rule__DSL_ECA_STATEMENT__Group__2__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_ECA_STATEMENT__Group__3();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_ECA_STATEMENT__Group__2"
+
+
+ // $ANTLR start "rule__DSL_ECA_STATEMENT__Group__2__Impl"
+ // InternalSensinact.g:1845:1: rule__DSL_ECA_STATEMENT__Group__2__Impl : ( ( rule__DSL_ECA_STATEMENT__ElsedoAssignment_2 )? ) ;
+ public final void rule__DSL_ECA_STATEMENT__Group__2__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:1849:1: ( ( ( rule__DSL_ECA_STATEMENT__ElsedoAssignment_2 )? ) )
+ // InternalSensinact.g:1850:1: ( ( rule__DSL_ECA_STATEMENT__ElsedoAssignment_2 )? )
+ {
+ // InternalSensinact.g:1850:1: ( ( rule__DSL_ECA_STATEMENT__ElsedoAssignment_2 )? )
+ // InternalSensinact.g:1851:2: ( rule__DSL_ECA_STATEMENT__ElsedoAssignment_2 )?
+ {
+ before(grammarAccess.getDSL_ECA_STATEMENTAccess().getElsedoAssignment_2());
+ // InternalSensinact.g:1852:2: ( rule__DSL_ECA_STATEMENT__ElsedoAssignment_2 )?
+ int alt15=2;
+ int LA15_0 = input.LA(1);
+
+ if ( (LA15_0==25) ) {
+ alt15=1;
+ }
+ switch (alt15) {
+ case 1 :
+ // InternalSensinact.g:1852:3: rule__DSL_ECA_STATEMENT__ElsedoAssignment_2
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_ECA_STATEMENT__ElsedoAssignment_2();
+
+ state._fsp--;
+
+
+ }
+ break;
+
+ }
+
+ after(grammarAccess.getDSL_ECA_STATEMENTAccess().getElsedoAssignment_2());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_ECA_STATEMENT__Group__2__Impl"
+
+
+ // $ANTLR start "rule__DSL_ECA_STATEMENT__Group__3"
+ // InternalSensinact.g:1860:1: rule__DSL_ECA_STATEMENT__Group__3 : rule__DSL_ECA_STATEMENT__Group__3__Impl ;
+ public final void rule__DSL_ECA_STATEMENT__Group__3() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:1864:1: ( rule__DSL_ECA_STATEMENT__Group__3__Impl )
+ // InternalSensinact.g:1865:2: rule__DSL_ECA_STATEMENT__Group__3__Impl
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_ECA_STATEMENT__Group__3__Impl();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_ECA_STATEMENT__Group__3"
+
+
+ // $ANTLR start "rule__DSL_ECA_STATEMENT__Group__3__Impl"
+ // InternalSensinact.g:1871:1: rule__DSL_ECA_STATEMENT__Group__3__Impl : ( 'end if' ) ;
+ public final void rule__DSL_ECA_STATEMENT__Group__3__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:1875:1: ( ( 'end if' ) )
+ // InternalSensinact.g:1876:1: ( 'end if' )
+ {
+ // InternalSensinact.g:1876:1: ( 'end if' )
+ // InternalSensinact.g:1877:2: 'end if'
+ {
+ before(grammarAccess.getDSL_ECA_STATEMENTAccess().getEndIfKeyword_3());
+ match(input,21,FOLLOW_2);
+ after(grammarAccess.getDSL_ECA_STATEMENTAccess().getEndIfKeyword_3());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_ECA_STATEMENT__Group__3__Impl"
+
+
+ // $ANTLR start "rule__DSL_IfDo__Group__0"
+ // InternalSensinact.g:1887:1: rule__DSL_IfDo__Group__0 : rule__DSL_IfDo__Group__0__Impl rule__DSL_IfDo__Group__1 ;
+ public final void rule__DSL_IfDo__Group__0() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:1891:1: ( rule__DSL_IfDo__Group__0__Impl rule__DSL_IfDo__Group__1 )
+ // InternalSensinact.g:1892:2: rule__DSL_IfDo__Group__0__Impl rule__DSL_IfDo__Group__1
+ {
+ pushFollow(FOLLOW_18);
+ rule__DSL_IfDo__Group__0__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_IfDo__Group__1();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_IfDo__Group__0"
+
+
+ // $ANTLR start "rule__DSL_IfDo__Group__0__Impl"
+ // InternalSensinact.g:1899:1: rule__DSL_IfDo__Group__0__Impl : ( 'if' ) ;
+ public final void rule__DSL_IfDo__Group__0__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:1903:1: ( ( 'if' ) )
+ // InternalSensinact.g:1904:1: ( 'if' )
+ {
+ // InternalSensinact.g:1904:1: ( 'if' )
+ // InternalSensinact.g:1905:2: 'if'
+ {
+ before(grammarAccess.getDSL_IfDoAccess().getIfKeyword_0());
+ match(input,22,FOLLOW_2);
+ after(grammarAccess.getDSL_IfDoAccess().getIfKeyword_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_IfDo__Group__0__Impl"
+
+
+ // $ANTLR start "rule__DSL_IfDo__Group__1"
+ // InternalSensinact.g:1914:1: rule__DSL_IfDo__Group__1 : rule__DSL_IfDo__Group__1__Impl rule__DSL_IfDo__Group__2 ;
+ public final void rule__DSL_IfDo__Group__1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:1918:1: ( rule__DSL_IfDo__Group__1__Impl rule__DSL_IfDo__Group__2 )
+ // InternalSensinact.g:1919:2: rule__DSL_IfDo__Group__1__Impl rule__DSL_IfDo__Group__2
+ {
+ pushFollow(FOLLOW_19);
+ rule__DSL_IfDo__Group__1__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_IfDo__Group__2();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_IfDo__Group__1"
+
+
+ // $ANTLR start "rule__DSL_IfDo__Group__1__Impl"
+ // InternalSensinact.g:1926:1: rule__DSL_IfDo__Group__1__Impl : ( ( rule__DSL_IfDo__ConditionAssignment_1 ) ) ;
+ public final void rule__DSL_IfDo__Group__1__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:1930:1: ( ( ( rule__DSL_IfDo__ConditionAssignment_1 ) ) )
+ // InternalSensinact.g:1931:1: ( ( rule__DSL_IfDo__ConditionAssignment_1 ) )
+ {
+ // InternalSensinact.g:1931:1: ( ( rule__DSL_IfDo__ConditionAssignment_1 ) )
+ // InternalSensinact.g:1932:2: ( rule__DSL_IfDo__ConditionAssignment_1 )
+ {
+ before(grammarAccess.getDSL_IfDoAccess().getConditionAssignment_1());
+ // InternalSensinact.g:1933:2: ( rule__DSL_IfDo__ConditionAssignment_1 )
+ // InternalSensinact.g:1933:3: rule__DSL_IfDo__ConditionAssignment_1
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_IfDo__ConditionAssignment_1();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_IfDoAccess().getConditionAssignment_1());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_IfDo__Group__1__Impl"
+
+
+ // $ANTLR start "rule__DSL_IfDo__Group__2"
+ // InternalSensinact.g:1941:1: rule__DSL_IfDo__Group__2 : rule__DSL_IfDo__Group__2__Impl rule__DSL_IfDo__Group__3 ;
+ public final void rule__DSL_IfDo__Group__2() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:1945:1: ( rule__DSL_IfDo__Group__2__Impl rule__DSL_IfDo__Group__3 )
+ // InternalSensinact.g:1946:2: rule__DSL_IfDo__Group__2__Impl rule__DSL_IfDo__Group__3
+ {
+ pushFollow(FOLLOW_9);
+ rule__DSL_IfDo__Group__2__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_IfDo__Group__3();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_IfDo__Group__2"
+
+
+ // $ANTLR start "rule__DSL_IfDo__Group__2__Impl"
+ // InternalSensinact.g:1953:1: rule__DSL_IfDo__Group__2__Impl : ( 'do' ) ;
+ public final void rule__DSL_IfDo__Group__2__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:1957:1: ( ( 'do' ) )
+ // InternalSensinact.g:1958:1: ( 'do' )
+ {
+ // InternalSensinact.g:1958:1: ( 'do' )
+ // InternalSensinact.g:1959:2: 'do'
+ {
+ before(grammarAccess.getDSL_IfDoAccess().getDoKeyword_2());
+ match(input,23,FOLLOW_2);
+ after(grammarAccess.getDSL_IfDoAccess().getDoKeyword_2());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_IfDo__Group__2__Impl"
+
+
+ // $ANTLR start "rule__DSL_IfDo__Group__3"
+ // InternalSensinact.g:1968:1: rule__DSL_IfDo__Group__3 : rule__DSL_IfDo__Group__3__Impl ;
+ public final void rule__DSL_IfDo__Group__3() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:1972:1: ( rule__DSL_IfDo__Group__3__Impl )
+ // InternalSensinact.g:1973:2: rule__DSL_IfDo__Group__3__Impl
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_IfDo__Group__3__Impl();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_IfDo__Group__3"
+
+
+ // $ANTLR start "rule__DSL_IfDo__Group__3__Impl"
+ // InternalSensinact.g:1979:1: rule__DSL_IfDo__Group__3__Impl : ( ( rule__DSL_IfDo__ActionsAssignment_3 ) ) ;
+ public final void rule__DSL_IfDo__Group__3__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:1983:1: ( ( ( rule__DSL_IfDo__ActionsAssignment_3 ) ) )
+ // InternalSensinact.g:1984:1: ( ( rule__DSL_IfDo__ActionsAssignment_3 ) )
+ {
+ // InternalSensinact.g:1984:1: ( ( rule__DSL_IfDo__ActionsAssignment_3 ) )
+ // InternalSensinact.g:1985:2: ( rule__DSL_IfDo__ActionsAssignment_3 )
+ {
+ before(grammarAccess.getDSL_IfDoAccess().getActionsAssignment_3());
+ // InternalSensinact.g:1986:2: ( rule__DSL_IfDo__ActionsAssignment_3 )
+ // InternalSensinact.g:1986:3: rule__DSL_IfDo__ActionsAssignment_3
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_IfDo__ActionsAssignment_3();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_IfDoAccess().getActionsAssignment_3());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_IfDo__Group__3__Impl"
+
+
+ // $ANTLR start "rule__DSL_ElseIfDo__Group__0"
+ // InternalSensinact.g:1995:1: rule__DSL_ElseIfDo__Group__0 : rule__DSL_ElseIfDo__Group__0__Impl rule__DSL_ElseIfDo__Group__1 ;
+ public final void rule__DSL_ElseIfDo__Group__0() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:1999:1: ( rule__DSL_ElseIfDo__Group__0__Impl rule__DSL_ElseIfDo__Group__1 )
+ // InternalSensinact.g:2000:2: rule__DSL_ElseIfDo__Group__0__Impl rule__DSL_ElseIfDo__Group__1
+ {
+ pushFollow(FOLLOW_18);
+ rule__DSL_ElseIfDo__Group__0__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_ElseIfDo__Group__1();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_ElseIfDo__Group__0"
+
+
+ // $ANTLR start "rule__DSL_ElseIfDo__Group__0__Impl"
+ // InternalSensinact.g:2007:1: rule__DSL_ElseIfDo__Group__0__Impl : ( 'else if' ) ;
+ public final void rule__DSL_ElseIfDo__Group__0__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2011:1: ( ( 'else if' ) )
+ // InternalSensinact.g:2012:1: ( 'else if' )
+ {
+ // InternalSensinact.g:2012:1: ( 'else if' )
+ // InternalSensinact.g:2013:2: 'else if'
+ {
+ before(grammarAccess.getDSL_ElseIfDoAccess().getElseIfKeyword_0());
+ match(input,24,FOLLOW_2);
+ after(grammarAccess.getDSL_ElseIfDoAccess().getElseIfKeyword_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_ElseIfDo__Group__0__Impl"
+
+
+ // $ANTLR start "rule__DSL_ElseIfDo__Group__1"
+ // InternalSensinact.g:2022:1: rule__DSL_ElseIfDo__Group__1 : rule__DSL_ElseIfDo__Group__1__Impl rule__DSL_ElseIfDo__Group__2 ;
+ public final void rule__DSL_ElseIfDo__Group__1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2026:1: ( rule__DSL_ElseIfDo__Group__1__Impl rule__DSL_ElseIfDo__Group__2 )
+ // InternalSensinact.g:2027:2: rule__DSL_ElseIfDo__Group__1__Impl rule__DSL_ElseIfDo__Group__2
+ {
+ pushFollow(FOLLOW_19);
+ rule__DSL_ElseIfDo__Group__1__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_ElseIfDo__Group__2();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_ElseIfDo__Group__1"
+
+
+ // $ANTLR start "rule__DSL_ElseIfDo__Group__1__Impl"
+ // InternalSensinact.g:2034:1: rule__DSL_ElseIfDo__Group__1__Impl : ( ( rule__DSL_ElseIfDo__ConditionAssignment_1 ) ) ;
+ public final void rule__DSL_ElseIfDo__Group__1__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2038:1: ( ( ( rule__DSL_ElseIfDo__ConditionAssignment_1 ) ) )
+ // InternalSensinact.g:2039:1: ( ( rule__DSL_ElseIfDo__ConditionAssignment_1 ) )
+ {
+ // InternalSensinact.g:2039:1: ( ( rule__DSL_ElseIfDo__ConditionAssignment_1 ) )
+ // InternalSensinact.g:2040:2: ( rule__DSL_ElseIfDo__ConditionAssignment_1 )
+ {
+ before(grammarAccess.getDSL_ElseIfDoAccess().getConditionAssignment_1());
+ // InternalSensinact.g:2041:2: ( rule__DSL_ElseIfDo__ConditionAssignment_1 )
+ // InternalSensinact.g:2041:3: rule__DSL_ElseIfDo__ConditionAssignment_1
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_ElseIfDo__ConditionAssignment_1();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_ElseIfDoAccess().getConditionAssignment_1());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_ElseIfDo__Group__1__Impl"
+
+
+ // $ANTLR start "rule__DSL_ElseIfDo__Group__2"
+ // InternalSensinact.g:2049:1: rule__DSL_ElseIfDo__Group__2 : rule__DSL_ElseIfDo__Group__2__Impl rule__DSL_ElseIfDo__Group__3 ;
+ public final void rule__DSL_ElseIfDo__Group__2() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2053:1: ( rule__DSL_ElseIfDo__Group__2__Impl rule__DSL_ElseIfDo__Group__3 )
+ // InternalSensinact.g:2054:2: rule__DSL_ElseIfDo__Group__2__Impl rule__DSL_ElseIfDo__Group__3
+ {
+ pushFollow(FOLLOW_9);
+ rule__DSL_ElseIfDo__Group__2__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_ElseIfDo__Group__3();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_ElseIfDo__Group__2"
+
+
+ // $ANTLR start "rule__DSL_ElseIfDo__Group__2__Impl"
+ // InternalSensinact.g:2061:1: rule__DSL_ElseIfDo__Group__2__Impl : ( 'do' ) ;
+ public final void rule__DSL_ElseIfDo__Group__2__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2065:1: ( ( 'do' ) )
+ // InternalSensinact.g:2066:1: ( 'do' )
+ {
+ // InternalSensinact.g:2066:1: ( 'do' )
+ // InternalSensinact.g:2067:2: 'do'
+ {
+ before(grammarAccess.getDSL_ElseIfDoAccess().getDoKeyword_2());
+ match(input,23,FOLLOW_2);
+ after(grammarAccess.getDSL_ElseIfDoAccess().getDoKeyword_2());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_ElseIfDo__Group__2__Impl"
+
+
+ // $ANTLR start "rule__DSL_ElseIfDo__Group__3"
+ // InternalSensinact.g:2076:1: rule__DSL_ElseIfDo__Group__3 : rule__DSL_ElseIfDo__Group__3__Impl ;
+ public final void rule__DSL_ElseIfDo__Group__3() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2080:1: ( rule__DSL_ElseIfDo__Group__3__Impl )
+ // InternalSensinact.g:2081:2: rule__DSL_ElseIfDo__Group__3__Impl
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_ElseIfDo__Group__3__Impl();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_ElseIfDo__Group__3"
+
+
+ // $ANTLR start "rule__DSL_ElseIfDo__Group__3__Impl"
+ // InternalSensinact.g:2087:1: rule__DSL_ElseIfDo__Group__3__Impl : ( ( rule__DSL_ElseIfDo__ActionsAssignment_3 ) ) ;
+ public final void rule__DSL_ElseIfDo__Group__3__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2091:1: ( ( ( rule__DSL_ElseIfDo__ActionsAssignment_3 ) ) )
+ // InternalSensinact.g:2092:1: ( ( rule__DSL_ElseIfDo__ActionsAssignment_3 ) )
+ {
+ // InternalSensinact.g:2092:1: ( ( rule__DSL_ElseIfDo__ActionsAssignment_3 ) )
+ // InternalSensinact.g:2093:2: ( rule__DSL_ElseIfDo__ActionsAssignment_3 )
+ {
+ before(grammarAccess.getDSL_ElseIfDoAccess().getActionsAssignment_3());
+ // InternalSensinact.g:2094:2: ( rule__DSL_ElseIfDo__ActionsAssignment_3 )
+ // InternalSensinact.g:2094:3: rule__DSL_ElseIfDo__ActionsAssignment_3
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_ElseIfDo__ActionsAssignment_3();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_ElseIfDoAccess().getActionsAssignment_3());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_ElseIfDo__Group__3__Impl"
+
+
+ // $ANTLR start "rule__DSL_ElseDo__Group__0"
+ // InternalSensinact.g:2103:1: rule__DSL_ElseDo__Group__0 : rule__DSL_ElseDo__Group__0__Impl rule__DSL_ElseDo__Group__1 ;
+ public final void rule__DSL_ElseDo__Group__0() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2107:1: ( rule__DSL_ElseDo__Group__0__Impl rule__DSL_ElseDo__Group__1 )
+ // InternalSensinact.g:2108:2: rule__DSL_ElseDo__Group__0__Impl rule__DSL_ElseDo__Group__1
+ {
+ pushFollow(FOLLOW_9);
+ rule__DSL_ElseDo__Group__0__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_ElseDo__Group__1();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_ElseDo__Group__0"
+
+
+ // $ANTLR start "rule__DSL_ElseDo__Group__0__Impl"
+ // InternalSensinact.g:2115:1: rule__DSL_ElseDo__Group__0__Impl : ( 'else do' ) ;
+ public final void rule__DSL_ElseDo__Group__0__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2119:1: ( ( 'else do' ) )
+ // InternalSensinact.g:2120:1: ( 'else do' )
+ {
+ // InternalSensinact.g:2120:1: ( 'else do' )
+ // InternalSensinact.g:2121:2: 'else do'
+ {
+ before(grammarAccess.getDSL_ElseDoAccess().getElseDoKeyword_0());
+ match(input,25,FOLLOW_2);
+ after(grammarAccess.getDSL_ElseDoAccess().getElseDoKeyword_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_ElseDo__Group__0__Impl"
+
+
+ // $ANTLR start "rule__DSL_ElseDo__Group__1"
+ // InternalSensinact.g:2130:1: rule__DSL_ElseDo__Group__1 : rule__DSL_ElseDo__Group__1__Impl ;
+ public final void rule__DSL_ElseDo__Group__1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2134:1: ( rule__DSL_ElseDo__Group__1__Impl )
+ // InternalSensinact.g:2135:2: rule__DSL_ElseDo__Group__1__Impl
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_ElseDo__Group__1__Impl();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_ElseDo__Group__1"
+
+
+ // $ANTLR start "rule__DSL_ElseDo__Group__1__Impl"
+ // InternalSensinact.g:2141:1: rule__DSL_ElseDo__Group__1__Impl : ( ( rule__DSL_ElseDo__ActionsAssignment_1 ) ) ;
+ public final void rule__DSL_ElseDo__Group__1__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2145:1: ( ( ( rule__DSL_ElseDo__ActionsAssignment_1 ) ) )
+ // InternalSensinact.g:2146:1: ( ( rule__DSL_ElseDo__ActionsAssignment_1 ) )
+ {
+ // InternalSensinact.g:2146:1: ( ( rule__DSL_ElseDo__ActionsAssignment_1 ) )
+ // InternalSensinact.g:2147:2: ( rule__DSL_ElseDo__ActionsAssignment_1 )
+ {
+ before(grammarAccess.getDSL_ElseDoAccess().getActionsAssignment_1());
+ // InternalSensinact.g:2148:2: ( rule__DSL_ElseDo__ActionsAssignment_1 )
+ // InternalSensinact.g:2148:3: rule__DSL_ElseDo__ActionsAssignment_1
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_ElseDo__ActionsAssignment_1();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_ElseDoAccess().getActionsAssignment_1());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_ElseDo__Group__1__Impl"
+
+
+ // $ANTLR start "rule__NUMBER__Group_1__0"
+ // InternalSensinact.g:2157:1: rule__NUMBER__Group_1__0 : rule__NUMBER__Group_1__0__Impl rule__NUMBER__Group_1__1 ;
+ public final void rule__NUMBER__Group_1__0() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2161:1: ( rule__NUMBER__Group_1__0__Impl rule__NUMBER__Group_1__1 )
+ // InternalSensinact.g:2162:2: rule__NUMBER__Group_1__0__Impl rule__NUMBER__Group_1__1
+ {
+ pushFollow(FOLLOW_20);
+ rule__NUMBER__Group_1__0__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__NUMBER__Group_1__1();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__NUMBER__Group_1__0"
+
+
+ // $ANTLR start "rule__NUMBER__Group_1__0__Impl"
+ // InternalSensinact.g:2169:1: rule__NUMBER__Group_1__0__Impl : ( RULE_INT ) ;
+ public final void rule__NUMBER__Group_1__0__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2173:1: ( ( RULE_INT ) )
+ // InternalSensinact.g:2174:1: ( RULE_INT )
+ {
+ // InternalSensinact.g:2174:1: ( RULE_INT )
+ // InternalSensinact.g:2175:2: RULE_INT
+ {
+ before(grammarAccess.getNUMBERAccess().getINTTerminalRuleCall_1_0());
+ match(input,RULE_INT,FOLLOW_2);
+ after(grammarAccess.getNUMBERAccess().getINTTerminalRuleCall_1_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__NUMBER__Group_1__0__Impl"
+
+
+ // $ANTLR start "rule__NUMBER__Group_1__1"
+ // InternalSensinact.g:2184:1: rule__NUMBER__Group_1__1 : rule__NUMBER__Group_1__1__Impl rule__NUMBER__Group_1__2 ;
+ public final void rule__NUMBER__Group_1__1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2188:1: ( rule__NUMBER__Group_1__1__Impl rule__NUMBER__Group_1__2 )
+ // InternalSensinact.g:2189:2: rule__NUMBER__Group_1__1__Impl rule__NUMBER__Group_1__2
+ {
+ pushFollow(FOLLOW_21);
+ rule__NUMBER__Group_1__1__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__NUMBER__Group_1__2();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__NUMBER__Group_1__1"
+
+
+ // $ANTLR start "rule__NUMBER__Group_1__1__Impl"
+ // InternalSensinact.g:2196:1: rule__NUMBER__Group_1__1__Impl : ( '.' ) ;
+ public final void rule__NUMBER__Group_1__1__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2200:1: ( ( '.' ) )
+ // InternalSensinact.g:2201:1: ( '.' )
+ {
+ // InternalSensinact.g:2201:1: ( '.' )
+ // InternalSensinact.g:2202:2: '.'
+ {
+ before(grammarAccess.getNUMBERAccess().getFullStopKeyword_1_1());
+ match(input,26,FOLLOW_2);
+ after(grammarAccess.getNUMBERAccess().getFullStopKeyword_1_1());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__NUMBER__Group_1__1__Impl"
+
+
+ // $ANTLR start "rule__NUMBER__Group_1__2"
+ // InternalSensinact.g:2211:1: rule__NUMBER__Group_1__2 : rule__NUMBER__Group_1__2__Impl ;
+ public final void rule__NUMBER__Group_1__2() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2215:1: ( rule__NUMBER__Group_1__2__Impl )
+ // InternalSensinact.g:2216:2: rule__NUMBER__Group_1__2__Impl
+ {
+ pushFollow(FOLLOW_2);
+ rule__NUMBER__Group_1__2__Impl();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__NUMBER__Group_1__2"
+
+
+ // $ANTLR start "rule__NUMBER__Group_1__2__Impl"
+ // InternalSensinact.g:2222:1: rule__NUMBER__Group_1__2__Impl : ( RULE_INT ) ;
+ public final void rule__NUMBER__Group_1__2__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2226:1: ( ( RULE_INT ) )
+ // InternalSensinact.g:2227:1: ( RULE_INT )
+ {
+ // InternalSensinact.g:2227:1: ( RULE_INT )
+ // InternalSensinact.g:2228:2: RULE_INT
+ {
+ before(grammarAccess.getNUMBERAccess().getINTTerminalRuleCall_1_2());
+ match(input,RULE_INT,FOLLOW_2);
+ after(grammarAccess.getNUMBERAccess().getINTTerminalRuleCall_1_2());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__NUMBER__Group_1__2__Impl"
+
+
+ // $ANTLR start "rule__EXTENDED_ID__Group__0"
+ // InternalSensinact.g:2238:1: rule__EXTENDED_ID__Group__0 : rule__EXTENDED_ID__Group__0__Impl rule__EXTENDED_ID__Group__1 ;
+ public final void rule__EXTENDED_ID__Group__0() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2242:1: ( rule__EXTENDED_ID__Group__0__Impl rule__EXTENDED_ID__Group__1 )
+ // InternalSensinact.g:2243:2: rule__EXTENDED_ID__Group__0__Impl rule__EXTENDED_ID__Group__1
+ {
+ pushFollow(FOLLOW_20);
+ rule__EXTENDED_ID__Group__0__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__EXTENDED_ID__Group__1();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__EXTENDED_ID__Group__0"
+
+
+ // $ANTLR start "rule__EXTENDED_ID__Group__0__Impl"
+ // InternalSensinact.g:2250:1: rule__EXTENDED_ID__Group__0__Impl : ( RULE_ID ) ;
+ public final void rule__EXTENDED_ID__Group__0__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2254:1: ( ( RULE_ID ) )
+ // InternalSensinact.g:2255:1: ( RULE_ID )
+ {
+ // InternalSensinact.g:2255:1: ( RULE_ID )
+ // InternalSensinact.g:2256:2: RULE_ID
+ {
+ before(grammarAccess.getEXTENDED_IDAccess().getIDTerminalRuleCall_0());
+ match(input,RULE_ID,FOLLOW_2);
+ after(grammarAccess.getEXTENDED_IDAccess().getIDTerminalRuleCall_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__EXTENDED_ID__Group__0__Impl"
+
+
+ // $ANTLR start "rule__EXTENDED_ID__Group__1"
+ // InternalSensinact.g:2265:1: rule__EXTENDED_ID__Group__1 : rule__EXTENDED_ID__Group__1__Impl ;
+ public final void rule__EXTENDED_ID__Group__1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2269:1: ( rule__EXTENDED_ID__Group__1__Impl )
+ // InternalSensinact.g:2270:2: rule__EXTENDED_ID__Group__1__Impl
+ {
+ pushFollow(FOLLOW_2);
+ rule__EXTENDED_ID__Group__1__Impl();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__EXTENDED_ID__Group__1"
+
+
+ // $ANTLR start "rule__EXTENDED_ID__Group__1__Impl"
+ // InternalSensinact.g:2276:1: rule__EXTENDED_ID__Group__1__Impl : ( ( rule__EXTENDED_ID__Group_1__0 )* ) ;
+ public final void rule__EXTENDED_ID__Group__1__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2280:1: ( ( ( rule__EXTENDED_ID__Group_1__0 )* ) )
+ // InternalSensinact.g:2281:1: ( ( rule__EXTENDED_ID__Group_1__0 )* )
+ {
+ // InternalSensinact.g:2281:1: ( ( rule__EXTENDED_ID__Group_1__0 )* )
+ // InternalSensinact.g:2282:2: ( rule__EXTENDED_ID__Group_1__0 )*
+ {
+ before(grammarAccess.getEXTENDED_IDAccess().getGroup_1());
+ // InternalSensinact.g:2283:2: ( rule__EXTENDED_ID__Group_1__0 )*
+ loop16:
+ do {
+ int alt16=2;
+ int LA16_0 = input.LA(1);
+
+ if ( (LA16_0==26) ) {
+ alt16=1;
+ }
+
+
+ switch (alt16) {
+ case 1 :
+ // InternalSensinact.g:2283:3: rule__EXTENDED_ID__Group_1__0
+ {
+ pushFollow(FOLLOW_22);
+ rule__EXTENDED_ID__Group_1__0();
+
+ state._fsp--;
+
+
+ }
+ break;
+
+ default :
+ break loop16;
+ }
+ } while (true);
+
+ after(grammarAccess.getEXTENDED_IDAccess().getGroup_1());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__EXTENDED_ID__Group__1__Impl"
+
+
+ // $ANTLR start "rule__EXTENDED_ID__Group_1__0"
+ // InternalSensinact.g:2292:1: rule__EXTENDED_ID__Group_1__0 : rule__EXTENDED_ID__Group_1__0__Impl rule__EXTENDED_ID__Group_1__1 ;
+ public final void rule__EXTENDED_ID__Group_1__0() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2296:1: ( rule__EXTENDED_ID__Group_1__0__Impl rule__EXTENDED_ID__Group_1__1 )
+ // InternalSensinact.g:2297:2: rule__EXTENDED_ID__Group_1__0__Impl rule__EXTENDED_ID__Group_1__1
+ {
+ pushFollow(FOLLOW_9);
+ rule__EXTENDED_ID__Group_1__0__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__EXTENDED_ID__Group_1__1();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__EXTENDED_ID__Group_1__0"
+
+
+ // $ANTLR start "rule__EXTENDED_ID__Group_1__0__Impl"
+ // InternalSensinact.g:2304:1: rule__EXTENDED_ID__Group_1__0__Impl : ( '.' ) ;
+ public final void rule__EXTENDED_ID__Group_1__0__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2308:1: ( ( '.' ) )
+ // InternalSensinact.g:2309:1: ( '.' )
+ {
+ // InternalSensinact.g:2309:1: ( '.' )
+ // InternalSensinact.g:2310:2: '.'
+ {
+ before(grammarAccess.getEXTENDED_IDAccess().getFullStopKeyword_1_0());
+ match(input,26,FOLLOW_2);
+ after(grammarAccess.getEXTENDED_IDAccess().getFullStopKeyword_1_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__EXTENDED_ID__Group_1__0__Impl"
+
+
+ // $ANTLR start "rule__EXTENDED_ID__Group_1__1"
+ // InternalSensinact.g:2319:1: rule__EXTENDED_ID__Group_1__1 : rule__EXTENDED_ID__Group_1__1__Impl ;
+ public final void rule__EXTENDED_ID__Group_1__1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2323:1: ( rule__EXTENDED_ID__Group_1__1__Impl )
+ // InternalSensinact.g:2324:2: rule__EXTENDED_ID__Group_1__1__Impl
+ {
+ pushFollow(FOLLOW_2);
+ rule__EXTENDED_ID__Group_1__1__Impl();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__EXTENDED_ID__Group_1__1"
+
+
+ // $ANTLR start "rule__EXTENDED_ID__Group_1__1__Impl"
+ // InternalSensinact.g:2330:1: rule__EXTENDED_ID__Group_1__1__Impl : ( RULE_ID ) ;
+ public final void rule__EXTENDED_ID__Group_1__1__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2334:1: ( ( RULE_ID ) )
+ // InternalSensinact.g:2335:1: ( RULE_ID )
+ {
+ // InternalSensinact.g:2335:1: ( RULE_ID )
+ // InternalSensinact.g:2336:2: RULE_ID
+ {
+ before(grammarAccess.getEXTENDED_IDAccess().getIDTerminalRuleCall_1_1());
+ match(input,RULE_ID,FOLLOW_2);
+ after(grammarAccess.getEXTENDED_IDAccess().getIDTerminalRuleCall_1_1());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__EXTENDED_ID__Group_1__1__Impl"
+
+
+ // $ANTLR start "rule__DSL_REF_CONDITION__Group__0"
+ // InternalSensinact.g:2346:1: rule__DSL_REF_CONDITION__Group__0 : rule__DSL_REF_CONDITION__Group__0__Impl rule__DSL_REF_CONDITION__Group__1 ;
+ public final void rule__DSL_REF_CONDITION__Group__0() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2350:1: ( rule__DSL_REF_CONDITION__Group__0__Impl rule__DSL_REF_CONDITION__Group__1 )
+ // InternalSensinact.g:2351:2: rule__DSL_REF_CONDITION__Group__0__Impl rule__DSL_REF_CONDITION__Group__1
+ {
+ pushFollow(FOLLOW_20);
+ rule__DSL_REF_CONDITION__Group__0__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_REF_CONDITION__Group__1();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_REF_CONDITION__Group__0"
+
+
+ // $ANTLR start "rule__DSL_REF_CONDITION__Group__0__Impl"
+ // InternalSensinact.g:2358:1: rule__DSL_REF_CONDITION__Group__0__Impl : ( ( rule__DSL_REF_CONDITION__RefAssignment_0 ) ) ;
+ public final void rule__DSL_REF_CONDITION__Group__0__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2362:1: ( ( ( rule__DSL_REF_CONDITION__RefAssignment_0 ) ) )
+ // InternalSensinact.g:2363:1: ( ( rule__DSL_REF_CONDITION__RefAssignment_0 ) )
+ {
+ // InternalSensinact.g:2363:1: ( ( rule__DSL_REF_CONDITION__RefAssignment_0 ) )
+ // InternalSensinact.g:2364:2: ( rule__DSL_REF_CONDITION__RefAssignment_0 )
+ {
+ before(grammarAccess.getDSL_REF_CONDITIONAccess().getRefAssignment_0());
+ // InternalSensinact.g:2365:2: ( rule__DSL_REF_CONDITION__RefAssignment_0 )
+ // InternalSensinact.g:2365:3: rule__DSL_REF_CONDITION__RefAssignment_0
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_REF_CONDITION__RefAssignment_0();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_REF_CONDITIONAccess().getRefAssignment_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_REF_CONDITION__Group__0__Impl"
+
+
+ // $ANTLR start "rule__DSL_REF_CONDITION__Group__1"
+ // InternalSensinact.g:2373:1: rule__DSL_REF_CONDITION__Group__1 : rule__DSL_REF_CONDITION__Group__1__Impl rule__DSL_REF_CONDITION__Group__2 ;
+ public final void rule__DSL_REF_CONDITION__Group__1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2377:1: ( rule__DSL_REF_CONDITION__Group__1__Impl rule__DSL_REF_CONDITION__Group__2 )
+ // InternalSensinact.g:2378:2: rule__DSL_REF_CONDITION__Group__1__Impl rule__DSL_REF_CONDITION__Group__2
+ {
+ pushFollow(FOLLOW_23);
+ rule__DSL_REF_CONDITION__Group__1__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_REF_CONDITION__Group__2();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_REF_CONDITION__Group__1"
+
+
+ // $ANTLR start "rule__DSL_REF_CONDITION__Group__1__Impl"
+ // InternalSensinact.g:2385:1: rule__DSL_REF_CONDITION__Group__1__Impl : ( '.' ) ;
+ public final void rule__DSL_REF_CONDITION__Group__1__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2389:1: ( ( '.' ) )
+ // InternalSensinact.g:2390:1: ( '.' )
+ {
+ // InternalSensinact.g:2390:1: ( '.' )
+ // InternalSensinact.g:2391:2: '.'
+ {
+ before(grammarAccess.getDSL_REF_CONDITIONAccess().getFullStopKeyword_1());
+ match(input,26,FOLLOW_2);
+ after(grammarAccess.getDSL_REF_CONDITIONAccess().getFullStopKeyword_1());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_REF_CONDITION__Group__1__Impl"
+
+
+ // $ANTLR start "rule__DSL_REF_CONDITION__Group__2"
+ // InternalSensinact.g:2400:1: rule__DSL_REF_CONDITION__Group__2 : rule__DSL_REF_CONDITION__Group__2__Impl rule__DSL_REF_CONDITION__Group__3 ;
+ public final void rule__DSL_REF_CONDITION__Group__2() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2404:1: ( rule__DSL_REF_CONDITION__Group__2__Impl rule__DSL_REF_CONDITION__Group__3 )
+ // InternalSensinact.g:2405:2: rule__DSL_REF_CONDITION__Group__2__Impl rule__DSL_REF_CONDITION__Group__3
+ {
+ pushFollow(FOLLOW_24);
+ rule__DSL_REF_CONDITION__Group__2__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_REF_CONDITION__Group__3();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_REF_CONDITION__Group__2"
+
+
+ // $ANTLR start "rule__DSL_REF_CONDITION__Group__2__Impl"
+ // InternalSensinact.g:2412:1: rule__DSL_REF_CONDITION__Group__2__Impl : ( 'subscribe' ) ;
+ public final void rule__DSL_REF_CONDITION__Group__2__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2416:1: ( ( 'subscribe' ) )
+ // InternalSensinact.g:2417:1: ( 'subscribe' )
+ {
+ // InternalSensinact.g:2417:1: ( 'subscribe' )
+ // InternalSensinact.g:2418:2: 'subscribe'
+ {
+ before(grammarAccess.getDSL_REF_CONDITIONAccess().getSubscribeKeyword_2());
+ match(input,27,FOLLOW_2);
+ after(grammarAccess.getDSL_REF_CONDITIONAccess().getSubscribeKeyword_2());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_REF_CONDITION__Group__2__Impl"
+
+
+ // $ANTLR start "rule__DSL_REF_CONDITION__Group__3"
+ // InternalSensinact.g:2427:1: rule__DSL_REF_CONDITION__Group__3 : rule__DSL_REF_CONDITION__Group__3__Impl rule__DSL_REF_CONDITION__Group__4 ;
+ public final void rule__DSL_REF_CONDITION__Group__3() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2431:1: ( rule__DSL_REF_CONDITION__Group__3__Impl rule__DSL_REF_CONDITION__Group__4 )
+ // InternalSensinact.g:2432:2: rule__DSL_REF_CONDITION__Group__3__Impl rule__DSL_REF_CONDITION__Group__4
+ {
+ pushFollow(FOLLOW_25);
+ rule__DSL_REF_CONDITION__Group__3__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_REF_CONDITION__Group__4();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_REF_CONDITION__Group__3"
+
+
+ // $ANTLR start "rule__DSL_REF_CONDITION__Group__3__Impl"
+ // InternalSensinact.g:2439:1: rule__DSL_REF_CONDITION__Group__3__Impl : ( '(' ) ;
+ public final void rule__DSL_REF_CONDITION__Group__3__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2443:1: ( ( '(' ) )
+ // InternalSensinact.g:2444:1: ( '(' )
+ {
+ // InternalSensinact.g:2444:1: ( '(' )
+ // InternalSensinact.g:2445:2: '('
+ {
+ before(grammarAccess.getDSL_REF_CONDITIONAccess().getLeftParenthesisKeyword_3());
+ match(input,28,FOLLOW_2);
+ after(grammarAccess.getDSL_REF_CONDITIONAccess().getLeftParenthesisKeyword_3());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_REF_CONDITION__Group__3__Impl"
+
+
+ // $ANTLR start "rule__DSL_REF_CONDITION__Group__4"
+ // InternalSensinact.g:2454:1: rule__DSL_REF_CONDITION__Group__4 : rule__DSL_REF_CONDITION__Group__4__Impl ;
+ public final void rule__DSL_REF_CONDITION__Group__4() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2458:1: ( rule__DSL_REF_CONDITION__Group__4__Impl )
+ // InternalSensinact.g:2459:2: rule__DSL_REF_CONDITION__Group__4__Impl
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_REF_CONDITION__Group__4__Impl();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_REF_CONDITION__Group__4"
+
+
+ // $ANTLR start "rule__DSL_REF_CONDITION__Group__4__Impl"
+ // InternalSensinact.g:2465:1: rule__DSL_REF_CONDITION__Group__4__Impl : ( ')' ) ;
+ public final void rule__DSL_REF_CONDITION__Group__4__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2469:1: ( ( ')' ) )
+ // InternalSensinact.g:2470:1: ( ')' )
+ {
+ // InternalSensinact.g:2470:1: ( ')' )
+ // InternalSensinact.g:2471:2: ')'
+ {
+ before(grammarAccess.getDSL_REF_CONDITIONAccess().getRightParenthesisKeyword_4());
+ match(input,29,FOLLOW_2);
+ after(grammarAccess.getDSL_REF_CONDITIONAccess().getRightParenthesisKeyword_4());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_REF_CONDITION__Group__4__Impl"
+
+
+ // $ANTLR start "rule__DSL_CEP_STATEMENT__Group__0"
+ // InternalSensinact.g:2481:1: rule__DSL_CEP_STATEMENT__Group__0 : rule__DSL_CEP_STATEMENT__Group__0__Impl rule__DSL_CEP_STATEMENT__Group__1 ;
+ public final void rule__DSL_CEP_STATEMENT__Group__0() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2485:1: ( rule__DSL_CEP_STATEMENT__Group__0__Impl rule__DSL_CEP_STATEMENT__Group__1 )
+ // InternalSensinact.g:2486:2: rule__DSL_CEP_STATEMENT__Group__0__Impl rule__DSL_CEP_STATEMENT__Group__1
+ {
+ pushFollow(FOLLOW_9);
+ rule__DSL_CEP_STATEMENT__Group__0__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_STATEMENT__Group__1();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_STATEMENT__Group__0"
+
+
+ // $ANTLR start "rule__DSL_CEP_STATEMENT__Group__0__Impl"
+ // InternalSensinact.g:2493:1: rule__DSL_CEP_STATEMENT__Group__0__Impl : ( 'define' ) ;
+ public final void rule__DSL_CEP_STATEMENT__Group__0__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2497:1: ( ( 'define' ) )
+ // InternalSensinact.g:2498:1: ( 'define' )
+ {
+ // InternalSensinact.g:2498:1: ( 'define' )
+ // InternalSensinact.g:2499:2: 'define'
+ {
+ before(grammarAccess.getDSL_CEP_STATEMENTAccess().getDefineKeyword_0());
+ match(input,30,FOLLOW_2);
+ after(grammarAccess.getDSL_CEP_STATEMENTAccess().getDefineKeyword_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_STATEMENT__Group__0__Impl"
+
+
+ // $ANTLR start "rule__DSL_CEP_STATEMENT__Group__1"
+ // InternalSensinact.g:2508:1: rule__DSL_CEP_STATEMENT__Group__1 : rule__DSL_CEP_STATEMENT__Group__1__Impl rule__DSL_CEP_STATEMENT__Group__2 ;
+ public final void rule__DSL_CEP_STATEMENT__Group__1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2512:1: ( rule__DSL_CEP_STATEMENT__Group__1__Impl rule__DSL_CEP_STATEMENT__Group__2 )
+ // InternalSensinact.g:2513:2: rule__DSL_CEP_STATEMENT__Group__1__Impl rule__DSL_CEP_STATEMENT__Group__2
+ {
+ pushFollow(FOLLOW_10);
+ rule__DSL_CEP_STATEMENT__Group__1__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_STATEMENT__Group__2();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_STATEMENT__Group__1"
+
+
+ // $ANTLR start "rule__DSL_CEP_STATEMENT__Group__1__Impl"
+ // InternalSensinact.g:2520:1: rule__DSL_CEP_STATEMENT__Group__1__Impl : ( ( rule__DSL_CEP_STATEMENT__NameAssignment_1 ) ) ;
+ public final void rule__DSL_CEP_STATEMENT__Group__1__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2524:1: ( ( ( rule__DSL_CEP_STATEMENT__NameAssignment_1 ) ) )
+ // InternalSensinact.g:2525:1: ( ( rule__DSL_CEP_STATEMENT__NameAssignment_1 ) )
+ {
+ // InternalSensinact.g:2525:1: ( ( rule__DSL_CEP_STATEMENT__NameAssignment_1 ) )
+ // InternalSensinact.g:2526:2: ( rule__DSL_CEP_STATEMENT__NameAssignment_1 )
+ {
+ before(grammarAccess.getDSL_CEP_STATEMENTAccess().getNameAssignment_1());
+ // InternalSensinact.g:2527:2: ( rule__DSL_CEP_STATEMENT__NameAssignment_1 )
+ // InternalSensinact.g:2527:3: rule__DSL_CEP_STATEMENT__NameAssignment_1
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_STATEMENT__NameAssignment_1();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_CEP_STATEMENTAccess().getNameAssignment_1());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_STATEMENT__Group__1__Impl"
+
+
+ // $ANTLR start "rule__DSL_CEP_STATEMENT__Group__2"
+ // InternalSensinact.g:2535:1: rule__DSL_CEP_STATEMENT__Group__2 : rule__DSL_CEP_STATEMENT__Group__2__Impl rule__DSL_CEP_STATEMENT__Group__3 ;
+ public final void rule__DSL_CEP_STATEMENT__Group__2() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2539:1: ( rule__DSL_CEP_STATEMENT__Group__2__Impl rule__DSL_CEP_STATEMENT__Group__3 )
+ // InternalSensinact.g:2540:2: rule__DSL_CEP_STATEMENT__Group__2__Impl rule__DSL_CEP_STATEMENT__Group__3
+ {
+ pushFollow(FOLLOW_26);
+ rule__DSL_CEP_STATEMENT__Group__2__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_STATEMENT__Group__3();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_STATEMENT__Group__2"
+
+
+ // $ANTLR start "rule__DSL_CEP_STATEMENT__Group__2__Impl"
+ // InternalSensinact.g:2547:1: rule__DSL_CEP_STATEMENT__Group__2__Impl : ( '=' ) ;
+ public final void rule__DSL_CEP_STATEMENT__Group__2__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2551:1: ( ( '=' ) )
+ // InternalSensinact.g:2552:1: ( '=' )
+ {
+ // InternalSensinact.g:2552:1: ( '=' )
+ // InternalSensinact.g:2553:2: '='
+ {
+ before(grammarAccess.getDSL_CEP_STATEMENTAccess().getEqualsSignKeyword_2());
+ match(input,15,FOLLOW_2);
+ after(grammarAccess.getDSL_CEP_STATEMENTAccess().getEqualsSignKeyword_2());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_STATEMENT__Group__2__Impl"
+
+
+ // $ANTLR start "rule__DSL_CEP_STATEMENT__Group__3"
+ // InternalSensinact.g:2562:1: rule__DSL_CEP_STATEMENT__Group__3 : rule__DSL_CEP_STATEMENT__Group__3__Impl ;
+ public final void rule__DSL_CEP_STATEMENT__Group__3() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2566:1: ( rule__DSL_CEP_STATEMENT__Group__3__Impl )
+ // InternalSensinact.g:2567:2: rule__DSL_CEP_STATEMENT__Group__3__Impl
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_STATEMENT__Group__3__Impl();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_STATEMENT__Group__3"
+
+
+ // $ANTLR start "rule__DSL_CEP_STATEMENT__Group__3__Impl"
+ // InternalSensinact.g:2573:1: rule__DSL_CEP_STATEMENT__Group__3__Impl : ( ( rule__DSL_CEP_STATEMENT__OperationAssignment_3 ) ) ;
+ public final void rule__DSL_CEP_STATEMENT__Group__3__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2577:1: ( ( ( rule__DSL_CEP_STATEMENT__OperationAssignment_3 ) ) )
+ // InternalSensinact.g:2578:1: ( ( rule__DSL_CEP_STATEMENT__OperationAssignment_3 ) )
+ {
+ // InternalSensinact.g:2578:1: ( ( rule__DSL_CEP_STATEMENT__OperationAssignment_3 ) )
+ // InternalSensinact.g:2579:2: ( rule__DSL_CEP_STATEMENT__OperationAssignment_3 )
+ {
+ before(grammarAccess.getDSL_CEP_STATEMENTAccess().getOperationAssignment_3());
+ // InternalSensinact.g:2580:2: ( rule__DSL_CEP_STATEMENT__OperationAssignment_3 )
+ // InternalSensinact.g:2580:3: rule__DSL_CEP_STATEMENT__OperationAssignment_3
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_STATEMENT__OperationAssignment_3();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_CEP_STATEMENTAccess().getOperationAssignment_3());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_STATEMENT__Group__3__Impl"
+
+
+ // $ANTLR start "rule__DSL_CEP_AFTER__Group__0"
+ // InternalSensinact.g:2589:1: rule__DSL_CEP_AFTER__Group__0 : rule__DSL_CEP_AFTER__Group__0__Impl rule__DSL_CEP_AFTER__Group__1 ;
+ public final void rule__DSL_CEP_AFTER__Group__0() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2593:1: ( rule__DSL_CEP_AFTER__Group__0__Impl rule__DSL_CEP_AFTER__Group__1 )
+ // InternalSensinact.g:2594:2: rule__DSL_CEP_AFTER__Group__0__Impl rule__DSL_CEP_AFTER__Group__1
+ {
+ pushFollow(FOLLOW_24);
+ rule__DSL_CEP_AFTER__Group__0__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_AFTER__Group__1();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_AFTER__Group__0"
+
+
+ // $ANTLR start "rule__DSL_CEP_AFTER__Group__0__Impl"
+ // InternalSensinact.g:2601:1: rule__DSL_CEP_AFTER__Group__0__Impl : ( 'after' ) ;
+ public final void rule__DSL_CEP_AFTER__Group__0__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2605:1: ( ( 'after' ) )
+ // InternalSensinact.g:2606:1: ( 'after' )
+ {
+ // InternalSensinact.g:2606:1: ( 'after' )
+ // InternalSensinact.g:2607:2: 'after'
+ {
+ before(grammarAccess.getDSL_CEP_AFTERAccess().getAfterKeyword_0());
+ match(input,31,FOLLOW_2);
+ after(grammarAccess.getDSL_CEP_AFTERAccess().getAfterKeyword_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_AFTER__Group__0__Impl"
+
+
+ // $ANTLR start "rule__DSL_CEP_AFTER__Group__1"
+ // InternalSensinact.g:2616:1: rule__DSL_CEP_AFTER__Group__1 : rule__DSL_CEP_AFTER__Group__1__Impl rule__DSL_CEP_AFTER__Group__2 ;
+ public final void rule__DSL_CEP_AFTER__Group__1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2620:1: ( rule__DSL_CEP_AFTER__Group__1__Impl rule__DSL_CEP_AFTER__Group__2 )
+ // InternalSensinact.g:2621:2: rule__DSL_CEP_AFTER__Group__1__Impl rule__DSL_CEP_AFTER__Group__2
+ {
+ pushFollow(FOLLOW_9);
+ rule__DSL_CEP_AFTER__Group__1__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_AFTER__Group__2();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_AFTER__Group__1"
+
+
+ // $ANTLR start "rule__DSL_CEP_AFTER__Group__1__Impl"
+ // InternalSensinact.g:2628:1: rule__DSL_CEP_AFTER__Group__1__Impl : ( '(' ) ;
+ public final void rule__DSL_CEP_AFTER__Group__1__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2632:1: ( ( '(' ) )
+ // InternalSensinact.g:2633:1: ( '(' )
+ {
+ // InternalSensinact.g:2633:1: ( '(' )
+ // InternalSensinact.g:2634:2: '('
+ {
+ before(grammarAccess.getDSL_CEP_AFTERAccess().getLeftParenthesisKeyword_1());
+ match(input,28,FOLLOW_2);
+ after(grammarAccess.getDSL_CEP_AFTERAccess().getLeftParenthesisKeyword_1());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_AFTER__Group__1__Impl"
+
+
+ // $ANTLR start "rule__DSL_CEP_AFTER__Group__2"
+ // InternalSensinact.g:2643:1: rule__DSL_CEP_AFTER__Group__2 : rule__DSL_CEP_AFTER__Group__2__Impl rule__DSL_CEP_AFTER__Group__3 ;
+ public final void rule__DSL_CEP_AFTER__Group__2() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2647:1: ( rule__DSL_CEP_AFTER__Group__2__Impl rule__DSL_CEP_AFTER__Group__3 )
+ // InternalSensinact.g:2648:2: rule__DSL_CEP_AFTER__Group__2__Impl rule__DSL_CEP_AFTER__Group__3
+ {
+ pushFollow(FOLLOW_14);
+ rule__DSL_CEP_AFTER__Group__2__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_AFTER__Group__3();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_AFTER__Group__2"
+
+
+ // $ANTLR start "rule__DSL_CEP_AFTER__Group__2__Impl"
+ // InternalSensinact.g:2655:1: rule__DSL_CEP_AFTER__Group__2__Impl : ( ( rule__DSL_CEP_AFTER__Ref1Assignment_2 ) ) ;
+ public final void rule__DSL_CEP_AFTER__Group__2__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2659:1: ( ( ( rule__DSL_CEP_AFTER__Ref1Assignment_2 ) ) )
+ // InternalSensinact.g:2660:1: ( ( rule__DSL_CEP_AFTER__Ref1Assignment_2 ) )
+ {
+ // InternalSensinact.g:2660:1: ( ( rule__DSL_CEP_AFTER__Ref1Assignment_2 ) )
+ // InternalSensinact.g:2661:2: ( rule__DSL_CEP_AFTER__Ref1Assignment_2 )
+ {
+ before(grammarAccess.getDSL_CEP_AFTERAccess().getRef1Assignment_2());
+ // InternalSensinact.g:2662:2: ( rule__DSL_CEP_AFTER__Ref1Assignment_2 )
+ // InternalSensinact.g:2662:3: rule__DSL_CEP_AFTER__Ref1Assignment_2
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_AFTER__Ref1Assignment_2();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_CEP_AFTERAccess().getRef1Assignment_2());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_AFTER__Group__2__Impl"
+
+
+ // $ANTLR start "rule__DSL_CEP_AFTER__Group__3"
+ // InternalSensinact.g:2670:1: rule__DSL_CEP_AFTER__Group__3 : rule__DSL_CEP_AFTER__Group__3__Impl rule__DSL_CEP_AFTER__Group__4 ;
+ public final void rule__DSL_CEP_AFTER__Group__3() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2674:1: ( rule__DSL_CEP_AFTER__Group__3__Impl rule__DSL_CEP_AFTER__Group__4 )
+ // InternalSensinact.g:2675:2: rule__DSL_CEP_AFTER__Group__3__Impl rule__DSL_CEP_AFTER__Group__4
+ {
+ pushFollow(FOLLOW_9);
+ rule__DSL_CEP_AFTER__Group__3__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_AFTER__Group__4();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_AFTER__Group__3"
+
+
+ // $ANTLR start "rule__DSL_CEP_AFTER__Group__3__Impl"
+ // InternalSensinact.g:2682:1: rule__DSL_CEP_AFTER__Group__3__Impl : ( ',' ) ;
+ public final void rule__DSL_CEP_AFTER__Group__3__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2686:1: ( ( ',' ) )
+ // InternalSensinact.g:2687:1: ( ',' )
+ {
+ // InternalSensinact.g:2687:1: ( ',' )
+ // InternalSensinact.g:2688:2: ','
+ {
+ before(grammarAccess.getDSL_CEP_AFTERAccess().getCommaKeyword_3());
+ match(input,20,FOLLOW_2);
+ after(grammarAccess.getDSL_CEP_AFTERAccess().getCommaKeyword_3());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_AFTER__Group__3__Impl"
+
+
+ // $ANTLR start "rule__DSL_CEP_AFTER__Group__4"
+ // InternalSensinact.g:2697:1: rule__DSL_CEP_AFTER__Group__4 : rule__DSL_CEP_AFTER__Group__4__Impl rule__DSL_CEP_AFTER__Group__5 ;
+ public final void rule__DSL_CEP_AFTER__Group__4() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2701:1: ( rule__DSL_CEP_AFTER__Group__4__Impl rule__DSL_CEP_AFTER__Group__5 )
+ // InternalSensinact.g:2702:2: rule__DSL_CEP_AFTER__Group__4__Impl rule__DSL_CEP_AFTER__Group__5
+ {
+ pushFollow(FOLLOW_14);
+ rule__DSL_CEP_AFTER__Group__4__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_AFTER__Group__5();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_AFTER__Group__4"
+
+
+ // $ANTLR start "rule__DSL_CEP_AFTER__Group__4__Impl"
+ // InternalSensinact.g:2709:1: rule__DSL_CEP_AFTER__Group__4__Impl : ( ( rule__DSL_CEP_AFTER__Ref2Assignment_4 ) ) ;
+ public final void rule__DSL_CEP_AFTER__Group__4__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2713:1: ( ( ( rule__DSL_CEP_AFTER__Ref2Assignment_4 ) ) )
+ // InternalSensinact.g:2714:1: ( ( rule__DSL_CEP_AFTER__Ref2Assignment_4 ) )
+ {
+ // InternalSensinact.g:2714:1: ( ( rule__DSL_CEP_AFTER__Ref2Assignment_4 ) )
+ // InternalSensinact.g:2715:2: ( rule__DSL_CEP_AFTER__Ref2Assignment_4 )
+ {
+ before(grammarAccess.getDSL_CEP_AFTERAccess().getRef2Assignment_4());
+ // InternalSensinact.g:2716:2: ( rule__DSL_CEP_AFTER__Ref2Assignment_4 )
+ // InternalSensinact.g:2716:3: rule__DSL_CEP_AFTER__Ref2Assignment_4
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_AFTER__Ref2Assignment_4();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_CEP_AFTERAccess().getRef2Assignment_4());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_AFTER__Group__4__Impl"
+
+
+ // $ANTLR start "rule__DSL_CEP_AFTER__Group__5"
+ // InternalSensinact.g:2724:1: rule__DSL_CEP_AFTER__Group__5 : rule__DSL_CEP_AFTER__Group__5__Impl rule__DSL_CEP_AFTER__Group__6 ;
+ public final void rule__DSL_CEP_AFTER__Group__5() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2728:1: ( rule__DSL_CEP_AFTER__Group__5__Impl rule__DSL_CEP_AFTER__Group__6 )
+ // InternalSensinact.g:2729:2: rule__DSL_CEP_AFTER__Group__5__Impl rule__DSL_CEP_AFTER__Group__6
+ {
+ pushFollow(FOLLOW_21);
+ rule__DSL_CEP_AFTER__Group__5__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_AFTER__Group__6();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_AFTER__Group__5"
+
+
+ // $ANTLR start "rule__DSL_CEP_AFTER__Group__5__Impl"
+ // InternalSensinact.g:2736:1: rule__DSL_CEP_AFTER__Group__5__Impl : ( ',' ) ;
+ public final void rule__DSL_CEP_AFTER__Group__5__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2740:1: ( ( ',' ) )
+ // InternalSensinact.g:2741:1: ( ',' )
+ {
+ // InternalSensinact.g:2741:1: ( ',' )
+ // InternalSensinact.g:2742:2: ','
+ {
+ before(grammarAccess.getDSL_CEP_AFTERAccess().getCommaKeyword_5());
+ match(input,20,FOLLOW_2);
+ after(grammarAccess.getDSL_CEP_AFTERAccess().getCommaKeyword_5());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_AFTER__Group__5__Impl"
+
+
+ // $ANTLR start "rule__DSL_CEP_AFTER__Group__6"
+ // InternalSensinact.g:2751:1: rule__DSL_CEP_AFTER__Group__6 : rule__DSL_CEP_AFTER__Group__6__Impl rule__DSL_CEP_AFTER__Group__7 ;
+ public final void rule__DSL_CEP_AFTER__Group__6() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2755:1: ( rule__DSL_CEP_AFTER__Group__6__Impl rule__DSL_CEP_AFTER__Group__7 )
+ // InternalSensinact.g:2756:2: rule__DSL_CEP_AFTER__Group__6__Impl rule__DSL_CEP_AFTER__Group__7
+ {
+ pushFollow(FOLLOW_21);
+ rule__DSL_CEP_AFTER__Group__6__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_AFTER__Group__7();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_AFTER__Group__6"
+
+
+ // $ANTLR start "rule__DSL_CEP_AFTER__Group__6__Impl"
+ // InternalSensinact.g:2763:1: rule__DSL_CEP_AFTER__Group__6__Impl : ( ( rule__DSL_CEP_AFTER__Group_6__0 )? ) ;
+ public final void rule__DSL_CEP_AFTER__Group__6__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2767:1: ( ( ( rule__DSL_CEP_AFTER__Group_6__0 )? ) )
+ // InternalSensinact.g:2768:1: ( ( rule__DSL_CEP_AFTER__Group_6__0 )? )
+ {
+ // InternalSensinact.g:2768:1: ( ( rule__DSL_CEP_AFTER__Group_6__0 )? )
+ // InternalSensinact.g:2769:2: ( rule__DSL_CEP_AFTER__Group_6__0 )?
+ {
+ before(grammarAccess.getDSL_CEP_AFTERAccess().getGroup_6());
+ // InternalSensinact.g:2770:2: ( rule__DSL_CEP_AFTER__Group_6__0 )?
+ int alt17=2;
+ alt17 = dfa17.predict(input);
+ switch (alt17) {
+ case 1 :
+ // InternalSensinact.g:2770:3: rule__DSL_CEP_AFTER__Group_6__0
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_AFTER__Group_6__0();
+
+ state._fsp--;
+
+
+ }
+ break;
+
+ }
+
+ after(grammarAccess.getDSL_CEP_AFTERAccess().getGroup_6());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_AFTER__Group__6__Impl"
+
+
+ // $ANTLR start "rule__DSL_CEP_AFTER__Group__7"
+ // InternalSensinact.g:2778:1: rule__DSL_CEP_AFTER__Group__7 : rule__DSL_CEP_AFTER__Group__7__Impl rule__DSL_CEP_AFTER__Group__8 ;
+ public final void rule__DSL_CEP_AFTER__Group__7() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2782:1: ( rule__DSL_CEP_AFTER__Group__7__Impl rule__DSL_CEP_AFTER__Group__8 )
+ // InternalSensinact.g:2783:2: rule__DSL_CEP_AFTER__Group__7__Impl rule__DSL_CEP_AFTER__Group__8
+ {
+ pushFollow(FOLLOW_25);
+ rule__DSL_CEP_AFTER__Group__7__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_AFTER__Group__8();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_AFTER__Group__7"
+
+
+ // $ANTLR start "rule__DSL_CEP_AFTER__Group__7__Impl"
+ // InternalSensinact.g:2790:1: rule__DSL_CEP_AFTER__Group__7__Impl : ( ( rule__DSL_CEP_AFTER__EndAssignment_7 ) ) ;
+ public final void rule__DSL_CEP_AFTER__Group__7__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2794:1: ( ( ( rule__DSL_CEP_AFTER__EndAssignment_7 ) ) )
+ // InternalSensinact.g:2795:1: ( ( rule__DSL_CEP_AFTER__EndAssignment_7 ) )
+ {
+ // InternalSensinact.g:2795:1: ( ( rule__DSL_CEP_AFTER__EndAssignment_7 ) )
+ // InternalSensinact.g:2796:2: ( rule__DSL_CEP_AFTER__EndAssignment_7 )
+ {
+ before(grammarAccess.getDSL_CEP_AFTERAccess().getEndAssignment_7());
+ // InternalSensinact.g:2797:2: ( rule__DSL_CEP_AFTER__EndAssignment_7 )
+ // InternalSensinact.g:2797:3: rule__DSL_CEP_AFTER__EndAssignment_7
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_AFTER__EndAssignment_7();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_CEP_AFTERAccess().getEndAssignment_7());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_AFTER__Group__7__Impl"
+
+
+ // $ANTLR start "rule__DSL_CEP_AFTER__Group__8"
+ // InternalSensinact.g:2805:1: rule__DSL_CEP_AFTER__Group__8 : rule__DSL_CEP_AFTER__Group__8__Impl ;
+ public final void rule__DSL_CEP_AFTER__Group__8() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2809:1: ( rule__DSL_CEP_AFTER__Group__8__Impl )
+ // InternalSensinact.g:2810:2: rule__DSL_CEP_AFTER__Group__8__Impl
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_AFTER__Group__8__Impl();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_AFTER__Group__8"
+
+
+ // $ANTLR start "rule__DSL_CEP_AFTER__Group__8__Impl"
+ // InternalSensinact.g:2816:1: rule__DSL_CEP_AFTER__Group__8__Impl : ( ')' ) ;
+ public final void rule__DSL_CEP_AFTER__Group__8__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2820:1: ( ( ')' ) )
+ // InternalSensinact.g:2821:1: ( ')' )
+ {
+ // InternalSensinact.g:2821:1: ( ')' )
+ // InternalSensinact.g:2822:2: ')'
+ {
+ before(grammarAccess.getDSL_CEP_AFTERAccess().getRightParenthesisKeyword_8());
+ match(input,29,FOLLOW_2);
+ after(grammarAccess.getDSL_CEP_AFTERAccess().getRightParenthesisKeyword_8());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_AFTER__Group__8__Impl"
+
+
+ // $ANTLR start "rule__DSL_CEP_AFTER__Group_6__0"
+ // InternalSensinact.g:2832:1: rule__DSL_CEP_AFTER__Group_6__0 : rule__DSL_CEP_AFTER__Group_6__0__Impl rule__DSL_CEP_AFTER__Group_6__1 ;
+ public final void rule__DSL_CEP_AFTER__Group_6__0() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2836:1: ( rule__DSL_CEP_AFTER__Group_6__0__Impl rule__DSL_CEP_AFTER__Group_6__1 )
+ // InternalSensinact.g:2837:2: rule__DSL_CEP_AFTER__Group_6__0__Impl rule__DSL_CEP_AFTER__Group_6__1
+ {
+ pushFollow(FOLLOW_14);
+ rule__DSL_CEP_AFTER__Group_6__0__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_AFTER__Group_6__1();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_AFTER__Group_6__0"
+
+
+ // $ANTLR start "rule__DSL_CEP_AFTER__Group_6__0__Impl"
+ // InternalSensinact.g:2844:1: rule__DSL_CEP_AFTER__Group_6__0__Impl : ( ( rule__DSL_CEP_AFTER__StartAssignment_6_0 ) ) ;
+ public final void rule__DSL_CEP_AFTER__Group_6__0__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2848:1: ( ( ( rule__DSL_CEP_AFTER__StartAssignment_6_0 ) ) )
+ // InternalSensinact.g:2849:1: ( ( rule__DSL_CEP_AFTER__StartAssignment_6_0 ) )
+ {
+ // InternalSensinact.g:2849:1: ( ( rule__DSL_CEP_AFTER__StartAssignment_6_0 ) )
+ // InternalSensinact.g:2850:2: ( rule__DSL_CEP_AFTER__StartAssignment_6_0 )
+ {
+ before(grammarAccess.getDSL_CEP_AFTERAccess().getStartAssignment_6_0());
+ // InternalSensinact.g:2851:2: ( rule__DSL_CEP_AFTER__StartAssignment_6_0 )
+ // InternalSensinact.g:2851:3: rule__DSL_CEP_AFTER__StartAssignment_6_0
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_AFTER__StartAssignment_6_0();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_CEP_AFTERAccess().getStartAssignment_6_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_AFTER__Group_6__0__Impl"
+
+
+ // $ANTLR start "rule__DSL_CEP_AFTER__Group_6__1"
+ // InternalSensinact.g:2859:1: rule__DSL_CEP_AFTER__Group_6__1 : rule__DSL_CEP_AFTER__Group_6__1__Impl ;
+ public final void rule__DSL_CEP_AFTER__Group_6__1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2863:1: ( rule__DSL_CEP_AFTER__Group_6__1__Impl )
+ // InternalSensinact.g:2864:2: rule__DSL_CEP_AFTER__Group_6__1__Impl
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_AFTER__Group_6__1__Impl();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_AFTER__Group_6__1"
+
+
+ // $ANTLR start "rule__DSL_CEP_AFTER__Group_6__1__Impl"
+ // InternalSensinact.g:2870:1: rule__DSL_CEP_AFTER__Group_6__1__Impl : ( ',' ) ;
+ public final void rule__DSL_CEP_AFTER__Group_6__1__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2874:1: ( ( ',' ) )
+ // InternalSensinact.g:2875:1: ( ',' )
+ {
+ // InternalSensinact.g:2875:1: ( ',' )
+ // InternalSensinact.g:2876:2: ','
+ {
+ before(grammarAccess.getDSL_CEP_AFTERAccess().getCommaKeyword_6_1());
+ match(input,20,FOLLOW_2);
+ after(grammarAccess.getDSL_CEP_AFTERAccess().getCommaKeyword_6_1());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_AFTER__Group_6__1__Impl"
+
+
+ // $ANTLR start "rule__DSL_CEP_BEFORE__Group__0"
+ // InternalSensinact.g:2886:1: rule__DSL_CEP_BEFORE__Group__0 : rule__DSL_CEP_BEFORE__Group__0__Impl rule__DSL_CEP_BEFORE__Group__1 ;
+ public final void rule__DSL_CEP_BEFORE__Group__0() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2890:1: ( rule__DSL_CEP_BEFORE__Group__0__Impl rule__DSL_CEP_BEFORE__Group__1 )
+ // InternalSensinact.g:2891:2: rule__DSL_CEP_BEFORE__Group__0__Impl rule__DSL_CEP_BEFORE__Group__1
+ {
+ pushFollow(FOLLOW_24);
+ rule__DSL_CEP_BEFORE__Group__0__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_BEFORE__Group__1();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_BEFORE__Group__0"
+
+
+ // $ANTLR start "rule__DSL_CEP_BEFORE__Group__0__Impl"
+ // InternalSensinact.g:2898:1: rule__DSL_CEP_BEFORE__Group__0__Impl : ( 'before' ) ;
+ public final void rule__DSL_CEP_BEFORE__Group__0__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2902:1: ( ( 'before' ) )
+ // InternalSensinact.g:2903:1: ( 'before' )
+ {
+ // InternalSensinact.g:2903:1: ( 'before' )
+ // InternalSensinact.g:2904:2: 'before'
+ {
+ before(grammarAccess.getDSL_CEP_BEFOREAccess().getBeforeKeyword_0());
+ match(input,32,FOLLOW_2);
+ after(grammarAccess.getDSL_CEP_BEFOREAccess().getBeforeKeyword_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_BEFORE__Group__0__Impl"
+
+
+ // $ANTLR start "rule__DSL_CEP_BEFORE__Group__1"
+ // InternalSensinact.g:2913:1: rule__DSL_CEP_BEFORE__Group__1 : rule__DSL_CEP_BEFORE__Group__1__Impl rule__DSL_CEP_BEFORE__Group__2 ;
+ public final void rule__DSL_CEP_BEFORE__Group__1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2917:1: ( rule__DSL_CEP_BEFORE__Group__1__Impl rule__DSL_CEP_BEFORE__Group__2 )
+ // InternalSensinact.g:2918:2: rule__DSL_CEP_BEFORE__Group__1__Impl rule__DSL_CEP_BEFORE__Group__2
+ {
+ pushFollow(FOLLOW_9);
+ rule__DSL_CEP_BEFORE__Group__1__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_BEFORE__Group__2();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_BEFORE__Group__1"
+
+
+ // $ANTLR start "rule__DSL_CEP_BEFORE__Group__1__Impl"
+ // InternalSensinact.g:2925:1: rule__DSL_CEP_BEFORE__Group__1__Impl : ( '(' ) ;
+ public final void rule__DSL_CEP_BEFORE__Group__1__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2929:1: ( ( '(' ) )
+ // InternalSensinact.g:2930:1: ( '(' )
+ {
+ // InternalSensinact.g:2930:1: ( '(' )
+ // InternalSensinact.g:2931:2: '('
+ {
+ before(grammarAccess.getDSL_CEP_BEFOREAccess().getLeftParenthesisKeyword_1());
+ match(input,28,FOLLOW_2);
+ after(grammarAccess.getDSL_CEP_BEFOREAccess().getLeftParenthesisKeyword_1());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_BEFORE__Group__1__Impl"
+
+
+ // $ANTLR start "rule__DSL_CEP_BEFORE__Group__2"
+ // InternalSensinact.g:2940:1: rule__DSL_CEP_BEFORE__Group__2 : rule__DSL_CEP_BEFORE__Group__2__Impl rule__DSL_CEP_BEFORE__Group__3 ;
+ public final void rule__DSL_CEP_BEFORE__Group__2() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2944:1: ( rule__DSL_CEP_BEFORE__Group__2__Impl rule__DSL_CEP_BEFORE__Group__3 )
+ // InternalSensinact.g:2945:2: rule__DSL_CEP_BEFORE__Group__2__Impl rule__DSL_CEP_BEFORE__Group__3
+ {
+ pushFollow(FOLLOW_14);
+ rule__DSL_CEP_BEFORE__Group__2__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_BEFORE__Group__3();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_BEFORE__Group__2"
+
+
+ // $ANTLR start "rule__DSL_CEP_BEFORE__Group__2__Impl"
+ // InternalSensinact.g:2952:1: rule__DSL_CEP_BEFORE__Group__2__Impl : ( ( rule__DSL_CEP_BEFORE__Ref1Assignment_2 ) ) ;
+ public final void rule__DSL_CEP_BEFORE__Group__2__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2956:1: ( ( ( rule__DSL_CEP_BEFORE__Ref1Assignment_2 ) ) )
+ // InternalSensinact.g:2957:1: ( ( rule__DSL_CEP_BEFORE__Ref1Assignment_2 ) )
+ {
+ // InternalSensinact.g:2957:1: ( ( rule__DSL_CEP_BEFORE__Ref1Assignment_2 ) )
+ // InternalSensinact.g:2958:2: ( rule__DSL_CEP_BEFORE__Ref1Assignment_2 )
+ {
+ before(grammarAccess.getDSL_CEP_BEFOREAccess().getRef1Assignment_2());
+ // InternalSensinact.g:2959:2: ( rule__DSL_CEP_BEFORE__Ref1Assignment_2 )
+ // InternalSensinact.g:2959:3: rule__DSL_CEP_BEFORE__Ref1Assignment_2
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_BEFORE__Ref1Assignment_2();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_CEP_BEFOREAccess().getRef1Assignment_2());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_BEFORE__Group__2__Impl"
+
+
+ // $ANTLR start "rule__DSL_CEP_BEFORE__Group__3"
+ // InternalSensinact.g:2967:1: rule__DSL_CEP_BEFORE__Group__3 : rule__DSL_CEP_BEFORE__Group__3__Impl rule__DSL_CEP_BEFORE__Group__4 ;
+ public final void rule__DSL_CEP_BEFORE__Group__3() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2971:1: ( rule__DSL_CEP_BEFORE__Group__3__Impl rule__DSL_CEP_BEFORE__Group__4 )
+ // InternalSensinact.g:2972:2: rule__DSL_CEP_BEFORE__Group__3__Impl rule__DSL_CEP_BEFORE__Group__4
+ {
+ pushFollow(FOLLOW_9);
+ rule__DSL_CEP_BEFORE__Group__3__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_BEFORE__Group__4();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_BEFORE__Group__3"
+
+
+ // $ANTLR start "rule__DSL_CEP_BEFORE__Group__3__Impl"
+ // InternalSensinact.g:2979:1: rule__DSL_CEP_BEFORE__Group__3__Impl : ( ',' ) ;
+ public final void rule__DSL_CEP_BEFORE__Group__3__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2983:1: ( ( ',' ) )
+ // InternalSensinact.g:2984:1: ( ',' )
+ {
+ // InternalSensinact.g:2984:1: ( ',' )
+ // InternalSensinact.g:2985:2: ','
+ {
+ before(grammarAccess.getDSL_CEP_BEFOREAccess().getCommaKeyword_3());
+ match(input,20,FOLLOW_2);
+ after(grammarAccess.getDSL_CEP_BEFOREAccess().getCommaKeyword_3());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_BEFORE__Group__3__Impl"
+
+
+ // $ANTLR start "rule__DSL_CEP_BEFORE__Group__4"
+ // InternalSensinact.g:2994:1: rule__DSL_CEP_BEFORE__Group__4 : rule__DSL_CEP_BEFORE__Group__4__Impl rule__DSL_CEP_BEFORE__Group__5 ;
+ public final void rule__DSL_CEP_BEFORE__Group__4() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:2998:1: ( rule__DSL_CEP_BEFORE__Group__4__Impl rule__DSL_CEP_BEFORE__Group__5 )
+ // InternalSensinact.g:2999:2: rule__DSL_CEP_BEFORE__Group__4__Impl rule__DSL_CEP_BEFORE__Group__5
+ {
+ pushFollow(FOLLOW_14);
+ rule__DSL_CEP_BEFORE__Group__4__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_BEFORE__Group__5();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_BEFORE__Group__4"
+
+
+ // $ANTLR start "rule__DSL_CEP_BEFORE__Group__4__Impl"
+ // InternalSensinact.g:3006:1: rule__DSL_CEP_BEFORE__Group__4__Impl : ( ( rule__DSL_CEP_BEFORE__Ref2Assignment_4 ) ) ;
+ public final void rule__DSL_CEP_BEFORE__Group__4__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3010:1: ( ( ( rule__DSL_CEP_BEFORE__Ref2Assignment_4 ) ) )
+ // InternalSensinact.g:3011:1: ( ( rule__DSL_CEP_BEFORE__Ref2Assignment_4 ) )
+ {
+ // InternalSensinact.g:3011:1: ( ( rule__DSL_CEP_BEFORE__Ref2Assignment_4 ) )
+ // InternalSensinact.g:3012:2: ( rule__DSL_CEP_BEFORE__Ref2Assignment_4 )
+ {
+ before(grammarAccess.getDSL_CEP_BEFOREAccess().getRef2Assignment_4());
+ // InternalSensinact.g:3013:2: ( rule__DSL_CEP_BEFORE__Ref2Assignment_4 )
+ // InternalSensinact.g:3013:3: rule__DSL_CEP_BEFORE__Ref2Assignment_4
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_BEFORE__Ref2Assignment_4();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_CEP_BEFOREAccess().getRef2Assignment_4());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_BEFORE__Group__4__Impl"
+
+
+ // $ANTLR start "rule__DSL_CEP_BEFORE__Group__5"
+ // InternalSensinact.g:3021:1: rule__DSL_CEP_BEFORE__Group__5 : rule__DSL_CEP_BEFORE__Group__5__Impl rule__DSL_CEP_BEFORE__Group__6 ;
+ public final void rule__DSL_CEP_BEFORE__Group__5() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3025:1: ( rule__DSL_CEP_BEFORE__Group__5__Impl rule__DSL_CEP_BEFORE__Group__6 )
+ // InternalSensinact.g:3026:2: rule__DSL_CEP_BEFORE__Group__5__Impl rule__DSL_CEP_BEFORE__Group__6
+ {
+ pushFollow(FOLLOW_21);
+ rule__DSL_CEP_BEFORE__Group__5__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_BEFORE__Group__6();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_BEFORE__Group__5"
+
+
+ // $ANTLR start "rule__DSL_CEP_BEFORE__Group__5__Impl"
+ // InternalSensinact.g:3033:1: rule__DSL_CEP_BEFORE__Group__5__Impl : ( ',' ) ;
+ public final void rule__DSL_CEP_BEFORE__Group__5__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3037:1: ( ( ',' ) )
+ // InternalSensinact.g:3038:1: ( ',' )
+ {
+ // InternalSensinact.g:3038:1: ( ',' )
+ // InternalSensinact.g:3039:2: ','
+ {
+ before(grammarAccess.getDSL_CEP_BEFOREAccess().getCommaKeyword_5());
+ match(input,20,FOLLOW_2);
+ after(grammarAccess.getDSL_CEP_BEFOREAccess().getCommaKeyword_5());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_BEFORE__Group__5__Impl"
+
+
+ // $ANTLR start "rule__DSL_CEP_BEFORE__Group__6"
+ // InternalSensinact.g:3048:1: rule__DSL_CEP_BEFORE__Group__6 : rule__DSL_CEP_BEFORE__Group__6__Impl rule__DSL_CEP_BEFORE__Group__7 ;
+ public final void rule__DSL_CEP_BEFORE__Group__6() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3052:1: ( rule__DSL_CEP_BEFORE__Group__6__Impl rule__DSL_CEP_BEFORE__Group__7 )
+ // InternalSensinact.g:3053:2: rule__DSL_CEP_BEFORE__Group__6__Impl rule__DSL_CEP_BEFORE__Group__7
+ {
+ pushFollow(FOLLOW_21);
+ rule__DSL_CEP_BEFORE__Group__6__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_BEFORE__Group__7();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_BEFORE__Group__6"
+
+
+ // $ANTLR start "rule__DSL_CEP_BEFORE__Group__6__Impl"
+ // InternalSensinact.g:3060:1: rule__DSL_CEP_BEFORE__Group__6__Impl : ( ( rule__DSL_CEP_BEFORE__Group_6__0 )? ) ;
+ public final void rule__DSL_CEP_BEFORE__Group__6__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3064:1: ( ( ( rule__DSL_CEP_BEFORE__Group_6__0 )? ) )
+ // InternalSensinact.g:3065:1: ( ( rule__DSL_CEP_BEFORE__Group_6__0 )? )
+ {
+ // InternalSensinact.g:3065:1: ( ( rule__DSL_CEP_BEFORE__Group_6__0 )? )
+ // InternalSensinact.g:3066:2: ( rule__DSL_CEP_BEFORE__Group_6__0 )?
+ {
+ before(grammarAccess.getDSL_CEP_BEFOREAccess().getGroup_6());
+ // InternalSensinact.g:3067:2: ( rule__DSL_CEP_BEFORE__Group_6__0 )?
+ int alt18=2;
+ alt18 = dfa18.predict(input);
+ switch (alt18) {
+ case 1 :
+ // InternalSensinact.g:3067:3: rule__DSL_CEP_BEFORE__Group_6__0
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_BEFORE__Group_6__0();
+
+ state._fsp--;
+
+
+ }
+ break;
+
+ }
+
+ after(grammarAccess.getDSL_CEP_BEFOREAccess().getGroup_6());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_BEFORE__Group__6__Impl"
+
+
+ // $ANTLR start "rule__DSL_CEP_BEFORE__Group__7"
+ // InternalSensinact.g:3075:1: rule__DSL_CEP_BEFORE__Group__7 : rule__DSL_CEP_BEFORE__Group__7__Impl rule__DSL_CEP_BEFORE__Group__8 ;
+ public final void rule__DSL_CEP_BEFORE__Group__7() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3079:1: ( rule__DSL_CEP_BEFORE__Group__7__Impl rule__DSL_CEP_BEFORE__Group__8 )
+ // InternalSensinact.g:3080:2: rule__DSL_CEP_BEFORE__Group__7__Impl rule__DSL_CEP_BEFORE__Group__8
+ {
+ pushFollow(FOLLOW_25);
+ rule__DSL_CEP_BEFORE__Group__7__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_BEFORE__Group__8();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_BEFORE__Group__7"
+
+
+ // $ANTLR start "rule__DSL_CEP_BEFORE__Group__7__Impl"
+ // InternalSensinact.g:3087:1: rule__DSL_CEP_BEFORE__Group__7__Impl : ( ( rule__DSL_CEP_BEFORE__EndAssignment_7 ) ) ;
+ public final void rule__DSL_CEP_BEFORE__Group__7__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3091:1: ( ( ( rule__DSL_CEP_BEFORE__EndAssignment_7 ) ) )
+ // InternalSensinact.g:3092:1: ( ( rule__DSL_CEP_BEFORE__EndAssignment_7 ) )
+ {
+ // InternalSensinact.g:3092:1: ( ( rule__DSL_CEP_BEFORE__EndAssignment_7 ) )
+ // InternalSensinact.g:3093:2: ( rule__DSL_CEP_BEFORE__EndAssignment_7 )
+ {
+ before(grammarAccess.getDSL_CEP_BEFOREAccess().getEndAssignment_7());
+ // InternalSensinact.g:3094:2: ( rule__DSL_CEP_BEFORE__EndAssignment_7 )
+ // InternalSensinact.g:3094:3: rule__DSL_CEP_BEFORE__EndAssignment_7
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_BEFORE__EndAssignment_7();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_CEP_BEFOREAccess().getEndAssignment_7());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_BEFORE__Group__7__Impl"
+
+
+ // $ANTLR start "rule__DSL_CEP_BEFORE__Group__8"
+ // InternalSensinact.g:3102:1: rule__DSL_CEP_BEFORE__Group__8 : rule__DSL_CEP_BEFORE__Group__8__Impl ;
+ public final void rule__DSL_CEP_BEFORE__Group__8() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3106:1: ( rule__DSL_CEP_BEFORE__Group__8__Impl )
+ // InternalSensinact.g:3107:2: rule__DSL_CEP_BEFORE__Group__8__Impl
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_BEFORE__Group__8__Impl();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_BEFORE__Group__8"
+
+
+ // $ANTLR start "rule__DSL_CEP_BEFORE__Group__8__Impl"
+ // InternalSensinact.g:3113:1: rule__DSL_CEP_BEFORE__Group__8__Impl : ( ')' ) ;
+ public final void rule__DSL_CEP_BEFORE__Group__8__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3117:1: ( ( ')' ) )
+ // InternalSensinact.g:3118:1: ( ')' )
+ {
+ // InternalSensinact.g:3118:1: ( ')' )
+ // InternalSensinact.g:3119:2: ')'
+ {
+ before(grammarAccess.getDSL_CEP_BEFOREAccess().getRightParenthesisKeyword_8());
+ match(input,29,FOLLOW_2);
+ after(grammarAccess.getDSL_CEP_BEFOREAccess().getRightParenthesisKeyword_8());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_BEFORE__Group__8__Impl"
+
+
+ // $ANTLR start "rule__DSL_CEP_BEFORE__Group_6__0"
+ // InternalSensinact.g:3129:1: rule__DSL_CEP_BEFORE__Group_6__0 : rule__DSL_CEP_BEFORE__Group_6__0__Impl rule__DSL_CEP_BEFORE__Group_6__1 ;
+ public final void rule__DSL_CEP_BEFORE__Group_6__0() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3133:1: ( rule__DSL_CEP_BEFORE__Group_6__0__Impl rule__DSL_CEP_BEFORE__Group_6__1 )
+ // InternalSensinact.g:3134:2: rule__DSL_CEP_BEFORE__Group_6__0__Impl rule__DSL_CEP_BEFORE__Group_6__1
+ {
+ pushFollow(FOLLOW_14);
+ rule__DSL_CEP_BEFORE__Group_6__0__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_BEFORE__Group_6__1();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_BEFORE__Group_6__0"
+
+
+ // $ANTLR start "rule__DSL_CEP_BEFORE__Group_6__0__Impl"
+ // InternalSensinact.g:3141:1: rule__DSL_CEP_BEFORE__Group_6__0__Impl : ( ( rule__DSL_CEP_BEFORE__StartAssignment_6_0 ) ) ;
+ public final void rule__DSL_CEP_BEFORE__Group_6__0__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3145:1: ( ( ( rule__DSL_CEP_BEFORE__StartAssignment_6_0 ) ) )
+ // InternalSensinact.g:3146:1: ( ( rule__DSL_CEP_BEFORE__StartAssignment_6_0 ) )
+ {
+ // InternalSensinact.g:3146:1: ( ( rule__DSL_CEP_BEFORE__StartAssignment_6_0 ) )
+ // InternalSensinact.g:3147:2: ( rule__DSL_CEP_BEFORE__StartAssignment_6_0 )
+ {
+ before(grammarAccess.getDSL_CEP_BEFOREAccess().getStartAssignment_6_0());
+ // InternalSensinact.g:3148:2: ( rule__DSL_CEP_BEFORE__StartAssignment_6_0 )
+ // InternalSensinact.g:3148:3: rule__DSL_CEP_BEFORE__StartAssignment_6_0
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_BEFORE__StartAssignment_6_0();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_CEP_BEFOREAccess().getStartAssignment_6_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_BEFORE__Group_6__0__Impl"
+
+
+ // $ANTLR start "rule__DSL_CEP_BEFORE__Group_6__1"
+ // InternalSensinact.g:3156:1: rule__DSL_CEP_BEFORE__Group_6__1 : rule__DSL_CEP_BEFORE__Group_6__1__Impl ;
+ public final void rule__DSL_CEP_BEFORE__Group_6__1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3160:1: ( rule__DSL_CEP_BEFORE__Group_6__1__Impl )
+ // InternalSensinact.g:3161:2: rule__DSL_CEP_BEFORE__Group_6__1__Impl
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_BEFORE__Group_6__1__Impl();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_BEFORE__Group_6__1"
+
+
+ // $ANTLR start "rule__DSL_CEP_BEFORE__Group_6__1__Impl"
+ // InternalSensinact.g:3167:1: rule__DSL_CEP_BEFORE__Group_6__1__Impl : ( ',' ) ;
+ public final void rule__DSL_CEP_BEFORE__Group_6__1__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3171:1: ( ( ',' ) )
+ // InternalSensinact.g:3172:1: ( ',' )
+ {
+ // InternalSensinact.g:3172:1: ( ',' )
+ // InternalSensinact.g:3173:2: ','
+ {
+ before(grammarAccess.getDSL_CEP_BEFOREAccess().getCommaKeyword_6_1());
+ match(input,20,FOLLOW_2);
+ after(grammarAccess.getDSL_CEP_BEFOREAccess().getCommaKeyword_6_1());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_BEFORE__Group_6__1__Impl"
+
+
+ // $ANTLR start "rule__DSL_CEP_COINCIDE__Group__0"
+ // InternalSensinact.g:3183:1: rule__DSL_CEP_COINCIDE__Group__0 : rule__DSL_CEP_COINCIDE__Group__0__Impl rule__DSL_CEP_COINCIDE__Group__1 ;
+ public final void rule__DSL_CEP_COINCIDE__Group__0() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3187:1: ( rule__DSL_CEP_COINCIDE__Group__0__Impl rule__DSL_CEP_COINCIDE__Group__1 )
+ // InternalSensinact.g:3188:2: rule__DSL_CEP_COINCIDE__Group__0__Impl rule__DSL_CEP_COINCIDE__Group__1
+ {
+ pushFollow(FOLLOW_24);
+ rule__DSL_CEP_COINCIDE__Group__0__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_COINCIDE__Group__1();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_COINCIDE__Group__0"
+
+
+ // $ANTLR start "rule__DSL_CEP_COINCIDE__Group__0__Impl"
+ // InternalSensinact.g:3195:1: rule__DSL_CEP_COINCIDE__Group__0__Impl : ( 'coincide' ) ;
+ public final void rule__DSL_CEP_COINCIDE__Group__0__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3199:1: ( ( 'coincide' ) )
+ // InternalSensinact.g:3200:1: ( 'coincide' )
+ {
+ // InternalSensinact.g:3200:1: ( 'coincide' )
+ // InternalSensinact.g:3201:2: 'coincide'
+ {
+ before(grammarAccess.getDSL_CEP_COINCIDEAccess().getCoincideKeyword_0());
+ match(input,33,FOLLOW_2);
+ after(grammarAccess.getDSL_CEP_COINCIDEAccess().getCoincideKeyword_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_COINCIDE__Group__0__Impl"
+
+
+ // $ANTLR start "rule__DSL_CEP_COINCIDE__Group__1"
+ // InternalSensinact.g:3210:1: rule__DSL_CEP_COINCIDE__Group__1 : rule__DSL_CEP_COINCIDE__Group__1__Impl rule__DSL_CEP_COINCIDE__Group__2 ;
+ public final void rule__DSL_CEP_COINCIDE__Group__1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3214:1: ( rule__DSL_CEP_COINCIDE__Group__1__Impl rule__DSL_CEP_COINCIDE__Group__2 )
+ // InternalSensinact.g:3215:2: rule__DSL_CEP_COINCIDE__Group__1__Impl rule__DSL_CEP_COINCIDE__Group__2
+ {
+ pushFollow(FOLLOW_9);
+ rule__DSL_CEP_COINCIDE__Group__1__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_COINCIDE__Group__2();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_COINCIDE__Group__1"
+
+
+ // $ANTLR start "rule__DSL_CEP_COINCIDE__Group__1__Impl"
+ // InternalSensinact.g:3222:1: rule__DSL_CEP_COINCIDE__Group__1__Impl : ( '(' ) ;
+ public final void rule__DSL_CEP_COINCIDE__Group__1__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3226:1: ( ( '(' ) )
+ // InternalSensinact.g:3227:1: ( '(' )
+ {
+ // InternalSensinact.g:3227:1: ( '(' )
+ // InternalSensinact.g:3228:2: '('
+ {
+ before(grammarAccess.getDSL_CEP_COINCIDEAccess().getLeftParenthesisKeyword_1());
+ match(input,28,FOLLOW_2);
+ after(grammarAccess.getDSL_CEP_COINCIDEAccess().getLeftParenthesisKeyword_1());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_COINCIDE__Group__1__Impl"
+
+
+ // $ANTLR start "rule__DSL_CEP_COINCIDE__Group__2"
+ // InternalSensinact.g:3237:1: rule__DSL_CEP_COINCIDE__Group__2 : rule__DSL_CEP_COINCIDE__Group__2__Impl rule__DSL_CEP_COINCIDE__Group__3 ;
+ public final void rule__DSL_CEP_COINCIDE__Group__2() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3241:1: ( rule__DSL_CEP_COINCIDE__Group__2__Impl rule__DSL_CEP_COINCIDE__Group__3 )
+ // InternalSensinact.g:3242:2: rule__DSL_CEP_COINCIDE__Group__2__Impl rule__DSL_CEP_COINCIDE__Group__3
+ {
+ pushFollow(FOLLOW_14);
+ rule__DSL_CEP_COINCIDE__Group__2__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_COINCIDE__Group__3();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_COINCIDE__Group__2"
+
+
+ // $ANTLR start "rule__DSL_CEP_COINCIDE__Group__2__Impl"
+ // InternalSensinact.g:3249:1: rule__DSL_CEP_COINCIDE__Group__2__Impl : ( ( rule__DSL_CEP_COINCIDE__Ref1Assignment_2 ) ) ;
+ public final void rule__DSL_CEP_COINCIDE__Group__2__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3253:1: ( ( ( rule__DSL_CEP_COINCIDE__Ref1Assignment_2 ) ) )
+ // InternalSensinact.g:3254:1: ( ( rule__DSL_CEP_COINCIDE__Ref1Assignment_2 ) )
+ {
+ // InternalSensinact.g:3254:1: ( ( rule__DSL_CEP_COINCIDE__Ref1Assignment_2 ) )
+ // InternalSensinact.g:3255:2: ( rule__DSL_CEP_COINCIDE__Ref1Assignment_2 )
+ {
+ before(grammarAccess.getDSL_CEP_COINCIDEAccess().getRef1Assignment_2());
+ // InternalSensinact.g:3256:2: ( rule__DSL_CEP_COINCIDE__Ref1Assignment_2 )
+ // InternalSensinact.g:3256:3: rule__DSL_CEP_COINCIDE__Ref1Assignment_2
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_COINCIDE__Ref1Assignment_2();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_CEP_COINCIDEAccess().getRef1Assignment_2());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_COINCIDE__Group__2__Impl"
+
+
+ // $ANTLR start "rule__DSL_CEP_COINCIDE__Group__3"
+ // InternalSensinact.g:3264:1: rule__DSL_CEP_COINCIDE__Group__3 : rule__DSL_CEP_COINCIDE__Group__3__Impl rule__DSL_CEP_COINCIDE__Group__4 ;
+ public final void rule__DSL_CEP_COINCIDE__Group__3() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3268:1: ( rule__DSL_CEP_COINCIDE__Group__3__Impl rule__DSL_CEP_COINCIDE__Group__4 )
+ // InternalSensinact.g:3269:2: rule__DSL_CEP_COINCIDE__Group__3__Impl rule__DSL_CEP_COINCIDE__Group__4
+ {
+ pushFollow(FOLLOW_9);
+ rule__DSL_CEP_COINCIDE__Group__3__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_COINCIDE__Group__4();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_COINCIDE__Group__3"
+
+
+ // $ANTLR start "rule__DSL_CEP_COINCIDE__Group__3__Impl"
+ // InternalSensinact.g:3276:1: rule__DSL_CEP_COINCIDE__Group__3__Impl : ( ',' ) ;
+ public final void rule__DSL_CEP_COINCIDE__Group__3__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3280:1: ( ( ',' ) )
+ // InternalSensinact.g:3281:1: ( ',' )
+ {
+ // InternalSensinact.g:3281:1: ( ',' )
+ // InternalSensinact.g:3282:2: ','
+ {
+ before(grammarAccess.getDSL_CEP_COINCIDEAccess().getCommaKeyword_3());
+ match(input,20,FOLLOW_2);
+ after(grammarAccess.getDSL_CEP_COINCIDEAccess().getCommaKeyword_3());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_COINCIDE__Group__3__Impl"
+
+
+ // $ANTLR start "rule__DSL_CEP_COINCIDE__Group__4"
+ // InternalSensinact.g:3291:1: rule__DSL_CEP_COINCIDE__Group__4 : rule__DSL_CEP_COINCIDE__Group__4__Impl rule__DSL_CEP_COINCIDE__Group__5 ;
+ public final void rule__DSL_CEP_COINCIDE__Group__4() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3295:1: ( rule__DSL_CEP_COINCIDE__Group__4__Impl rule__DSL_CEP_COINCIDE__Group__5 )
+ // InternalSensinact.g:3296:2: rule__DSL_CEP_COINCIDE__Group__4__Impl rule__DSL_CEP_COINCIDE__Group__5
+ {
+ pushFollow(FOLLOW_14);
+ rule__DSL_CEP_COINCIDE__Group__4__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_COINCIDE__Group__5();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_COINCIDE__Group__4"
+
+
+ // $ANTLR start "rule__DSL_CEP_COINCIDE__Group__4__Impl"
+ // InternalSensinact.g:3303:1: rule__DSL_CEP_COINCIDE__Group__4__Impl : ( ( rule__DSL_CEP_COINCIDE__Ref2Assignment_4 ) ) ;
+ public final void rule__DSL_CEP_COINCIDE__Group__4__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3307:1: ( ( ( rule__DSL_CEP_COINCIDE__Ref2Assignment_4 ) ) )
+ // InternalSensinact.g:3308:1: ( ( rule__DSL_CEP_COINCIDE__Ref2Assignment_4 ) )
+ {
+ // InternalSensinact.g:3308:1: ( ( rule__DSL_CEP_COINCIDE__Ref2Assignment_4 ) )
+ // InternalSensinact.g:3309:2: ( rule__DSL_CEP_COINCIDE__Ref2Assignment_4 )
+ {
+ before(grammarAccess.getDSL_CEP_COINCIDEAccess().getRef2Assignment_4());
+ // InternalSensinact.g:3310:2: ( rule__DSL_CEP_COINCIDE__Ref2Assignment_4 )
+ // InternalSensinact.g:3310:3: rule__DSL_CEP_COINCIDE__Ref2Assignment_4
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_COINCIDE__Ref2Assignment_4();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_CEP_COINCIDEAccess().getRef2Assignment_4());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_COINCIDE__Group__4__Impl"
+
+
+ // $ANTLR start "rule__DSL_CEP_COINCIDE__Group__5"
+ // InternalSensinact.g:3318:1: rule__DSL_CEP_COINCIDE__Group__5 : rule__DSL_CEP_COINCIDE__Group__5__Impl rule__DSL_CEP_COINCIDE__Group__6 ;
+ public final void rule__DSL_CEP_COINCIDE__Group__5() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3322:1: ( rule__DSL_CEP_COINCIDE__Group__5__Impl rule__DSL_CEP_COINCIDE__Group__6 )
+ // InternalSensinact.g:3323:2: rule__DSL_CEP_COINCIDE__Group__5__Impl rule__DSL_CEP_COINCIDE__Group__6
+ {
+ pushFollow(FOLLOW_21);
+ rule__DSL_CEP_COINCIDE__Group__5__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_COINCIDE__Group__6();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_COINCIDE__Group__5"
+
+
+ // $ANTLR start "rule__DSL_CEP_COINCIDE__Group__5__Impl"
+ // InternalSensinact.g:3330:1: rule__DSL_CEP_COINCIDE__Group__5__Impl : ( ',' ) ;
+ public final void rule__DSL_CEP_COINCIDE__Group__5__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3334:1: ( ( ',' ) )
+ // InternalSensinact.g:3335:1: ( ',' )
+ {
+ // InternalSensinact.g:3335:1: ( ',' )
+ // InternalSensinact.g:3336:2: ','
+ {
+ before(grammarAccess.getDSL_CEP_COINCIDEAccess().getCommaKeyword_5());
+ match(input,20,FOLLOW_2);
+ after(grammarAccess.getDSL_CEP_COINCIDEAccess().getCommaKeyword_5());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_COINCIDE__Group__5__Impl"
+
+
+ // $ANTLR start "rule__DSL_CEP_COINCIDE__Group__6"
+ // InternalSensinact.g:3345:1: rule__DSL_CEP_COINCIDE__Group__6 : rule__DSL_CEP_COINCIDE__Group__6__Impl rule__DSL_CEP_COINCIDE__Group__7 ;
+ public final void rule__DSL_CEP_COINCIDE__Group__6() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3349:1: ( rule__DSL_CEP_COINCIDE__Group__6__Impl rule__DSL_CEP_COINCIDE__Group__7 )
+ // InternalSensinact.g:3350:2: rule__DSL_CEP_COINCIDE__Group__6__Impl rule__DSL_CEP_COINCIDE__Group__7
+ {
+ pushFollow(FOLLOW_25);
+ rule__DSL_CEP_COINCIDE__Group__6__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_COINCIDE__Group__7();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_COINCIDE__Group__6"
+
+
+ // $ANTLR start "rule__DSL_CEP_COINCIDE__Group__6__Impl"
+ // InternalSensinact.g:3357:1: rule__DSL_CEP_COINCIDE__Group__6__Impl : ( ( rule__DSL_CEP_COINCIDE__WindowAssignment_6 ) ) ;
+ public final void rule__DSL_CEP_COINCIDE__Group__6__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3361:1: ( ( ( rule__DSL_CEP_COINCIDE__WindowAssignment_6 ) ) )
+ // InternalSensinact.g:3362:1: ( ( rule__DSL_CEP_COINCIDE__WindowAssignment_6 ) )
+ {
+ // InternalSensinact.g:3362:1: ( ( rule__DSL_CEP_COINCIDE__WindowAssignment_6 ) )
+ // InternalSensinact.g:3363:2: ( rule__DSL_CEP_COINCIDE__WindowAssignment_6 )
+ {
+ before(grammarAccess.getDSL_CEP_COINCIDEAccess().getWindowAssignment_6());
+ // InternalSensinact.g:3364:2: ( rule__DSL_CEP_COINCIDE__WindowAssignment_6 )
+ // InternalSensinact.g:3364:3: rule__DSL_CEP_COINCIDE__WindowAssignment_6
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_COINCIDE__WindowAssignment_6();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_CEP_COINCIDEAccess().getWindowAssignment_6());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_COINCIDE__Group__6__Impl"
+
+
+ // $ANTLR start "rule__DSL_CEP_COINCIDE__Group__7"
+ // InternalSensinact.g:3372:1: rule__DSL_CEP_COINCIDE__Group__7 : rule__DSL_CEP_COINCIDE__Group__7__Impl ;
+ public final void rule__DSL_CEP_COINCIDE__Group__7() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3376:1: ( rule__DSL_CEP_COINCIDE__Group__7__Impl )
+ // InternalSensinact.g:3377:2: rule__DSL_CEP_COINCIDE__Group__7__Impl
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_COINCIDE__Group__7__Impl();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_COINCIDE__Group__7"
+
+
+ // $ANTLR start "rule__DSL_CEP_COINCIDE__Group__7__Impl"
+ // InternalSensinact.g:3383:1: rule__DSL_CEP_COINCIDE__Group__7__Impl : ( ')' ) ;
+ public final void rule__DSL_CEP_COINCIDE__Group__7__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3387:1: ( ( ')' ) )
+ // InternalSensinact.g:3388:1: ( ')' )
+ {
+ // InternalSensinact.g:3388:1: ( ')' )
+ // InternalSensinact.g:3389:2: ')'
+ {
+ before(grammarAccess.getDSL_CEP_COINCIDEAccess().getRightParenthesisKeyword_7());
+ match(input,29,FOLLOW_2);
+ after(grammarAccess.getDSL_CEP_COINCIDEAccess().getRightParenthesisKeyword_7());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_COINCIDE__Group__7__Impl"
+
+
+ // $ANTLR start "rule__DSL_CEP_MIN__Group__0"
+ // InternalSensinact.g:3399:1: rule__DSL_CEP_MIN__Group__0 : rule__DSL_CEP_MIN__Group__0__Impl rule__DSL_CEP_MIN__Group__1 ;
+ public final void rule__DSL_CEP_MIN__Group__0() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3403:1: ( rule__DSL_CEP_MIN__Group__0__Impl rule__DSL_CEP_MIN__Group__1 )
+ // InternalSensinact.g:3404:2: rule__DSL_CEP_MIN__Group__0__Impl rule__DSL_CEP_MIN__Group__1
+ {
+ pushFollow(FOLLOW_24);
+ rule__DSL_CEP_MIN__Group__0__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_MIN__Group__1();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_MIN__Group__0"
+
+
+ // $ANTLR start "rule__DSL_CEP_MIN__Group__0__Impl"
+ // InternalSensinact.g:3411:1: rule__DSL_CEP_MIN__Group__0__Impl : ( 'min' ) ;
+ public final void rule__DSL_CEP_MIN__Group__0__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3415:1: ( ( 'min' ) )
+ // InternalSensinact.g:3416:1: ( 'min' )
+ {
+ // InternalSensinact.g:3416:1: ( 'min' )
+ // InternalSensinact.g:3417:2: 'min'
+ {
+ before(grammarAccess.getDSL_CEP_MINAccess().getMinKeyword_0());
+ match(input,34,FOLLOW_2);
+ after(grammarAccess.getDSL_CEP_MINAccess().getMinKeyword_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_MIN__Group__0__Impl"
+
+
+ // $ANTLR start "rule__DSL_CEP_MIN__Group__1"
+ // InternalSensinact.g:3426:1: rule__DSL_CEP_MIN__Group__1 : rule__DSL_CEP_MIN__Group__1__Impl rule__DSL_CEP_MIN__Group__2 ;
+ public final void rule__DSL_CEP_MIN__Group__1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3430:1: ( rule__DSL_CEP_MIN__Group__1__Impl rule__DSL_CEP_MIN__Group__2 )
+ // InternalSensinact.g:3431:2: rule__DSL_CEP_MIN__Group__1__Impl rule__DSL_CEP_MIN__Group__2
+ {
+ pushFollow(FOLLOW_9);
+ rule__DSL_CEP_MIN__Group__1__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_MIN__Group__2();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_MIN__Group__1"
+
+
+ // $ANTLR start "rule__DSL_CEP_MIN__Group__1__Impl"
+ // InternalSensinact.g:3438:1: rule__DSL_CEP_MIN__Group__1__Impl : ( '(' ) ;
+ public final void rule__DSL_CEP_MIN__Group__1__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3442:1: ( ( '(' ) )
+ // InternalSensinact.g:3443:1: ( '(' )
+ {
+ // InternalSensinact.g:3443:1: ( '(' )
+ // InternalSensinact.g:3444:2: '('
+ {
+ before(grammarAccess.getDSL_CEP_MINAccess().getLeftParenthesisKeyword_1());
+ match(input,28,FOLLOW_2);
+ after(grammarAccess.getDSL_CEP_MINAccess().getLeftParenthesisKeyword_1());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_MIN__Group__1__Impl"
+
+
+ // $ANTLR start "rule__DSL_CEP_MIN__Group__2"
+ // InternalSensinact.g:3453:1: rule__DSL_CEP_MIN__Group__2 : rule__DSL_CEP_MIN__Group__2__Impl rule__DSL_CEP_MIN__Group__3 ;
+ public final void rule__DSL_CEP_MIN__Group__2() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3457:1: ( rule__DSL_CEP_MIN__Group__2__Impl rule__DSL_CEP_MIN__Group__3 )
+ // InternalSensinact.g:3458:2: rule__DSL_CEP_MIN__Group__2__Impl rule__DSL_CEP_MIN__Group__3
+ {
+ pushFollow(FOLLOW_14);
+ rule__DSL_CEP_MIN__Group__2__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_MIN__Group__3();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_MIN__Group__2"
+
+
+ // $ANTLR start "rule__DSL_CEP_MIN__Group__2__Impl"
+ // InternalSensinact.g:3465:1: rule__DSL_CEP_MIN__Group__2__Impl : ( ( rule__DSL_CEP_MIN__RefAssignment_2 ) ) ;
+ public final void rule__DSL_CEP_MIN__Group__2__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3469:1: ( ( ( rule__DSL_CEP_MIN__RefAssignment_2 ) ) )
+ // InternalSensinact.g:3470:1: ( ( rule__DSL_CEP_MIN__RefAssignment_2 ) )
+ {
+ // InternalSensinact.g:3470:1: ( ( rule__DSL_CEP_MIN__RefAssignment_2 ) )
+ // InternalSensinact.g:3471:2: ( rule__DSL_CEP_MIN__RefAssignment_2 )
+ {
+ before(grammarAccess.getDSL_CEP_MINAccess().getRefAssignment_2());
+ // InternalSensinact.g:3472:2: ( rule__DSL_CEP_MIN__RefAssignment_2 )
+ // InternalSensinact.g:3472:3: rule__DSL_CEP_MIN__RefAssignment_2
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_MIN__RefAssignment_2();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_CEP_MINAccess().getRefAssignment_2());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_MIN__Group__2__Impl"
+
+
+ // $ANTLR start "rule__DSL_CEP_MIN__Group__3"
+ // InternalSensinact.g:3480:1: rule__DSL_CEP_MIN__Group__3 : rule__DSL_CEP_MIN__Group__3__Impl rule__DSL_CEP_MIN__Group__4 ;
+ public final void rule__DSL_CEP_MIN__Group__3() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3484:1: ( rule__DSL_CEP_MIN__Group__3__Impl rule__DSL_CEP_MIN__Group__4 )
+ // InternalSensinact.g:3485:2: rule__DSL_CEP_MIN__Group__3__Impl rule__DSL_CEP_MIN__Group__4
+ {
+ pushFollow(FOLLOW_21);
+ rule__DSL_CEP_MIN__Group__3__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_MIN__Group__4();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_MIN__Group__3"
+
+
+ // $ANTLR start "rule__DSL_CEP_MIN__Group__3__Impl"
+ // InternalSensinact.g:3492:1: rule__DSL_CEP_MIN__Group__3__Impl : ( ',' ) ;
+ public final void rule__DSL_CEP_MIN__Group__3__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3496:1: ( ( ',' ) )
+ // InternalSensinact.g:3497:1: ( ',' )
+ {
+ // InternalSensinact.g:3497:1: ( ',' )
+ // InternalSensinact.g:3498:2: ','
+ {
+ before(grammarAccess.getDSL_CEP_MINAccess().getCommaKeyword_3());
+ match(input,20,FOLLOW_2);
+ after(grammarAccess.getDSL_CEP_MINAccess().getCommaKeyword_3());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_MIN__Group__3__Impl"
+
+
+ // $ANTLR start "rule__DSL_CEP_MIN__Group__4"
+ // InternalSensinact.g:3507:1: rule__DSL_CEP_MIN__Group__4 : rule__DSL_CEP_MIN__Group__4__Impl rule__DSL_CEP_MIN__Group__5 ;
+ public final void rule__DSL_CEP_MIN__Group__4() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3511:1: ( rule__DSL_CEP_MIN__Group__4__Impl rule__DSL_CEP_MIN__Group__5 )
+ // InternalSensinact.g:3512:2: rule__DSL_CEP_MIN__Group__4__Impl rule__DSL_CEP_MIN__Group__5
+ {
+ pushFollow(FOLLOW_25);
+ rule__DSL_CEP_MIN__Group__4__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_MIN__Group__5();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_MIN__Group__4"
+
+
+ // $ANTLR start "rule__DSL_CEP_MIN__Group__4__Impl"
+ // InternalSensinact.g:3519:1: rule__DSL_CEP_MIN__Group__4__Impl : ( ( rule__DSL_CEP_MIN__WindowAssignment_4 ) ) ;
+ public final void rule__DSL_CEP_MIN__Group__4__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3523:1: ( ( ( rule__DSL_CEP_MIN__WindowAssignment_4 ) ) )
+ // InternalSensinact.g:3524:1: ( ( rule__DSL_CEP_MIN__WindowAssignment_4 ) )
+ {
+ // InternalSensinact.g:3524:1: ( ( rule__DSL_CEP_MIN__WindowAssignment_4 ) )
+ // InternalSensinact.g:3525:2: ( rule__DSL_CEP_MIN__WindowAssignment_4 )
+ {
+ before(grammarAccess.getDSL_CEP_MINAccess().getWindowAssignment_4());
+ // InternalSensinact.g:3526:2: ( rule__DSL_CEP_MIN__WindowAssignment_4 )
+ // InternalSensinact.g:3526:3: rule__DSL_CEP_MIN__WindowAssignment_4
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_MIN__WindowAssignment_4();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_CEP_MINAccess().getWindowAssignment_4());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_MIN__Group__4__Impl"
+
+
+ // $ANTLR start "rule__DSL_CEP_MIN__Group__5"
+ // InternalSensinact.g:3534:1: rule__DSL_CEP_MIN__Group__5 : rule__DSL_CEP_MIN__Group__5__Impl ;
+ public final void rule__DSL_CEP_MIN__Group__5() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3538:1: ( rule__DSL_CEP_MIN__Group__5__Impl )
+ // InternalSensinact.g:3539:2: rule__DSL_CEP_MIN__Group__5__Impl
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_MIN__Group__5__Impl();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_MIN__Group__5"
+
+
+ // $ANTLR start "rule__DSL_CEP_MIN__Group__5__Impl"
+ // InternalSensinact.g:3545:1: rule__DSL_CEP_MIN__Group__5__Impl : ( ')' ) ;
+ public final void rule__DSL_CEP_MIN__Group__5__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3549:1: ( ( ')' ) )
+ // InternalSensinact.g:3550:1: ( ')' )
+ {
+ // InternalSensinact.g:3550:1: ( ')' )
+ // InternalSensinact.g:3551:2: ')'
+ {
+ before(grammarAccess.getDSL_CEP_MINAccess().getRightParenthesisKeyword_5());
+ match(input,29,FOLLOW_2);
+ after(grammarAccess.getDSL_CEP_MINAccess().getRightParenthesisKeyword_5());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_MIN__Group__5__Impl"
+
+
+ // $ANTLR start "rule__DSL_CEP_MAX__Group__0"
+ // InternalSensinact.g:3561:1: rule__DSL_CEP_MAX__Group__0 : rule__DSL_CEP_MAX__Group__0__Impl rule__DSL_CEP_MAX__Group__1 ;
+ public final void rule__DSL_CEP_MAX__Group__0() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3565:1: ( rule__DSL_CEP_MAX__Group__0__Impl rule__DSL_CEP_MAX__Group__1 )
+ // InternalSensinact.g:3566:2: rule__DSL_CEP_MAX__Group__0__Impl rule__DSL_CEP_MAX__Group__1
+ {
+ pushFollow(FOLLOW_24);
+ rule__DSL_CEP_MAX__Group__0__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_MAX__Group__1();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_MAX__Group__0"
+
+
+ // $ANTLR start "rule__DSL_CEP_MAX__Group__0__Impl"
+ // InternalSensinact.g:3573:1: rule__DSL_CEP_MAX__Group__0__Impl : ( 'max' ) ;
+ public final void rule__DSL_CEP_MAX__Group__0__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3577:1: ( ( 'max' ) )
+ // InternalSensinact.g:3578:1: ( 'max' )
+ {
+ // InternalSensinact.g:3578:1: ( 'max' )
+ // InternalSensinact.g:3579:2: 'max'
+ {
+ before(grammarAccess.getDSL_CEP_MAXAccess().getMaxKeyword_0());
+ match(input,35,FOLLOW_2);
+ after(grammarAccess.getDSL_CEP_MAXAccess().getMaxKeyword_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_MAX__Group__0__Impl"
+
+
+ // $ANTLR start "rule__DSL_CEP_MAX__Group__1"
+ // InternalSensinact.g:3588:1: rule__DSL_CEP_MAX__Group__1 : rule__DSL_CEP_MAX__Group__1__Impl rule__DSL_CEP_MAX__Group__2 ;
+ public final void rule__DSL_CEP_MAX__Group__1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3592:1: ( rule__DSL_CEP_MAX__Group__1__Impl rule__DSL_CEP_MAX__Group__2 )
+ // InternalSensinact.g:3593:2: rule__DSL_CEP_MAX__Group__1__Impl rule__DSL_CEP_MAX__Group__2
+ {
+ pushFollow(FOLLOW_9);
+ rule__DSL_CEP_MAX__Group__1__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_MAX__Group__2();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_MAX__Group__1"
+
+
+ // $ANTLR start "rule__DSL_CEP_MAX__Group__1__Impl"
+ // InternalSensinact.g:3600:1: rule__DSL_CEP_MAX__Group__1__Impl : ( '(' ) ;
+ public final void rule__DSL_CEP_MAX__Group__1__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3604:1: ( ( '(' ) )
+ // InternalSensinact.g:3605:1: ( '(' )
+ {
+ // InternalSensinact.g:3605:1: ( '(' )
+ // InternalSensinact.g:3606:2: '('
+ {
+ before(grammarAccess.getDSL_CEP_MAXAccess().getLeftParenthesisKeyword_1());
+ match(input,28,FOLLOW_2);
+ after(grammarAccess.getDSL_CEP_MAXAccess().getLeftParenthesisKeyword_1());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_MAX__Group__1__Impl"
+
+
+ // $ANTLR start "rule__DSL_CEP_MAX__Group__2"
+ // InternalSensinact.g:3615:1: rule__DSL_CEP_MAX__Group__2 : rule__DSL_CEP_MAX__Group__2__Impl rule__DSL_CEP_MAX__Group__3 ;
+ public final void rule__DSL_CEP_MAX__Group__2() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3619:1: ( rule__DSL_CEP_MAX__Group__2__Impl rule__DSL_CEP_MAX__Group__3 )
+ // InternalSensinact.g:3620:2: rule__DSL_CEP_MAX__Group__2__Impl rule__DSL_CEP_MAX__Group__3
+ {
+ pushFollow(FOLLOW_14);
+ rule__DSL_CEP_MAX__Group__2__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_MAX__Group__3();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_MAX__Group__2"
+
+
+ // $ANTLR start "rule__DSL_CEP_MAX__Group__2__Impl"
+ // InternalSensinact.g:3627:1: rule__DSL_CEP_MAX__Group__2__Impl : ( ( rule__DSL_CEP_MAX__RefAssignment_2 ) ) ;
+ public final void rule__DSL_CEP_MAX__Group__2__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3631:1: ( ( ( rule__DSL_CEP_MAX__RefAssignment_2 ) ) )
+ // InternalSensinact.g:3632:1: ( ( rule__DSL_CEP_MAX__RefAssignment_2 ) )
+ {
+ // InternalSensinact.g:3632:1: ( ( rule__DSL_CEP_MAX__RefAssignment_2 ) )
+ // InternalSensinact.g:3633:2: ( rule__DSL_CEP_MAX__RefAssignment_2 )
+ {
+ before(grammarAccess.getDSL_CEP_MAXAccess().getRefAssignment_2());
+ // InternalSensinact.g:3634:2: ( rule__DSL_CEP_MAX__RefAssignment_2 )
+ // InternalSensinact.g:3634:3: rule__DSL_CEP_MAX__RefAssignment_2
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_MAX__RefAssignment_2();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_CEP_MAXAccess().getRefAssignment_2());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_MAX__Group__2__Impl"
+
+
+ // $ANTLR start "rule__DSL_CEP_MAX__Group__3"
+ // InternalSensinact.g:3642:1: rule__DSL_CEP_MAX__Group__3 : rule__DSL_CEP_MAX__Group__3__Impl rule__DSL_CEP_MAX__Group__4 ;
+ public final void rule__DSL_CEP_MAX__Group__3() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3646:1: ( rule__DSL_CEP_MAX__Group__3__Impl rule__DSL_CEP_MAX__Group__4 )
+ // InternalSensinact.g:3647:2: rule__DSL_CEP_MAX__Group__3__Impl rule__DSL_CEP_MAX__Group__4
+ {
+ pushFollow(FOLLOW_21);
+ rule__DSL_CEP_MAX__Group__3__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_MAX__Group__4();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_MAX__Group__3"
+
+
+ // $ANTLR start "rule__DSL_CEP_MAX__Group__3__Impl"
+ // InternalSensinact.g:3654:1: rule__DSL_CEP_MAX__Group__3__Impl : ( ',' ) ;
+ public final void rule__DSL_CEP_MAX__Group__3__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3658:1: ( ( ',' ) )
+ // InternalSensinact.g:3659:1: ( ',' )
+ {
+ // InternalSensinact.g:3659:1: ( ',' )
+ // InternalSensinact.g:3660:2: ','
+ {
+ before(grammarAccess.getDSL_CEP_MAXAccess().getCommaKeyword_3());
+ match(input,20,FOLLOW_2);
+ after(grammarAccess.getDSL_CEP_MAXAccess().getCommaKeyword_3());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_MAX__Group__3__Impl"
+
+
+ // $ANTLR start "rule__DSL_CEP_MAX__Group__4"
+ // InternalSensinact.g:3669:1: rule__DSL_CEP_MAX__Group__4 : rule__DSL_CEP_MAX__Group__4__Impl rule__DSL_CEP_MAX__Group__5 ;
+ public final void rule__DSL_CEP_MAX__Group__4() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3673:1: ( rule__DSL_CEP_MAX__Group__4__Impl rule__DSL_CEP_MAX__Group__5 )
+ // InternalSensinact.g:3674:2: rule__DSL_CEP_MAX__Group__4__Impl rule__DSL_CEP_MAX__Group__5
+ {
+ pushFollow(FOLLOW_25);
+ rule__DSL_CEP_MAX__Group__4__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_MAX__Group__5();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_MAX__Group__4"
+
+
+ // $ANTLR start "rule__DSL_CEP_MAX__Group__4__Impl"
+ // InternalSensinact.g:3681:1: rule__DSL_CEP_MAX__Group__4__Impl : ( ( rule__DSL_CEP_MAX__WindowAssignment_4 ) ) ;
+ public final void rule__DSL_CEP_MAX__Group__4__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3685:1: ( ( ( rule__DSL_CEP_MAX__WindowAssignment_4 ) ) )
+ // InternalSensinact.g:3686:1: ( ( rule__DSL_CEP_MAX__WindowAssignment_4 ) )
+ {
+ // InternalSensinact.g:3686:1: ( ( rule__DSL_CEP_MAX__WindowAssignment_4 ) )
+ // InternalSensinact.g:3687:2: ( rule__DSL_CEP_MAX__WindowAssignment_4 )
+ {
+ before(grammarAccess.getDSL_CEP_MAXAccess().getWindowAssignment_4());
+ // InternalSensinact.g:3688:2: ( rule__DSL_CEP_MAX__WindowAssignment_4 )
+ // InternalSensinact.g:3688:3: rule__DSL_CEP_MAX__WindowAssignment_4
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_MAX__WindowAssignment_4();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_CEP_MAXAccess().getWindowAssignment_4());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_MAX__Group__4__Impl"
+
+
+ // $ANTLR start "rule__DSL_CEP_MAX__Group__5"
+ // InternalSensinact.g:3696:1: rule__DSL_CEP_MAX__Group__5 : rule__DSL_CEP_MAX__Group__5__Impl ;
+ public final void rule__DSL_CEP_MAX__Group__5() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3700:1: ( rule__DSL_CEP_MAX__Group__5__Impl )
+ // InternalSensinact.g:3701:2: rule__DSL_CEP_MAX__Group__5__Impl
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_MAX__Group__5__Impl();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_MAX__Group__5"
+
+
+ // $ANTLR start "rule__DSL_CEP_MAX__Group__5__Impl"
+ // InternalSensinact.g:3707:1: rule__DSL_CEP_MAX__Group__5__Impl : ( ')' ) ;
+ public final void rule__DSL_CEP_MAX__Group__5__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3711:1: ( ( ')' ) )
+ // InternalSensinact.g:3712:1: ( ')' )
+ {
+ // InternalSensinact.g:3712:1: ( ')' )
+ // InternalSensinact.g:3713:2: ')'
+ {
+ before(grammarAccess.getDSL_CEP_MAXAccess().getRightParenthesisKeyword_5());
+ match(input,29,FOLLOW_2);
+ after(grammarAccess.getDSL_CEP_MAXAccess().getRightParenthesisKeyword_5());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_MAX__Group__5__Impl"
+
+
+ // $ANTLR start "rule__DSL_CEP_AVG__Group__0"
+ // InternalSensinact.g:3723:1: rule__DSL_CEP_AVG__Group__0 : rule__DSL_CEP_AVG__Group__0__Impl rule__DSL_CEP_AVG__Group__1 ;
+ public final void rule__DSL_CEP_AVG__Group__0() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3727:1: ( rule__DSL_CEP_AVG__Group__0__Impl rule__DSL_CEP_AVG__Group__1 )
+ // InternalSensinact.g:3728:2: rule__DSL_CEP_AVG__Group__0__Impl rule__DSL_CEP_AVG__Group__1
+ {
+ pushFollow(FOLLOW_24);
+ rule__DSL_CEP_AVG__Group__0__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_AVG__Group__1();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_AVG__Group__0"
+
+
+ // $ANTLR start "rule__DSL_CEP_AVG__Group__0__Impl"
+ // InternalSensinact.g:3735:1: rule__DSL_CEP_AVG__Group__0__Impl : ( 'avg' ) ;
+ public final void rule__DSL_CEP_AVG__Group__0__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3739:1: ( ( 'avg' ) )
+ // InternalSensinact.g:3740:1: ( 'avg' )
+ {
+ // InternalSensinact.g:3740:1: ( 'avg' )
+ // InternalSensinact.g:3741:2: 'avg'
+ {
+ before(grammarAccess.getDSL_CEP_AVGAccess().getAvgKeyword_0());
+ match(input,36,FOLLOW_2);
+ after(grammarAccess.getDSL_CEP_AVGAccess().getAvgKeyword_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_AVG__Group__0__Impl"
+
+
+ // $ANTLR start "rule__DSL_CEP_AVG__Group__1"
+ // InternalSensinact.g:3750:1: rule__DSL_CEP_AVG__Group__1 : rule__DSL_CEP_AVG__Group__1__Impl rule__DSL_CEP_AVG__Group__2 ;
+ public final void rule__DSL_CEP_AVG__Group__1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3754:1: ( rule__DSL_CEP_AVG__Group__1__Impl rule__DSL_CEP_AVG__Group__2 )
+ // InternalSensinact.g:3755:2: rule__DSL_CEP_AVG__Group__1__Impl rule__DSL_CEP_AVG__Group__2
+ {
+ pushFollow(FOLLOW_9);
+ rule__DSL_CEP_AVG__Group__1__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_AVG__Group__2();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_AVG__Group__1"
+
+
+ // $ANTLR start "rule__DSL_CEP_AVG__Group__1__Impl"
+ // InternalSensinact.g:3762:1: rule__DSL_CEP_AVG__Group__1__Impl : ( '(' ) ;
+ public final void rule__DSL_CEP_AVG__Group__1__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3766:1: ( ( '(' ) )
+ // InternalSensinact.g:3767:1: ( '(' )
+ {
+ // InternalSensinact.g:3767:1: ( '(' )
+ // InternalSensinact.g:3768:2: '('
+ {
+ before(grammarAccess.getDSL_CEP_AVGAccess().getLeftParenthesisKeyword_1());
+ match(input,28,FOLLOW_2);
+ after(grammarAccess.getDSL_CEP_AVGAccess().getLeftParenthesisKeyword_1());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_AVG__Group__1__Impl"
+
+
+ // $ANTLR start "rule__DSL_CEP_AVG__Group__2"
+ // InternalSensinact.g:3777:1: rule__DSL_CEP_AVG__Group__2 : rule__DSL_CEP_AVG__Group__2__Impl rule__DSL_CEP_AVG__Group__3 ;
+ public final void rule__DSL_CEP_AVG__Group__2() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3781:1: ( rule__DSL_CEP_AVG__Group__2__Impl rule__DSL_CEP_AVG__Group__3 )
+ // InternalSensinact.g:3782:2: rule__DSL_CEP_AVG__Group__2__Impl rule__DSL_CEP_AVG__Group__3
+ {
+ pushFollow(FOLLOW_14);
+ rule__DSL_CEP_AVG__Group__2__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_AVG__Group__3();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_AVG__Group__2"
+
+
+ // $ANTLR start "rule__DSL_CEP_AVG__Group__2__Impl"
+ // InternalSensinact.g:3789:1: rule__DSL_CEP_AVG__Group__2__Impl : ( ( rule__DSL_CEP_AVG__RefAssignment_2 ) ) ;
+ public final void rule__DSL_CEP_AVG__Group__2__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3793:1: ( ( ( rule__DSL_CEP_AVG__RefAssignment_2 ) ) )
+ // InternalSensinact.g:3794:1: ( ( rule__DSL_CEP_AVG__RefAssignment_2 ) )
+ {
+ // InternalSensinact.g:3794:1: ( ( rule__DSL_CEP_AVG__RefAssignment_2 ) )
+ // InternalSensinact.g:3795:2: ( rule__DSL_CEP_AVG__RefAssignment_2 )
+ {
+ before(grammarAccess.getDSL_CEP_AVGAccess().getRefAssignment_2());
+ // InternalSensinact.g:3796:2: ( rule__DSL_CEP_AVG__RefAssignment_2 )
+ // InternalSensinact.g:3796:3: rule__DSL_CEP_AVG__RefAssignment_2
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_AVG__RefAssignment_2();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_CEP_AVGAccess().getRefAssignment_2());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_AVG__Group__2__Impl"
+
+
+ // $ANTLR start "rule__DSL_CEP_AVG__Group__3"
+ // InternalSensinact.g:3804:1: rule__DSL_CEP_AVG__Group__3 : rule__DSL_CEP_AVG__Group__3__Impl rule__DSL_CEP_AVG__Group__4 ;
+ public final void rule__DSL_CEP_AVG__Group__3() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3808:1: ( rule__DSL_CEP_AVG__Group__3__Impl rule__DSL_CEP_AVG__Group__4 )
+ // InternalSensinact.g:3809:2: rule__DSL_CEP_AVG__Group__3__Impl rule__DSL_CEP_AVG__Group__4
+ {
+ pushFollow(FOLLOW_21);
+ rule__DSL_CEP_AVG__Group__3__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_AVG__Group__4();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_AVG__Group__3"
+
+
+ // $ANTLR start "rule__DSL_CEP_AVG__Group__3__Impl"
+ // InternalSensinact.g:3816:1: rule__DSL_CEP_AVG__Group__3__Impl : ( ',' ) ;
+ public final void rule__DSL_CEP_AVG__Group__3__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3820:1: ( ( ',' ) )
+ // InternalSensinact.g:3821:1: ( ',' )
+ {
+ // InternalSensinact.g:3821:1: ( ',' )
+ // InternalSensinact.g:3822:2: ','
+ {
+ before(grammarAccess.getDSL_CEP_AVGAccess().getCommaKeyword_3());
+ match(input,20,FOLLOW_2);
+ after(grammarAccess.getDSL_CEP_AVGAccess().getCommaKeyword_3());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_AVG__Group__3__Impl"
+
+
+ // $ANTLR start "rule__DSL_CEP_AVG__Group__4"
+ // InternalSensinact.g:3831:1: rule__DSL_CEP_AVG__Group__4 : rule__DSL_CEP_AVG__Group__4__Impl rule__DSL_CEP_AVG__Group__5 ;
+ public final void rule__DSL_CEP_AVG__Group__4() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3835:1: ( rule__DSL_CEP_AVG__Group__4__Impl rule__DSL_CEP_AVG__Group__5 )
+ // InternalSensinact.g:3836:2: rule__DSL_CEP_AVG__Group__4__Impl rule__DSL_CEP_AVG__Group__5
+ {
+ pushFollow(FOLLOW_25);
+ rule__DSL_CEP_AVG__Group__4__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_AVG__Group__5();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_AVG__Group__4"
+
+
+ // $ANTLR start "rule__DSL_CEP_AVG__Group__4__Impl"
+ // InternalSensinact.g:3843:1: rule__DSL_CEP_AVG__Group__4__Impl : ( ( rule__DSL_CEP_AVG__WindowAssignment_4 ) ) ;
+ public final void rule__DSL_CEP_AVG__Group__4__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3847:1: ( ( ( rule__DSL_CEP_AVG__WindowAssignment_4 ) ) )
+ // InternalSensinact.g:3848:1: ( ( rule__DSL_CEP_AVG__WindowAssignment_4 ) )
+ {
+ // InternalSensinact.g:3848:1: ( ( rule__DSL_CEP_AVG__WindowAssignment_4 ) )
+ // InternalSensinact.g:3849:2: ( rule__DSL_CEP_AVG__WindowAssignment_4 )
+ {
+ before(grammarAccess.getDSL_CEP_AVGAccess().getWindowAssignment_4());
+ // InternalSensinact.g:3850:2: ( rule__DSL_CEP_AVG__WindowAssignment_4 )
+ // InternalSensinact.g:3850:3: rule__DSL_CEP_AVG__WindowAssignment_4
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_AVG__WindowAssignment_4();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_CEP_AVGAccess().getWindowAssignment_4());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_AVG__Group__4__Impl"
+
+
+ // $ANTLR start "rule__DSL_CEP_AVG__Group__5"
+ // InternalSensinact.g:3858:1: rule__DSL_CEP_AVG__Group__5 : rule__DSL_CEP_AVG__Group__5__Impl ;
+ public final void rule__DSL_CEP_AVG__Group__5() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3862:1: ( rule__DSL_CEP_AVG__Group__5__Impl )
+ // InternalSensinact.g:3863:2: rule__DSL_CEP_AVG__Group__5__Impl
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_AVG__Group__5__Impl();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_AVG__Group__5"
+
+
+ // $ANTLR start "rule__DSL_CEP_AVG__Group__5__Impl"
+ // InternalSensinact.g:3869:1: rule__DSL_CEP_AVG__Group__5__Impl : ( ')' ) ;
+ public final void rule__DSL_CEP_AVG__Group__5__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3873:1: ( ( ')' ) )
+ // InternalSensinact.g:3874:1: ( ')' )
+ {
+ // InternalSensinact.g:3874:1: ( ')' )
+ // InternalSensinact.g:3875:2: ')'
+ {
+ before(grammarAccess.getDSL_CEP_AVGAccess().getRightParenthesisKeyword_5());
+ match(input,29,FOLLOW_2);
+ after(grammarAccess.getDSL_CEP_AVGAccess().getRightParenthesisKeyword_5());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_AVG__Group__5__Impl"
+
+
+ // $ANTLR start "rule__DSL_CEP_SUM__Group__0"
+ // InternalSensinact.g:3885:1: rule__DSL_CEP_SUM__Group__0 : rule__DSL_CEP_SUM__Group__0__Impl rule__DSL_CEP_SUM__Group__1 ;
+ public final void rule__DSL_CEP_SUM__Group__0() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3889:1: ( rule__DSL_CEP_SUM__Group__0__Impl rule__DSL_CEP_SUM__Group__1 )
+ // InternalSensinact.g:3890:2: rule__DSL_CEP_SUM__Group__0__Impl rule__DSL_CEP_SUM__Group__1
+ {
+ pushFollow(FOLLOW_24);
+ rule__DSL_CEP_SUM__Group__0__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_SUM__Group__1();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_SUM__Group__0"
+
+
+ // $ANTLR start "rule__DSL_CEP_SUM__Group__0__Impl"
+ // InternalSensinact.g:3897:1: rule__DSL_CEP_SUM__Group__0__Impl : ( 'sum' ) ;
+ public final void rule__DSL_CEP_SUM__Group__0__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3901:1: ( ( 'sum' ) )
+ // InternalSensinact.g:3902:1: ( 'sum' )
+ {
+ // InternalSensinact.g:3902:1: ( 'sum' )
+ // InternalSensinact.g:3903:2: 'sum'
+ {
+ before(grammarAccess.getDSL_CEP_SUMAccess().getSumKeyword_0());
+ match(input,37,FOLLOW_2);
+ after(grammarAccess.getDSL_CEP_SUMAccess().getSumKeyword_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_SUM__Group__0__Impl"
+
+
+ // $ANTLR start "rule__DSL_CEP_SUM__Group__1"
+ // InternalSensinact.g:3912:1: rule__DSL_CEP_SUM__Group__1 : rule__DSL_CEP_SUM__Group__1__Impl rule__DSL_CEP_SUM__Group__2 ;
+ public final void rule__DSL_CEP_SUM__Group__1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3916:1: ( rule__DSL_CEP_SUM__Group__1__Impl rule__DSL_CEP_SUM__Group__2 )
+ // InternalSensinact.g:3917:2: rule__DSL_CEP_SUM__Group__1__Impl rule__DSL_CEP_SUM__Group__2
+ {
+ pushFollow(FOLLOW_9);
+ rule__DSL_CEP_SUM__Group__1__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_SUM__Group__2();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_SUM__Group__1"
+
+
+ // $ANTLR start "rule__DSL_CEP_SUM__Group__1__Impl"
+ // InternalSensinact.g:3924:1: rule__DSL_CEP_SUM__Group__1__Impl : ( '(' ) ;
+ public final void rule__DSL_CEP_SUM__Group__1__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3928:1: ( ( '(' ) )
+ // InternalSensinact.g:3929:1: ( '(' )
+ {
+ // InternalSensinact.g:3929:1: ( '(' )
+ // InternalSensinact.g:3930:2: '('
+ {
+ before(grammarAccess.getDSL_CEP_SUMAccess().getLeftParenthesisKeyword_1());
+ match(input,28,FOLLOW_2);
+ after(grammarAccess.getDSL_CEP_SUMAccess().getLeftParenthesisKeyword_1());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_SUM__Group__1__Impl"
+
+
+ // $ANTLR start "rule__DSL_CEP_SUM__Group__2"
+ // InternalSensinact.g:3939:1: rule__DSL_CEP_SUM__Group__2 : rule__DSL_CEP_SUM__Group__2__Impl rule__DSL_CEP_SUM__Group__3 ;
+ public final void rule__DSL_CEP_SUM__Group__2() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3943:1: ( rule__DSL_CEP_SUM__Group__2__Impl rule__DSL_CEP_SUM__Group__3 )
+ // InternalSensinact.g:3944:2: rule__DSL_CEP_SUM__Group__2__Impl rule__DSL_CEP_SUM__Group__3
+ {
+ pushFollow(FOLLOW_14);
+ rule__DSL_CEP_SUM__Group__2__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_SUM__Group__3();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_SUM__Group__2"
+
+
+ // $ANTLR start "rule__DSL_CEP_SUM__Group__2__Impl"
+ // InternalSensinact.g:3951:1: rule__DSL_CEP_SUM__Group__2__Impl : ( ( rule__DSL_CEP_SUM__RefAssignment_2 ) ) ;
+ public final void rule__DSL_CEP_SUM__Group__2__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3955:1: ( ( ( rule__DSL_CEP_SUM__RefAssignment_2 ) ) )
+ // InternalSensinact.g:3956:1: ( ( rule__DSL_CEP_SUM__RefAssignment_2 ) )
+ {
+ // InternalSensinact.g:3956:1: ( ( rule__DSL_CEP_SUM__RefAssignment_2 ) )
+ // InternalSensinact.g:3957:2: ( rule__DSL_CEP_SUM__RefAssignment_2 )
+ {
+ before(grammarAccess.getDSL_CEP_SUMAccess().getRefAssignment_2());
+ // InternalSensinact.g:3958:2: ( rule__DSL_CEP_SUM__RefAssignment_2 )
+ // InternalSensinact.g:3958:3: rule__DSL_CEP_SUM__RefAssignment_2
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_SUM__RefAssignment_2();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_CEP_SUMAccess().getRefAssignment_2());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_SUM__Group__2__Impl"
+
+
+ // $ANTLR start "rule__DSL_CEP_SUM__Group__3"
+ // InternalSensinact.g:3966:1: rule__DSL_CEP_SUM__Group__3 : rule__DSL_CEP_SUM__Group__3__Impl rule__DSL_CEP_SUM__Group__4 ;
+ public final void rule__DSL_CEP_SUM__Group__3() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3970:1: ( rule__DSL_CEP_SUM__Group__3__Impl rule__DSL_CEP_SUM__Group__4 )
+ // InternalSensinact.g:3971:2: rule__DSL_CEP_SUM__Group__3__Impl rule__DSL_CEP_SUM__Group__4
+ {
+ pushFollow(FOLLOW_21);
+ rule__DSL_CEP_SUM__Group__3__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_SUM__Group__4();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_SUM__Group__3"
+
+
+ // $ANTLR start "rule__DSL_CEP_SUM__Group__3__Impl"
+ // InternalSensinact.g:3978:1: rule__DSL_CEP_SUM__Group__3__Impl : ( ',' ) ;
+ public final void rule__DSL_CEP_SUM__Group__3__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3982:1: ( ( ',' ) )
+ // InternalSensinact.g:3983:1: ( ',' )
+ {
+ // InternalSensinact.g:3983:1: ( ',' )
+ // InternalSensinact.g:3984:2: ','
+ {
+ before(grammarAccess.getDSL_CEP_SUMAccess().getCommaKeyword_3());
+ match(input,20,FOLLOW_2);
+ after(grammarAccess.getDSL_CEP_SUMAccess().getCommaKeyword_3());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_SUM__Group__3__Impl"
+
+
+ // $ANTLR start "rule__DSL_CEP_SUM__Group__4"
+ // InternalSensinact.g:3993:1: rule__DSL_CEP_SUM__Group__4 : rule__DSL_CEP_SUM__Group__4__Impl rule__DSL_CEP_SUM__Group__5 ;
+ public final void rule__DSL_CEP_SUM__Group__4() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:3997:1: ( rule__DSL_CEP_SUM__Group__4__Impl rule__DSL_CEP_SUM__Group__5 )
+ // InternalSensinact.g:3998:2: rule__DSL_CEP_SUM__Group__4__Impl rule__DSL_CEP_SUM__Group__5
+ {
+ pushFollow(FOLLOW_25);
+ rule__DSL_CEP_SUM__Group__4__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_SUM__Group__5();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_SUM__Group__4"
+
+
+ // $ANTLR start "rule__DSL_CEP_SUM__Group__4__Impl"
+ // InternalSensinact.g:4005:1: rule__DSL_CEP_SUM__Group__4__Impl : ( ( rule__DSL_CEP_SUM__WindowAssignment_4 ) ) ;
+ public final void rule__DSL_CEP_SUM__Group__4__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4009:1: ( ( ( rule__DSL_CEP_SUM__WindowAssignment_4 ) ) )
+ // InternalSensinact.g:4010:1: ( ( rule__DSL_CEP_SUM__WindowAssignment_4 ) )
+ {
+ // InternalSensinact.g:4010:1: ( ( rule__DSL_CEP_SUM__WindowAssignment_4 ) )
+ // InternalSensinact.g:4011:2: ( rule__DSL_CEP_SUM__WindowAssignment_4 )
+ {
+ before(grammarAccess.getDSL_CEP_SUMAccess().getWindowAssignment_4());
+ // InternalSensinact.g:4012:2: ( rule__DSL_CEP_SUM__WindowAssignment_4 )
+ // InternalSensinact.g:4012:3: rule__DSL_CEP_SUM__WindowAssignment_4
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_SUM__WindowAssignment_4();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_CEP_SUMAccess().getWindowAssignment_4());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_SUM__Group__4__Impl"
+
+
+ // $ANTLR start "rule__DSL_CEP_SUM__Group__5"
+ // InternalSensinact.g:4020:1: rule__DSL_CEP_SUM__Group__5 : rule__DSL_CEP_SUM__Group__5__Impl ;
+ public final void rule__DSL_CEP_SUM__Group__5() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4024:1: ( rule__DSL_CEP_SUM__Group__5__Impl )
+ // InternalSensinact.g:4025:2: rule__DSL_CEP_SUM__Group__5__Impl
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_SUM__Group__5__Impl();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_SUM__Group__5"
+
+
+ // $ANTLR start "rule__DSL_CEP_SUM__Group__5__Impl"
+ // InternalSensinact.g:4031:1: rule__DSL_CEP_SUM__Group__5__Impl : ( ')' ) ;
+ public final void rule__DSL_CEP_SUM__Group__5__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4035:1: ( ( ')' ) )
+ // InternalSensinact.g:4036:1: ( ')' )
+ {
+ // InternalSensinact.g:4036:1: ( ')' )
+ // InternalSensinact.g:4037:2: ')'
+ {
+ before(grammarAccess.getDSL_CEP_SUMAccess().getRightParenthesisKeyword_5());
+ match(input,29,FOLLOW_2);
+ after(grammarAccess.getDSL_CEP_SUMAccess().getRightParenthesisKeyword_5());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_SUM__Group__5__Impl"
+
+
+ // $ANTLR start "rule__DSL_CEP_COUNT__Group__0"
+ // InternalSensinact.g:4047:1: rule__DSL_CEP_COUNT__Group__0 : rule__DSL_CEP_COUNT__Group__0__Impl rule__DSL_CEP_COUNT__Group__1 ;
+ public final void rule__DSL_CEP_COUNT__Group__0() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4051:1: ( rule__DSL_CEP_COUNT__Group__0__Impl rule__DSL_CEP_COUNT__Group__1 )
+ // InternalSensinact.g:4052:2: rule__DSL_CEP_COUNT__Group__0__Impl rule__DSL_CEP_COUNT__Group__1
+ {
+ pushFollow(FOLLOW_24);
+ rule__DSL_CEP_COUNT__Group__0__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_COUNT__Group__1();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_COUNT__Group__0"
+
+
+ // $ANTLR start "rule__DSL_CEP_COUNT__Group__0__Impl"
+ // InternalSensinact.g:4059:1: rule__DSL_CEP_COUNT__Group__0__Impl : ( 'count' ) ;
+ public final void rule__DSL_CEP_COUNT__Group__0__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4063:1: ( ( 'count' ) )
+ // InternalSensinact.g:4064:1: ( 'count' )
+ {
+ // InternalSensinact.g:4064:1: ( 'count' )
+ // InternalSensinact.g:4065:2: 'count'
+ {
+ before(grammarAccess.getDSL_CEP_COUNTAccess().getCountKeyword_0());
+ match(input,38,FOLLOW_2);
+ after(grammarAccess.getDSL_CEP_COUNTAccess().getCountKeyword_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_COUNT__Group__0__Impl"
+
+
+ // $ANTLR start "rule__DSL_CEP_COUNT__Group__1"
+ // InternalSensinact.g:4074:1: rule__DSL_CEP_COUNT__Group__1 : rule__DSL_CEP_COUNT__Group__1__Impl rule__DSL_CEP_COUNT__Group__2 ;
+ public final void rule__DSL_CEP_COUNT__Group__1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4078:1: ( rule__DSL_CEP_COUNT__Group__1__Impl rule__DSL_CEP_COUNT__Group__2 )
+ // InternalSensinact.g:4079:2: rule__DSL_CEP_COUNT__Group__1__Impl rule__DSL_CEP_COUNT__Group__2
+ {
+ pushFollow(FOLLOW_9);
+ rule__DSL_CEP_COUNT__Group__1__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_COUNT__Group__2();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_COUNT__Group__1"
+
+
+ // $ANTLR start "rule__DSL_CEP_COUNT__Group__1__Impl"
+ // InternalSensinact.g:4086:1: rule__DSL_CEP_COUNT__Group__1__Impl : ( '(' ) ;
+ public final void rule__DSL_CEP_COUNT__Group__1__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4090:1: ( ( '(' ) )
+ // InternalSensinact.g:4091:1: ( '(' )
+ {
+ // InternalSensinact.g:4091:1: ( '(' )
+ // InternalSensinact.g:4092:2: '('
+ {
+ before(grammarAccess.getDSL_CEP_COUNTAccess().getLeftParenthesisKeyword_1());
+ match(input,28,FOLLOW_2);
+ after(grammarAccess.getDSL_CEP_COUNTAccess().getLeftParenthesisKeyword_1());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_COUNT__Group__1__Impl"
+
+
+ // $ANTLR start "rule__DSL_CEP_COUNT__Group__2"
+ // InternalSensinact.g:4101:1: rule__DSL_CEP_COUNT__Group__2 : rule__DSL_CEP_COUNT__Group__2__Impl rule__DSL_CEP_COUNT__Group__3 ;
+ public final void rule__DSL_CEP_COUNT__Group__2() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4105:1: ( rule__DSL_CEP_COUNT__Group__2__Impl rule__DSL_CEP_COUNT__Group__3 )
+ // InternalSensinact.g:4106:2: rule__DSL_CEP_COUNT__Group__2__Impl rule__DSL_CEP_COUNT__Group__3
+ {
+ pushFollow(FOLLOW_14);
+ rule__DSL_CEP_COUNT__Group__2__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_COUNT__Group__3();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_COUNT__Group__2"
+
+
+ // $ANTLR start "rule__DSL_CEP_COUNT__Group__2__Impl"
+ // InternalSensinact.g:4113:1: rule__DSL_CEP_COUNT__Group__2__Impl : ( ( rule__DSL_CEP_COUNT__RefAssignment_2 ) ) ;
+ public final void rule__DSL_CEP_COUNT__Group__2__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4117:1: ( ( ( rule__DSL_CEP_COUNT__RefAssignment_2 ) ) )
+ // InternalSensinact.g:4118:1: ( ( rule__DSL_CEP_COUNT__RefAssignment_2 ) )
+ {
+ // InternalSensinact.g:4118:1: ( ( rule__DSL_CEP_COUNT__RefAssignment_2 ) )
+ // InternalSensinact.g:4119:2: ( rule__DSL_CEP_COUNT__RefAssignment_2 )
+ {
+ before(grammarAccess.getDSL_CEP_COUNTAccess().getRefAssignment_2());
+ // InternalSensinact.g:4120:2: ( rule__DSL_CEP_COUNT__RefAssignment_2 )
+ // InternalSensinact.g:4120:3: rule__DSL_CEP_COUNT__RefAssignment_2
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_COUNT__RefAssignment_2();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_CEP_COUNTAccess().getRefAssignment_2());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_COUNT__Group__2__Impl"
+
+
+ // $ANTLR start "rule__DSL_CEP_COUNT__Group__3"
+ // InternalSensinact.g:4128:1: rule__DSL_CEP_COUNT__Group__3 : rule__DSL_CEP_COUNT__Group__3__Impl rule__DSL_CEP_COUNT__Group__4 ;
+ public final void rule__DSL_CEP_COUNT__Group__3() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4132:1: ( rule__DSL_CEP_COUNT__Group__3__Impl rule__DSL_CEP_COUNT__Group__4 )
+ // InternalSensinact.g:4133:2: rule__DSL_CEP_COUNT__Group__3__Impl rule__DSL_CEP_COUNT__Group__4
+ {
+ pushFollow(FOLLOW_21);
+ rule__DSL_CEP_COUNT__Group__3__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_COUNT__Group__4();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_COUNT__Group__3"
+
+
+ // $ANTLR start "rule__DSL_CEP_COUNT__Group__3__Impl"
+ // InternalSensinact.g:4140:1: rule__DSL_CEP_COUNT__Group__3__Impl : ( ',' ) ;
+ public final void rule__DSL_CEP_COUNT__Group__3__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4144:1: ( ( ',' ) )
+ // InternalSensinact.g:4145:1: ( ',' )
+ {
+ // InternalSensinact.g:4145:1: ( ',' )
+ // InternalSensinact.g:4146:2: ','
+ {
+ before(grammarAccess.getDSL_CEP_COUNTAccess().getCommaKeyword_3());
+ match(input,20,FOLLOW_2);
+ after(grammarAccess.getDSL_CEP_COUNTAccess().getCommaKeyword_3());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_COUNT__Group__3__Impl"
+
+
+ // $ANTLR start "rule__DSL_CEP_COUNT__Group__4"
+ // InternalSensinact.g:4155:1: rule__DSL_CEP_COUNT__Group__4 : rule__DSL_CEP_COUNT__Group__4__Impl rule__DSL_CEP_COUNT__Group__5 ;
+ public final void rule__DSL_CEP_COUNT__Group__4() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4159:1: ( rule__DSL_CEP_COUNT__Group__4__Impl rule__DSL_CEP_COUNT__Group__5 )
+ // InternalSensinact.g:4160:2: rule__DSL_CEP_COUNT__Group__4__Impl rule__DSL_CEP_COUNT__Group__5
+ {
+ pushFollow(FOLLOW_25);
+ rule__DSL_CEP_COUNT__Group__4__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_COUNT__Group__5();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_COUNT__Group__4"
+
+
+ // $ANTLR start "rule__DSL_CEP_COUNT__Group__4__Impl"
+ // InternalSensinact.g:4167:1: rule__DSL_CEP_COUNT__Group__4__Impl : ( ( rule__DSL_CEP_COUNT__WindowAssignment_4 ) ) ;
+ public final void rule__DSL_CEP_COUNT__Group__4__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4171:1: ( ( ( rule__DSL_CEP_COUNT__WindowAssignment_4 ) ) )
+ // InternalSensinact.g:4172:1: ( ( rule__DSL_CEP_COUNT__WindowAssignment_4 ) )
+ {
+ // InternalSensinact.g:4172:1: ( ( rule__DSL_CEP_COUNT__WindowAssignment_4 ) )
+ // InternalSensinact.g:4173:2: ( rule__DSL_CEP_COUNT__WindowAssignment_4 )
+ {
+ before(grammarAccess.getDSL_CEP_COUNTAccess().getWindowAssignment_4());
+ // InternalSensinact.g:4174:2: ( rule__DSL_CEP_COUNT__WindowAssignment_4 )
+ // InternalSensinact.g:4174:3: rule__DSL_CEP_COUNT__WindowAssignment_4
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_COUNT__WindowAssignment_4();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_CEP_COUNTAccess().getWindowAssignment_4());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_COUNT__Group__4__Impl"
+
+
+ // $ANTLR start "rule__DSL_CEP_COUNT__Group__5"
+ // InternalSensinact.g:4182:1: rule__DSL_CEP_COUNT__Group__5 : rule__DSL_CEP_COUNT__Group__5__Impl ;
+ public final void rule__DSL_CEP_COUNT__Group__5() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4186:1: ( rule__DSL_CEP_COUNT__Group__5__Impl )
+ // InternalSensinact.g:4187:2: rule__DSL_CEP_COUNT__Group__5__Impl
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_COUNT__Group__5__Impl();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_COUNT__Group__5"
+
+
+ // $ANTLR start "rule__DSL_CEP_COUNT__Group__5__Impl"
+ // InternalSensinact.g:4193:1: rule__DSL_CEP_COUNT__Group__5__Impl : ( ')' ) ;
+ public final void rule__DSL_CEP_COUNT__Group__5__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4197:1: ( ( ')' ) )
+ // InternalSensinact.g:4198:1: ( ')' )
+ {
+ // InternalSensinact.g:4198:1: ( ')' )
+ // InternalSensinact.g:4199:2: ')'
+ {
+ before(grammarAccess.getDSL_CEP_COUNTAccess().getRightParenthesisKeyword_5());
+ match(input,29,FOLLOW_2);
+ after(grammarAccess.getDSL_CEP_COUNTAccess().getRightParenthesisKeyword_5());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_COUNT__Group__5__Impl"
+
+
+ // $ANTLR start "rule__DSL_CEP_DURATION_MIN__Group__0"
+ // InternalSensinact.g:4209:1: rule__DSL_CEP_DURATION_MIN__Group__0 : rule__DSL_CEP_DURATION_MIN__Group__0__Impl rule__DSL_CEP_DURATION_MIN__Group__1 ;
+ public final void rule__DSL_CEP_DURATION_MIN__Group__0() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4213:1: ( rule__DSL_CEP_DURATION_MIN__Group__0__Impl rule__DSL_CEP_DURATION_MIN__Group__1 )
+ // InternalSensinact.g:4214:2: rule__DSL_CEP_DURATION_MIN__Group__0__Impl rule__DSL_CEP_DURATION_MIN__Group__1
+ {
+ pushFollow(FOLLOW_27);
+ rule__DSL_CEP_DURATION_MIN__Group__0__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_DURATION_MIN__Group__1();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_DURATION_MIN__Group__0"
+
+
+ // $ANTLR start "rule__DSL_CEP_DURATION_MIN__Group__0__Impl"
+ // InternalSensinact.g:4221:1: rule__DSL_CEP_DURATION_MIN__Group__0__Impl : ( ( rule__DSL_CEP_DURATION_MIN__MinAssignment_0 ) ) ;
+ public final void rule__DSL_CEP_DURATION_MIN__Group__0__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4225:1: ( ( ( rule__DSL_CEP_DURATION_MIN__MinAssignment_0 ) ) )
+ // InternalSensinact.g:4226:1: ( ( rule__DSL_CEP_DURATION_MIN__MinAssignment_0 ) )
+ {
+ // InternalSensinact.g:4226:1: ( ( rule__DSL_CEP_DURATION_MIN__MinAssignment_0 ) )
+ // InternalSensinact.g:4227:2: ( rule__DSL_CEP_DURATION_MIN__MinAssignment_0 )
+ {
+ before(grammarAccess.getDSL_CEP_DURATION_MINAccess().getMinAssignment_0());
+ // InternalSensinact.g:4228:2: ( rule__DSL_CEP_DURATION_MIN__MinAssignment_0 )
+ // InternalSensinact.g:4228:3: rule__DSL_CEP_DURATION_MIN__MinAssignment_0
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_DURATION_MIN__MinAssignment_0();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_CEP_DURATION_MINAccess().getMinAssignment_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_DURATION_MIN__Group__0__Impl"
+
+
+ // $ANTLR start "rule__DSL_CEP_DURATION_MIN__Group__1"
+ // InternalSensinact.g:4236:1: rule__DSL_CEP_DURATION_MIN__Group__1 : rule__DSL_CEP_DURATION_MIN__Group__1__Impl ;
+ public final void rule__DSL_CEP_DURATION_MIN__Group__1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4240:1: ( rule__DSL_CEP_DURATION_MIN__Group__1__Impl )
+ // InternalSensinact.g:4241:2: rule__DSL_CEP_DURATION_MIN__Group__1__Impl
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_DURATION_MIN__Group__1__Impl();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_DURATION_MIN__Group__1"
+
+
+ // $ANTLR start "rule__DSL_CEP_DURATION_MIN__Group__1__Impl"
+ // InternalSensinact.g:4247:1: rule__DSL_CEP_DURATION_MIN__Group__1__Impl : ( 'min' ) ;
+ public final void rule__DSL_CEP_DURATION_MIN__Group__1__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4251:1: ( ( 'min' ) )
+ // InternalSensinact.g:4252:1: ( 'min' )
+ {
+ // InternalSensinact.g:4252:1: ( 'min' )
+ // InternalSensinact.g:4253:2: 'min'
+ {
+ before(grammarAccess.getDSL_CEP_DURATION_MINAccess().getMinKeyword_1());
+ match(input,34,FOLLOW_2);
+ after(grammarAccess.getDSL_CEP_DURATION_MINAccess().getMinKeyword_1());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_DURATION_MIN__Group__1__Impl"
+
+
+ // $ANTLR start "rule__DSL_CEP_DURATION_SEC__Group__0"
+ // InternalSensinact.g:4263:1: rule__DSL_CEP_DURATION_SEC__Group__0 : rule__DSL_CEP_DURATION_SEC__Group__0__Impl rule__DSL_CEP_DURATION_SEC__Group__1 ;
+ public final void rule__DSL_CEP_DURATION_SEC__Group__0() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4267:1: ( rule__DSL_CEP_DURATION_SEC__Group__0__Impl rule__DSL_CEP_DURATION_SEC__Group__1 )
+ // InternalSensinact.g:4268:2: rule__DSL_CEP_DURATION_SEC__Group__0__Impl rule__DSL_CEP_DURATION_SEC__Group__1
+ {
+ pushFollow(FOLLOW_28);
+ rule__DSL_CEP_DURATION_SEC__Group__0__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_DURATION_SEC__Group__1();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_DURATION_SEC__Group__0"
+
+
+ // $ANTLR start "rule__DSL_CEP_DURATION_SEC__Group__0__Impl"
+ // InternalSensinact.g:4275:1: rule__DSL_CEP_DURATION_SEC__Group__0__Impl : ( ( rule__DSL_CEP_DURATION_SEC__SecAssignment_0 ) ) ;
+ public final void rule__DSL_CEP_DURATION_SEC__Group__0__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4279:1: ( ( ( rule__DSL_CEP_DURATION_SEC__SecAssignment_0 ) ) )
+ // InternalSensinact.g:4280:1: ( ( rule__DSL_CEP_DURATION_SEC__SecAssignment_0 ) )
+ {
+ // InternalSensinact.g:4280:1: ( ( rule__DSL_CEP_DURATION_SEC__SecAssignment_0 ) )
+ // InternalSensinact.g:4281:2: ( rule__DSL_CEP_DURATION_SEC__SecAssignment_0 )
+ {
+ before(grammarAccess.getDSL_CEP_DURATION_SECAccess().getSecAssignment_0());
+ // InternalSensinact.g:4282:2: ( rule__DSL_CEP_DURATION_SEC__SecAssignment_0 )
+ // InternalSensinact.g:4282:3: rule__DSL_CEP_DURATION_SEC__SecAssignment_0
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_DURATION_SEC__SecAssignment_0();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_CEP_DURATION_SECAccess().getSecAssignment_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_DURATION_SEC__Group__0__Impl"
+
+
+ // $ANTLR start "rule__DSL_CEP_DURATION_SEC__Group__1"
+ // InternalSensinact.g:4290:1: rule__DSL_CEP_DURATION_SEC__Group__1 : rule__DSL_CEP_DURATION_SEC__Group__1__Impl ;
+ public final void rule__DSL_CEP_DURATION_SEC__Group__1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4294:1: ( rule__DSL_CEP_DURATION_SEC__Group__1__Impl )
+ // InternalSensinact.g:4295:2: rule__DSL_CEP_DURATION_SEC__Group__1__Impl
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_DURATION_SEC__Group__1__Impl();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_DURATION_SEC__Group__1"
+
+
+ // $ANTLR start "rule__DSL_CEP_DURATION_SEC__Group__1__Impl"
+ // InternalSensinact.g:4301:1: rule__DSL_CEP_DURATION_SEC__Group__1__Impl : ( 'sec' ) ;
+ public final void rule__DSL_CEP_DURATION_SEC__Group__1__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4305:1: ( ( 'sec' ) )
+ // InternalSensinact.g:4306:1: ( 'sec' )
+ {
+ // InternalSensinact.g:4306:1: ( 'sec' )
+ // InternalSensinact.g:4307:2: 'sec'
+ {
+ before(grammarAccess.getDSL_CEP_DURATION_SECAccess().getSecKeyword_1());
+ match(input,39,FOLLOW_2);
+ after(grammarAccess.getDSL_CEP_DURATION_SECAccess().getSecKeyword_1());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_DURATION_SEC__Group__1__Impl"
+
+
+ // $ANTLR start "rule__DSL_ListActions__Group__0"
+ // InternalSensinact.g:4317:1: rule__DSL_ListActions__Group__0 : rule__DSL_ListActions__Group__0__Impl rule__DSL_ListActions__Group__1 ;
+ public final void rule__DSL_ListActions__Group__0() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4321:1: ( rule__DSL_ListActions__Group__0__Impl rule__DSL_ListActions__Group__1 )
+ // InternalSensinact.g:4322:2: rule__DSL_ListActions__Group__0__Impl rule__DSL_ListActions__Group__1
+ {
+ pushFollow(FOLLOW_14);
+ rule__DSL_ListActions__Group__0__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_ListActions__Group__1();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_ListActions__Group__0"
+
+
+ // $ANTLR start "rule__DSL_ListActions__Group__0__Impl"
+ // InternalSensinact.g:4329:1: rule__DSL_ListActions__Group__0__Impl : ( ( rule__DSL_ListActions__ActionListAssignment_0 ) ) ;
+ public final void rule__DSL_ListActions__Group__0__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4333:1: ( ( ( rule__DSL_ListActions__ActionListAssignment_0 ) ) )
+ // InternalSensinact.g:4334:1: ( ( rule__DSL_ListActions__ActionListAssignment_0 ) )
+ {
+ // InternalSensinact.g:4334:1: ( ( rule__DSL_ListActions__ActionListAssignment_0 ) )
+ // InternalSensinact.g:4335:2: ( rule__DSL_ListActions__ActionListAssignment_0 )
+ {
+ before(grammarAccess.getDSL_ListActionsAccess().getActionListAssignment_0());
+ // InternalSensinact.g:4336:2: ( rule__DSL_ListActions__ActionListAssignment_0 )
+ // InternalSensinact.g:4336:3: rule__DSL_ListActions__ActionListAssignment_0
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_ListActions__ActionListAssignment_0();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_ListActionsAccess().getActionListAssignment_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_ListActions__Group__0__Impl"
+
+
+ // $ANTLR start "rule__DSL_ListActions__Group__1"
+ // InternalSensinact.g:4344:1: rule__DSL_ListActions__Group__1 : rule__DSL_ListActions__Group__1__Impl ;
+ public final void rule__DSL_ListActions__Group__1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4348:1: ( rule__DSL_ListActions__Group__1__Impl )
+ // InternalSensinact.g:4349:2: rule__DSL_ListActions__Group__1__Impl
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_ListActions__Group__1__Impl();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_ListActions__Group__1"
+
+
+ // $ANTLR start "rule__DSL_ListActions__Group__1__Impl"
+ // InternalSensinact.g:4355:1: rule__DSL_ListActions__Group__1__Impl : ( ( rule__DSL_ListActions__Group_1__0 )* ) ;
+ public final void rule__DSL_ListActions__Group__1__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4359:1: ( ( ( rule__DSL_ListActions__Group_1__0 )* ) )
+ // InternalSensinact.g:4360:1: ( ( rule__DSL_ListActions__Group_1__0 )* )
+ {
+ // InternalSensinact.g:4360:1: ( ( rule__DSL_ListActions__Group_1__0 )* )
+ // InternalSensinact.g:4361:2: ( rule__DSL_ListActions__Group_1__0 )*
+ {
+ before(grammarAccess.getDSL_ListActionsAccess().getGroup_1());
+ // InternalSensinact.g:4362:2: ( rule__DSL_ListActions__Group_1__0 )*
+ loop19:
+ do {
+ int alt19=2;
+ int LA19_0 = input.LA(1);
+
+ if ( (LA19_0==20) ) {
+ alt19=1;
+ }
+
+
+ switch (alt19) {
+ case 1 :
+ // InternalSensinact.g:4362:3: rule__DSL_ListActions__Group_1__0
+ {
+ pushFollow(FOLLOW_15);
+ rule__DSL_ListActions__Group_1__0();
+
+ state._fsp--;
+
+
+ }
+ break;
+
+ default :
+ break loop19;
+ }
+ } while (true);
+
+ after(grammarAccess.getDSL_ListActionsAccess().getGroup_1());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_ListActions__Group__1__Impl"
+
+
+ // $ANTLR start "rule__DSL_ListActions__Group_1__0"
+ // InternalSensinact.g:4371:1: rule__DSL_ListActions__Group_1__0 : rule__DSL_ListActions__Group_1__0__Impl rule__DSL_ListActions__Group_1__1 ;
+ public final void rule__DSL_ListActions__Group_1__0() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4375:1: ( rule__DSL_ListActions__Group_1__0__Impl rule__DSL_ListActions__Group_1__1 )
+ // InternalSensinact.g:4376:2: rule__DSL_ListActions__Group_1__0__Impl rule__DSL_ListActions__Group_1__1
+ {
+ pushFollow(FOLLOW_9);
+ rule__DSL_ListActions__Group_1__0__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_ListActions__Group_1__1();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_ListActions__Group_1__0"
+
+
+ // $ANTLR start "rule__DSL_ListActions__Group_1__0__Impl"
+ // InternalSensinact.g:4383:1: rule__DSL_ListActions__Group_1__0__Impl : ( ',' ) ;
+ public final void rule__DSL_ListActions__Group_1__0__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4387:1: ( ( ',' ) )
+ // InternalSensinact.g:4388:1: ( ',' )
+ {
+ // InternalSensinact.g:4388:1: ( ',' )
+ // InternalSensinact.g:4389:2: ','
+ {
+ before(grammarAccess.getDSL_ListActionsAccess().getCommaKeyword_1_0());
+ match(input,20,FOLLOW_2);
+ after(grammarAccess.getDSL_ListActionsAccess().getCommaKeyword_1_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_ListActions__Group_1__0__Impl"
+
+
+ // $ANTLR start "rule__DSL_ListActions__Group_1__1"
+ // InternalSensinact.g:4398:1: rule__DSL_ListActions__Group_1__1 : rule__DSL_ListActions__Group_1__1__Impl ;
+ public final void rule__DSL_ListActions__Group_1__1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4402:1: ( rule__DSL_ListActions__Group_1__1__Impl )
+ // InternalSensinact.g:4403:2: rule__DSL_ListActions__Group_1__1__Impl
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_ListActions__Group_1__1__Impl();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_ListActions__Group_1__1"
+
+
+ // $ANTLR start "rule__DSL_ListActions__Group_1__1__Impl"
+ // InternalSensinact.g:4409:1: rule__DSL_ListActions__Group_1__1__Impl : ( ( rule__DSL_ListActions__ActionListAssignment_1_1 ) ) ;
+ public final void rule__DSL_ListActions__Group_1__1__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4413:1: ( ( ( rule__DSL_ListActions__ActionListAssignment_1_1 ) ) )
+ // InternalSensinact.g:4414:1: ( ( rule__DSL_ListActions__ActionListAssignment_1_1 ) )
+ {
+ // InternalSensinact.g:4414:1: ( ( rule__DSL_ListActions__ActionListAssignment_1_1 ) )
+ // InternalSensinact.g:4415:2: ( rule__DSL_ListActions__ActionListAssignment_1_1 )
+ {
+ before(grammarAccess.getDSL_ListActionsAccess().getActionListAssignment_1_1());
+ // InternalSensinact.g:4416:2: ( rule__DSL_ListActions__ActionListAssignment_1_1 )
+ // InternalSensinact.g:4416:3: rule__DSL_ListActions__ActionListAssignment_1_1
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_ListActions__ActionListAssignment_1_1();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_ListActionsAccess().getActionListAssignment_1_1());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_ListActions__Group_1__1__Impl"
+
+
+ // $ANTLR start "rule__DSL_ResourceAction__Group__0"
+ // InternalSensinact.g:4425:1: rule__DSL_ResourceAction__Group__0 : rule__DSL_ResourceAction__Group__0__Impl rule__DSL_ResourceAction__Group__1 ;
+ public final void rule__DSL_ResourceAction__Group__0() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4429:1: ( rule__DSL_ResourceAction__Group__0__Impl rule__DSL_ResourceAction__Group__1 )
+ // InternalSensinact.g:4430:2: rule__DSL_ResourceAction__Group__0__Impl rule__DSL_ResourceAction__Group__1
+ {
+ pushFollow(FOLLOW_9);
+ rule__DSL_ResourceAction__Group__0__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_ResourceAction__Group__1();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_ResourceAction__Group__0"
+
+
+ // $ANTLR start "rule__DSL_ResourceAction__Group__0__Impl"
+ // InternalSensinact.g:4437:1: rule__DSL_ResourceAction__Group__0__Impl : ( ( rule__DSL_ResourceAction__Group_0__0 )? ) ;
+ public final void rule__DSL_ResourceAction__Group__0__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4441:1: ( ( ( rule__DSL_ResourceAction__Group_0__0 )? ) )
+ // InternalSensinact.g:4442:1: ( ( rule__DSL_ResourceAction__Group_0__0 )? )
+ {
+ // InternalSensinact.g:4442:1: ( ( rule__DSL_ResourceAction__Group_0__0 )? )
+ // InternalSensinact.g:4443:2: ( rule__DSL_ResourceAction__Group_0__0 )?
+ {
+ before(grammarAccess.getDSL_ResourceActionAccess().getGroup_0());
+ // InternalSensinact.g:4444:2: ( rule__DSL_ResourceAction__Group_0__0 )?
+ int alt20=2;
+ int LA20_0 = input.LA(1);
+
+ if ( (LA20_0==RULE_ID) ) {
+ int LA20_1 = input.LA(2);
+
+ if ( (LA20_1==15) ) {
+ alt20=1;
+ }
+ }
+ switch (alt20) {
+ case 1 :
+ // InternalSensinact.g:4444:3: rule__DSL_ResourceAction__Group_0__0
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_ResourceAction__Group_0__0();
+
+ state._fsp--;
+
+
+ }
+ break;
+
+ }
+
+ after(grammarAccess.getDSL_ResourceActionAccess().getGroup_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_ResourceAction__Group__0__Impl"
+
+
+ // $ANTLR start "rule__DSL_ResourceAction__Group__1"
+ // InternalSensinact.g:4452:1: rule__DSL_ResourceAction__Group__1 : rule__DSL_ResourceAction__Group__1__Impl rule__DSL_ResourceAction__Group__2 ;
+ public final void rule__DSL_ResourceAction__Group__1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4456:1: ( rule__DSL_ResourceAction__Group__1__Impl rule__DSL_ResourceAction__Group__2 )
+ // InternalSensinact.g:4457:2: rule__DSL_ResourceAction__Group__1__Impl rule__DSL_ResourceAction__Group__2
+ {
+ pushFollow(FOLLOW_20);
+ rule__DSL_ResourceAction__Group__1__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_ResourceAction__Group__2();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_ResourceAction__Group__1"
+
+
+ // $ANTLR start "rule__DSL_ResourceAction__Group__1__Impl"
+ // InternalSensinact.g:4464:1: rule__DSL_ResourceAction__Group__1__Impl : ( ( rule__DSL_ResourceAction__RefAssignment_1 ) ) ;
+ public final void rule__DSL_ResourceAction__Group__1__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4468:1: ( ( ( rule__DSL_ResourceAction__RefAssignment_1 ) ) )
+ // InternalSensinact.g:4469:1: ( ( rule__DSL_ResourceAction__RefAssignment_1 ) )
+ {
+ // InternalSensinact.g:4469:1: ( ( rule__DSL_ResourceAction__RefAssignment_1 ) )
+ // InternalSensinact.g:4470:2: ( rule__DSL_ResourceAction__RefAssignment_1 )
+ {
+ before(grammarAccess.getDSL_ResourceActionAccess().getRefAssignment_1());
+ // InternalSensinact.g:4471:2: ( rule__DSL_ResourceAction__RefAssignment_1 )
+ // InternalSensinact.g:4471:3: rule__DSL_ResourceAction__RefAssignment_1
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_ResourceAction__RefAssignment_1();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_ResourceActionAccess().getRefAssignment_1());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_ResourceAction__Group__1__Impl"
+
+
+ // $ANTLR start "rule__DSL_ResourceAction__Group__2"
+ // InternalSensinact.g:4479:1: rule__DSL_ResourceAction__Group__2 : rule__DSL_ResourceAction__Group__2__Impl rule__DSL_ResourceAction__Group__3 ;
+ public final void rule__DSL_ResourceAction__Group__2() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4483:1: ( rule__DSL_ResourceAction__Group__2__Impl rule__DSL_ResourceAction__Group__3 )
+ // InternalSensinact.g:4484:2: rule__DSL_ResourceAction__Group__2__Impl rule__DSL_ResourceAction__Group__3
+ {
+ pushFollow(FOLLOW_29);
+ rule__DSL_ResourceAction__Group__2__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_ResourceAction__Group__3();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_ResourceAction__Group__2"
+
+
+ // $ANTLR start "rule__DSL_ResourceAction__Group__2__Impl"
+ // InternalSensinact.g:4491:1: rule__DSL_ResourceAction__Group__2__Impl : ( '.' ) ;
+ public final void rule__DSL_ResourceAction__Group__2__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4495:1: ( ( '.' ) )
+ // InternalSensinact.g:4496:1: ( '.' )
+ {
+ // InternalSensinact.g:4496:1: ( '.' )
+ // InternalSensinact.g:4497:2: '.'
+ {
+ before(grammarAccess.getDSL_ResourceActionAccess().getFullStopKeyword_2());
+ match(input,26,FOLLOW_2);
+ after(grammarAccess.getDSL_ResourceActionAccess().getFullStopKeyword_2());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_ResourceAction__Group__2__Impl"
+
+
+ // $ANTLR start "rule__DSL_ResourceAction__Group__3"
+ // InternalSensinact.g:4506:1: rule__DSL_ResourceAction__Group__3 : rule__DSL_ResourceAction__Group__3__Impl rule__DSL_ResourceAction__Group__4 ;
+ public final void rule__DSL_ResourceAction__Group__3() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4510:1: ( rule__DSL_ResourceAction__Group__3__Impl rule__DSL_ResourceAction__Group__4 )
+ // InternalSensinact.g:4511:2: rule__DSL_ResourceAction__Group__3__Impl rule__DSL_ResourceAction__Group__4
+ {
+ pushFollow(FOLLOW_24);
+ rule__DSL_ResourceAction__Group__3__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_ResourceAction__Group__4();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_ResourceAction__Group__3"
+
+
+ // $ANTLR start "rule__DSL_ResourceAction__Group__3__Impl"
+ // InternalSensinact.g:4518:1: rule__DSL_ResourceAction__Group__3__Impl : ( ( rule__DSL_ResourceAction__ActiontypeAssignment_3 ) ) ;
+ public final void rule__DSL_ResourceAction__Group__3__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4522:1: ( ( ( rule__DSL_ResourceAction__ActiontypeAssignment_3 ) ) )
+ // InternalSensinact.g:4523:1: ( ( rule__DSL_ResourceAction__ActiontypeAssignment_3 ) )
+ {
+ // InternalSensinact.g:4523:1: ( ( rule__DSL_ResourceAction__ActiontypeAssignment_3 ) )
+ // InternalSensinact.g:4524:2: ( rule__DSL_ResourceAction__ActiontypeAssignment_3 )
+ {
+ before(grammarAccess.getDSL_ResourceActionAccess().getActiontypeAssignment_3());
+ // InternalSensinact.g:4525:2: ( rule__DSL_ResourceAction__ActiontypeAssignment_3 )
+ // InternalSensinact.g:4525:3: rule__DSL_ResourceAction__ActiontypeAssignment_3
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_ResourceAction__ActiontypeAssignment_3();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_ResourceActionAccess().getActiontypeAssignment_3());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_ResourceAction__Group__3__Impl"
+
+
+ // $ANTLR start "rule__DSL_ResourceAction__Group__4"
+ // InternalSensinact.g:4533:1: rule__DSL_ResourceAction__Group__4 : rule__DSL_ResourceAction__Group__4__Impl rule__DSL_ResourceAction__Group__5 ;
+ public final void rule__DSL_ResourceAction__Group__4() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4537:1: ( rule__DSL_ResourceAction__Group__4__Impl rule__DSL_ResourceAction__Group__5 )
+ // InternalSensinact.g:4538:2: rule__DSL_ResourceAction__Group__4__Impl rule__DSL_ResourceAction__Group__5
+ {
+ pushFollow(FOLLOW_30);
+ rule__DSL_ResourceAction__Group__4__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_ResourceAction__Group__5();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_ResourceAction__Group__4"
+
+
+ // $ANTLR start "rule__DSL_ResourceAction__Group__4__Impl"
+ // InternalSensinact.g:4545:1: rule__DSL_ResourceAction__Group__4__Impl : ( '(' ) ;
+ public final void rule__DSL_ResourceAction__Group__4__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4549:1: ( ( '(' ) )
+ // InternalSensinact.g:4550:1: ( '(' )
+ {
+ // InternalSensinact.g:4550:1: ( '(' )
+ // InternalSensinact.g:4551:2: '('
+ {
+ before(grammarAccess.getDSL_ResourceActionAccess().getLeftParenthesisKeyword_4());
+ match(input,28,FOLLOW_2);
+ after(grammarAccess.getDSL_ResourceActionAccess().getLeftParenthesisKeyword_4());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_ResourceAction__Group__4__Impl"
+
+
+ // $ANTLR start "rule__DSL_ResourceAction__Group__5"
+ // InternalSensinact.g:4560:1: rule__DSL_ResourceAction__Group__5 : rule__DSL_ResourceAction__Group__5__Impl rule__DSL_ResourceAction__Group__6 ;
+ public final void rule__DSL_ResourceAction__Group__5() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4564:1: ( rule__DSL_ResourceAction__Group__5__Impl rule__DSL_ResourceAction__Group__6 )
+ // InternalSensinact.g:4565:2: rule__DSL_ResourceAction__Group__5__Impl rule__DSL_ResourceAction__Group__6
+ {
+ pushFollow(FOLLOW_30);
+ rule__DSL_ResourceAction__Group__5__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_ResourceAction__Group__6();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_ResourceAction__Group__5"
+
+
+ // $ANTLR start "rule__DSL_ResourceAction__Group__5__Impl"
+ // InternalSensinact.g:4572:1: rule__DSL_ResourceAction__Group__5__Impl : ( ( rule__DSL_ResourceAction__ListParamAssignment_5 )? ) ;
+ public final void rule__DSL_ResourceAction__Group__5__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4576:1: ( ( ( rule__DSL_ResourceAction__ListParamAssignment_5 )? ) )
+ // InternalSensinact.g:4577:1: ( ( rule__DSL_ResourceAction__ListParamAssignment_5 )? )
+ {
+ // InternalSensinact.g:4577:1: ( ( rule__DSL_ResourceAction__ListParamAssignment_5 )? )
+ // InternalSensinact.g:4578:2: ( rule__DSL_ResourceAction__ListParamAssignment_5 )?
+ {
+ before(grammarAccess.getDSL_ResourceActionAccess().getListParamAssignment_5());
+ // InternalSensinact.g:4579:2: ( rule__DSL_ResourceAction__ListParamAssignment_5 )?
+ int alt21=2;
+ int LA21_0 = input.LA(1);
+
+ if ( ((LA21_0>=RULE_INT && LA21_0<=RULE_BOOLEAN)||LA21_0==28||LA21_0==53) ) {
+ alt21=1;
+ }
+ switch (alt21) {
+ case 1 :
+ // InternalSensinact.g:4579:3: rule__DSL_ResourceAction__ListParamAssignment_5
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_ResourceAction__ListParamAssignment_5();
+
+ state._fsp--;
+
+
+ }
+ break;
+
+ }
+
+ after(grammarAccess.getDSL_ResourceActionAccess().getListParamAssignment_5());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_ResourceAction__Group__5__Impl"
+
+
+ // $ANTLR start "rule__DSL_ResourceAction__Group__6"
+ // InternalSensinact.g:4587:1: rule__DSL_ResourceAction__Group__6 : rule__DSL_ResourceAction__Group__6__Impl ;
+ public final void rule__DSL_ResourceAction__Group__6() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4591:1: ( rule__DSL_ResourceAction__Group__6__Impl )
+ // InternalSensinact.g:4592:2: rule__DSL_ResourceAction__Group__6__Impl
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_ResourceAction__Group__6__Impl();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_ResourceAction__Group__6"
+
+
+ // $ANTLR start "rule__DSL_ResourceAction__Group__6__Impl"
+ // InternalSensinact.g:4598:1: rule__DSL_ResourceAction__Group__6__Impl : ( ')' ) ;
+ public final void rule__DSL_ResourceAction__Group__6__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4602:1: ( ( ')' ) )
+ // InternalSensinact.g:4603:1: ( ')' )
+ {
+ // InternalSensinact.g:4603:1: ( ')' )
+ // InternalSensinact.g:4604:2: ')'
+ {
+ before(grammarAccess.getDSL_ResourceActionAccess().getRightParenthesisKeyword_6());
+ match(input,29,FOLLOW_2);
+ after(grammarAccess.getDSL_ResourceActionAccess().getRightParenthesisKeyword_6());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_ResourceAction__Group__6__Impl"
+
+
+ // $ANTLR start "rule__DSL_ResourceAction__Group_0__0"
+ // InternalSensinact.g:4614:1: rule__DSL_ResourceAction__Group_0__0 : rule__DSL_ResourceAction__Group_0__0__Impl rule__DSL_ResourceAction__Group_0__1 ;
+ public final void rule__DSL_ResourceAction__Group_0__0() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4618:1: ( rule__DSL_ResourceAction__Group_0__0__Impl rule__DSL_ResourceAction__Group_0__1 )
+ // InternalSensinact.g:4619:2: rule__DSL_ResourceAction__Group_0__0__Impl rule__DSL_ResourceAction__Group_0__1
+ {
+ pushFollow(FOLLOW_10);
+ rule__DSL_ResourceAction__Group_0__0__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_ResourceAction__Group_0__1();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_ResourceAction__Group_0__0"
+
+
+ // $ANTLR start "rule__DSL_ResourceAction__Group_0__0__Impl"
+ // InternalSensinact.g:4626:1: rule__DSL_ResourceAction__Group_0__0__Impl : ( ( rule__DSL_ResourceAction__VariableAssignment_0_0 ) ) ;
+ public final void rule__DSL_ResourceAction__Group_0__0__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4630:1: ( ( ( rule__DSL_ResourceAction__VariableAssignment_0_0 ) ) )
+ // InternalSensinact.g:4631:1: ( ( rule__DSL_ResourceAction__VariableAssignment_0_0 ) )
+ {
+ // InternalSensinact.g:4631:1: ( ( rule__DSL_ResourceAction__VariableAssignment_0_0 ) )
+ // InternalSensinact.g:4632:2: ( rule__DSL_ResourceAction__VariableAssignment_0_0 )
+ {
+ before(grammarAccess.getDSL_ResourceActionAccess().getVariableAssignment_0_0());
+ // InternalSensinact.g:4633:2: ( rule__DSL_ResourceAction__VariableAssignment_0_0 )
+ // InternalSensinact.g:4633:3: rule__DSL_ResourceAction__VariableAssignment_0_0
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_ResourceAction__VariableAssignment_0_0();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_ResourceActionAccess().getVariableAssignment_0_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_ResourceAction__Group_0__0__Impl"
+
+
+ // $ANTLR start "rule__DSL_ResourceAction__Group_0__1"
+ // InternalSensinact.g:4641:1: rule__DSL_ResourceAction__Group_0__1 : rule__DSL_ResourceAction__Group_0__1__Impl ;
+ public final void rule__DSL_ResourceAction__Group_0__1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4645:1: ( rule__DSL_ResourceAction__Group_0__1__Impl )
+ // InternalSensinact.g:4646:2: rule__DSL_ResourceAction__Group_0__1__Impl
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_ResourceAction__Group_0__1__Impl();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_ResourceAction__Group_0__1"
+
+
+ // $ANTLR start "rule__DSL_ResourceAction__Group_0__1__Impl"
+ // InternalSensinact.g:4652:1: rule__DSL_ResourceAction__Group_0__1__Impl : ( '=' ) ;
+ public final void rule__DSL_ResourceAction__Group_0__1__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4656:1: ( ( '=' ) )
+ // InternalSensinact.g:4657:1: ( '=' )
+ {
+ // InternalSensinact.g:4657:1: ( '=' )
+ // InternalSensinact.g:4658:2: '='
+ {
+ before(grammarAccess.getDSL_ResourceActionAccess().getEqualsSignKeyword_0_1());
+ match(input,15,FOLLOW_2);
+ after(grammarAccess.getDSL_ResourceActionAccess().getEqualsSignKeyword_0_1());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_ResourceAction__Group_0__1__Impl"
+
+
+ // $ANTLR start "rule__DSL_ListParam__Group__0"
+ // InternalSensinact.g:4668:1: rule__DSL_ListParam__Group__0 : rule__DSL_ListParam__Group__0__Impl rule__DSL_ListParam__Group__1 ;
+ public final void rule__DSL_ListParam__Group__0() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4672:1: ( rule__DSL_ListParam__Group__0__Impl rule__DSL_ListParam__Group__1 )
+ // InternalSensinact.g:4673:2: rule__DSL_ListParam__Group__0__Impl rule__DSL_ListParam__Group__1
+ {
+ pushFollow(FOLLOW_14);
+ rule__DSL_ListParam__Group__0__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_ListParam__Group__1();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_ListParam__Group__0"
+
+
+ // $ANTLR start "rule__DSL_ListParam__Group__0__Impl"
+ // InternalSensinact.g:4680:1: rule__DSL_ListParam__Group__0__Impl : ( ( rule__DSL_ListParam__ParamAssignment_0 ) ) ;
+ public final void rule__DSL_ListParam__Group__0__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4684:1: ( ( ( rule__DSL_ListParam__ParamAssignment_0 ) ) )
+ // InternalSensinact.g:4685:1: ( ( rule__DSL_ListParam__ParamAssignment_0 ) )
+ {
+ // InternalSensinact.g:4685:1: ( ( rule__DSL_ListParam__ParamAssignment_0 ) )
+ // InternalSensinact.g:4686:2: ( rule__DSL_ListParam__ParamAssignment_0 )
+ {
+ before(grammarAccess.getDSL_ListParamAccess().getParamAssignment_0());
+ // InternalSensinact.g:4687:2: ( rule__DSL_ListParam__ParamAssignment_0 )
+ // InternalSensinact.g:4687:3: rule__DSL_ListParam__ParamAssignment_0
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_ListParam__ParamAssignment_0();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_ListParamAccess().getParamAssignment_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_ListParam__Group__0__Impl"
+
+
+ // $ANTLR start "rule__DSL_ListParam__Group__1"
+ // InternalSensinact.g:4695:1: rule__DSL_ListParam__Group__1 : rule__DSL_ListParam__Group__1__Impl ;
+ public final void rule__DSL_ListParam__Group__1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4699:1: ( rule__DSL_ListParam__Group__1__Impl )
+ // InternalSensinact.g:4700:2: rule__DSL_ListParam__Group__1__Impl
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_ListParam__Group__1__Impl();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_ListParam__Group__1"
+
+
+ // $ANTLR start "rule__DSL_ListParam__Group__1__Impl"
+ // InternalSensinact.g:4706:1: rule__DSL_ListParam__Group__1__Impl : ( ( rule__DSL_ListParam__Group_1__0 )* ) ;
+ public final void rule__DSL_ListParam__Group__1__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4710:1: ( ( ( rule__DSL_ListParam__Group_1__0 )* ) )
+ // InternalSensinact.g:4711:1: ( ( rule__DSL_ListParam__Group_1__0 )* )
+ {
+ // InternalSensinact.g:4711:1: ( ( rule__DSL_ListParam__Group_1__0 )* )
+ // InternalSensinact.g:4712:2: ( rule__DSL_ListParam__Group_1__0 )*
+ {
+ before(grammarAccess.getDSL_ListParamAccess().getGroup_1());
+ // InternalSensinact.g:4713:2: ( rule__DSL_ListParam__Group_1__0 )*
+ loop22:
+ do {
+ int alt22=2;
+ int LA22_0 = input.LA(1);
+
+ if ( (LA22_0==20) ) {
+ alt22=1;
+ }
+
+
+ switch (alt22) {
+ case 1 :
+ // InternalSensinact.g:4713:3: rule__DSL_ListParam__Group_1__0
+ {
+ pushFollow(FOLLOW_15);
+ rule__DSL_ListParam__Group_1__0();
+
+ state._fsp--;
+
+
+ }
+ break;
+
+ default :
+ break loop22;
+ }
+ } while (true);
+
+ after(grammarAccess.getDSL_ListParamAccess().getGroup_1());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_ListParam__Group__1__Impl"
+
+
+ // $ANTLR start "rule__DSL_ListParam__Group_1__0"
+ // InternalSensinact.g:4722:1: rule__DSL_ListParam__Group_1__0 : rule__DSL_ListParam__Group_1__0__Impl rule__DSL_ListParam__Group_1__1 ;
+ public final void rule__DSL_ListParam__Group_1__0() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4726:1: ( rule__DSL_ListParam__Group_1__0__Impl rule__DSL_ListParam__Group_1__1 )
+ // InternalSensinact.g:4727:2: rule__DSL_ListParam__Group_1__0__Impl rule__DSL_ListParam__Group_1__1
+ {
+ pushFollow(FOLLOW_18);
+ rule__DSL_ListParam__Group_1__0__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_ListParam__Group_1__1();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_ListParam__Group_1__0"
+
+
+ // $ANTLR start "rule__DSL_ListParam__Group_1__0__Impl"
+ // InternalSensinact.g:4734:1: rule__DSL_ListParam__Group_1__0__Impl : ( ',' ) ;
+ public final void rule__DSL_ListParam__Group_1__0__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4738:1: ( ( ',' ) )
+ // InternalSensinact.g:4739:1: ( ',' )
+ {
+ // InternalSensinact.g:4739:1: ( ',' )
+ // InternalSensinact.g:4740:2: ','
+ {
+ before(grammarAccess.getDSL_ListParamAccess().getCommaKeyword_1_0());
+ match(input,20,FOLLOW_2);
+ after(grammarAccess.getDSL_ListParamAccess().getCommaKeyword_1_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_ListParam__Group_1__0__Impl"
+
+
+ // $ANTLR start "rule__DSL_ListParam__Group_1__1"
+ // InternalSensinact.g:4749:1: rule__DSL_ListParam__Group_1__1 : rule__DSL_ListParam__Group_1__1__Impl ;
+ public final void rule__DSL_ListParam__Group_1__1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4753:1: ( rule__DSL_ListParam__Group_1__1__Impl )
+ // InternalSensinact.g:4754:2: rule__DSL_ListParam__Group_1__1__Impl
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_ListParam__Group_1__1__Impl();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_ListParam__Group_1__1"
+
+
+ // $ANTLR start "rule__DSL_ListParam__Group_1__1__Impl"
+ // InternalSensinact.g:4760:1: rule__DSL_ListParam__Group_1__1__Impl : ( ( rule__DSL_ListParam__ParamAssignment_1_1 ) ) ;
+ public final void rule__DSL_ListParam__Group_1__1__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4764:1: ( ( ( rule__DSL_ListParam__ParamAssignment_1_1 ) ) )
+ // InternalSensinact.g:4765:1: ( ( rule__DSL_ListParam__ParamAssignment_1_1 ) )
+ {
+ // InternalSensinact.g:4765:1: ( ( rule__DSL_ListParam__ParamAssignment_1_1 ) )
+ // InternalSensinact.g:4766:2: ( rule__DSL_ListParam__ParamAssignment_1_1 )
+ {
+ before(grammarAccess.getDSL_ListParamAccess().getParamAssignment_1_1());
+ // InternalSensinact.g:4767:2: ( rule__DSL_ListParam__ParamAssignment_1_1 )
+ // InternalSensinact.g:4767:3: rule__DSL_ListParam__ParamAssignment_1_1
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_ListParam__ParamAssignment_1_1();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_ListParamAccess().getParamAssignment_1_1());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_ListParam__Group_1__1__Impl"
+
+
+ // $ANTLR start "rule__DSL_Expression_Or__Group__0"
+ // InternalSensinact.g:4776:1: rule__DSL_Expression_Or__Group__0 : rule__DSL_Expression_Or__Group__0__Impl rule__DSL_Expression_Or__Group__1 ;
+ public final void rule__DSL_Expression_Or__Group__0() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4780:1: ( rule__DSL_Expression_Or__Group__0__Impl rule__DSL_Expression_Or__Group__1 )
+ // InternalSensinact.g:4781:2: rule__DSL_Expression_Or__Group__0__Impl rule__DSL_Expression_Or__Group__1
+ {
+ pushFollow(FOLLOW_31);
+ rule__DSL_Expression_Or__Group__0__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_Or__Group__1();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Or__Group__0"
+
+
+ // $ANTLR start "rule__DSL_Expression_Or__Group__0__Impl"
+ // InternalSensinact.g:4788:1: rule__DSL_Expression_Or__Group__0__Impl : ( ruleDSL_Expression_And ) ;
+ public final void rule__DSL_Expression_Or__Group__0__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4792:1: ( ( ruleDSL_Expression_And ) )
+ // InternalSensinact.g:4793:1: ( ruleDSL_Expression_And )
+ {
+ // InternalSensinact.g:4793:1: ( ruleDSL_Expression_And )
+ // InternalSensinact.g:4794:2: ruleDSL_Expression_And
+ {
+ before(grammarAccess.getDSL_Expression_OrAccess().getDSL_Expression_AndParserRuleCall_0());
+ pushFollow(FOLLOW_2);
+ ruleDSL_Expression_And();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_Expression_OrAccess().getDSL_Expression_AndParserRuleCall_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Or__Group__0__Impl"
+
+
+ // $ANTLR start "rule__DSL_Expression_Or__Group__1"
+ // InternalSensinact.g:4803:1: rule__DSL_Expression_Or__Group__1 : rule__DSL_Expression_Or__Group__1__Impl ;
+ public final void rule__DSL_Expression_Or__Group__1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4807:1: ( rule__DSL_Expression_Or__Group__1__Impl )
+ // InternalSensinact.g:4808:2: rule__DSL_Expression_Or__Group__1__Impl
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_Or__Group__1__Impl();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Or__Group__1"
+
+
+ // $ANTLR start "rule__DSL_Expression_Or__Group__1__Impl"
+ // InternalSensinact.g:4814:1: rule__DSL_Expression_Or__Group__1__Impl : ( ( rule__DSL_Expression_Or__Group_1__0 )* ) ;
+ public final void rule__DSL_Expression_Or__Group__1__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4818:1: ( ( ( rule__DSL_Expression_Or__Group_1__0 )* ) )
+ // InternalSensinact.g:4819:1: ( ( rule__DSL_Expression_Or__Group_1__0 )* )
+ {
+ // InternalSensinact.g:4819:1: ( ( rule__DSL_Expression_Or__Group_1__0 )* )
+ // InternalSensinact.g:4820:2: ( rule__DSL_Expression_Or__Group_1__0 )*
+ {
+ before(grammarAccess.getDSL_Expression_OrAccess().getGroup_1());
+ // InternalSensinact.g:4821:2: ( rule__DSL_Expression_Or__Group_1__0 )*
+ loop23:
+ do {
+ int alt23=2;
+ int LA23_0 = input.LA(1);
+
+ if ( (LA23_0==40) ) {
+ alt23=1;
+ }
+
+
+ switch (alt23) {
+ case 1 :
+ // InternalSensinact.g:4821:3: rule__DSL_Expression_Or__Group_1__0
+ {
+ pushFollow(FOLLOW_32);
+ rule__DSL_Expression_Or__Group_1__0();
+
+ state._fsp--;
+
+
+ }
+ break;
+
+ default :
+ break loop23;
+ }
+ } while (true);
+
+ after(grammarAccess.getDSL_Expression_OrAccess().getGroup_1());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Or__Group__1__Impl"
+
+
+ // $ANTLR start "rule__DSL_Expression_Or__Group_1__0"
+ // InternalSensinact.g:4830:1: rule__DSL_Expression_Or__Group_1__0 : rule__DSL_Expression_Or__Group_1__0__Impl rule__DSL_Expression_Or__Group_1__1 ;
+ public final void rule__DSL_Expression_Or__Group_1__0() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4834:1: ( rule__DSL_Expression_Or__Group_1__0__Impl rule__DSL_Expression_Or__Group_1__1 )
+ // InternalSensinact.g:4835:2: rule__DSL_Expression_Or__Group_1__0__Impl rule__DSL_Expression_Or__Group_1__1
+ {
+ pushFollow(FOLLOW_18);
+ rule__DSL_Expression_Or__Group_1__0__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_Or__Group_1__1();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Or__Group_1__0"
+
+
+ // $ANTLR start "rule__DSL_Expression_Or__Group_1__0__Impl"
+ // InternalSensinact.g:4842:1: rule__DSL_Expression_Or__Group_1__0__Impl : ( 'or' ) ;
+ public final void rule__DSL_Expression_Or__Group_1__0__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4846:1: ( ( 'or' ) )
+ // InternalSensinact.g:4847:1: ( 'or' )
+ {
+ // InternalSensinact.g:4847:1: ( 'or' )
+ // InternalSensinact.g:4848:2: 'or'
+ {
+ before(grammarAccess.getDSL_Expression_OrAccess().getOrKeyword_1_0());
+ match(input,40,FOLLOW_2);
+ after(grammarAccess.getDSL_Expression_OrAccess().getOrKeyword_1_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Or__Group_1__0__Impl"
+
+
+ // $ANTLR start "rule__DSL_Expression_Or__Group_1__1"
+ // InternalSensinact.g:4857:1: rule__DSL_Expression_Or__Group_1__1 : rule__DSL_Expression_Or__Group_1__1__Impl rule__DSL_Expression_Or__Group_1__2 ;
+ public final void rule__DSL_Expression_Or__Group_1__1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4861:1: ( rule__DSL_Expression_Or__Group_1__1__Impl rule__DSL_Expression_Or__Group_1__2 )
+ // InternalSensinact.g:4862:2: rule__DSL_Expression_Or__Group_1__1__Impl rule__DSL_Expression_Or__Group_1__2
+ {
+ pushFollow(FOLLOW_18);
+ rule__DSL_Expression_Or__Group_1__1__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_Or__Group_1__2();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Or__Group_1__1"
+
+
+ // $ANTLR start "rule__DSL_Expression_Or__Group_1__1__Impl"
+ // InternalSensinact.g:4869:1: rule__DSL_Expression_Or__Group_1__1__Impl : ( () ) ;
+ public final void rule__DSL_Expression_Or__Group_1__1__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4873:1: ( ( () ) )
+ // InternalSensinact.g:4874:1: ( () )
+ {
+ // InternalSensinact.g:4874:1: ( () )
+ // InternalSensinact.g:4875:2: ()
+ {
+ before(grammarAccess.getDSL_Expression_OrAccess().getDSL_Expression_OrLeftAction_1_1());
+ // InternalSensinact.g:4876:2: ()
+ // InternalSensinact.g:4876:3:
+ {
+ }
+
+ after(grammarAccess.getDSL_Expression_OrAccess().getDSL_Expression_OrLeftAction_1_1());
+
+ }
+
+
+ }
+
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Or__Group_1__1__Impl"
+
+
+ // $ANTLR start "rule__DSL_Expression_Or__Group_1__2"
+ // InternalSensinact.g:4884:1: rule__DSL_Expression_Or__Group_1__2 : rule__DSL_Expression_Or__Group_1__2__Impl ;
+ public final void rule__DSL_Expression_Or__Group_1__2() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4888:1: ( rule__DSL_Expression_Or__Group_1__2__Impl )
+ // InternalSensinact.g:4889:2: rule__DSL_Expression_Or__Group_1__2__Impl
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_Or__Group_1__2__Impl();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Or__Group_1__2"
+
+
+ // $ANTLR start "rule__DSL_Expression_Or__Group_1__2__Impl"
+ // InternalSensinact.g:4895:1: rule__DSL_Expression_Or__Group_1__2__Impl : ( ( rule__DSL_Expression_Or__RightAssignment_1_2 ) ) ;
+ public final void rule__DSL_Expression_Or__Group_1__2__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4899:1: ( ( ( rule__DSL_Expression_Or__RightAssignment_1_2 ) ) )
+ // InternalSensinact.g:4900:1: ( ( rule__DSL_Expression_Or__RightAssignment_1_2 ) )
+ {
+ // InternalSensinact.g:4900:1: ( ( rule__DSL_Expression_Or__RightAssignment_1_2 ) )
+ // InternalSensinact.g:4901:2: ( rule__DSL_Expression_Or__RightAssignment_1_2 )
+ {
+ before(grammarAccess.getDSL_Expression_OrAccess().getRightAssignment_1_2());
+ // InternalSensinact.g:4902:2: ( rule__DSL_Expression_Or__RightAssignment_1_2 )
+ // InternalSensinact.g:4902:3: rule__DSL_Expression_Or__RightAssignment_1_2
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_Or__RightAssignment_1_2();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_Expression_OrAccess().getRightAssignment_1_2());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Or__Group_1__2__Impl"
+
+
+ // $ANTLR start "rule__DSL_Expression_And__Group__0"
+ // InternalSensinact.g:4911:1: rule__DSL_Expression_And__Group__0 : rule__DSL_Expression_And__Group__0__Impl rule__DSL_Expression_And__Group__1 ;
+ public final void rule__DSL_Expression_And__Group__0() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4915:1: ( rule__DSL_Expression_And__Group__0__Impl rule__DSL_Expression_And__Group__1 )
+ // InternalSensinact.g:4916:2: rule__DSL_Expression_And__Group__0__Impl rule__DSL_Expression_And__Group__1
+ {
+ pushFollow(FOLLOW_33);
+ rule__DSL_Expression_And__Group__0__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_And__Group__1();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_And__Group__0"
+
+
+ // $ANTLR start "rule__DSL_Expression_And__Group__0__Impl"
+ // InternalSensinact.g:4923:1: rule__DSL_Expression_And__Group__0__Impl : ( ruleDSL_Expression_DiffEqual ) ;
+ public final void rule__DSL_Expression_And__Group__0__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4927:1: ( ( ruleDSL_Expression_DiffEqual ) )
+ // InternalSensinact.g:4928:1: ( ruleDSL_Expression_DiffEqual )
+ {
+ // InternalSensinact.g:4928:1: ( ruleDSL_Expression_DiffEqual )
+ // InternalSensinact.g:4929:2: ruleDSL_Expression_DiffEqual
+ {
+ before(grammarAccess.getDSL_Expression_AndAccess().getDSL_Expression_DiffEqualParserRuleCall_0());
+ pushFollow(FOLLOW_2);
+ ruleDSL_Expression_DiffEqual();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_Expression_AndAccess().getDSL_Expression_DiffEqualParserRuleCall_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_And__Group__0__Impl"
+
+
+ // $ANTLR start "rule__DSL_Expression_And__Group__1"
+ // InternalSensinact.g:4938:1: rule__DSL_Expression_And__Group__1 : rule__DSL_Expression_And__Group__1__Impl ;
+ public final void rule__DSL_Expression_And__Group__1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4942:1: ( rule__DSL_Expression_And__Group__1__Impl )
+ // InternalSensinact.g:4943:2: rule__DSL_Expression_And__Group__1__Impl
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_And__Group__1__Impl();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_And__Group__1"
+
+
+ // $ANTLR start "rule__DSL_Expression_And__Group__1__Impl"
+ // InternalSensinact.g:4949:1: rule__DSL_Expression_And__Group__1__Impl : ( ( rule__DSL_Expression_And__Group_1__0 )* ) ;
+ public final void rule__DSL_Expression_And__Group__1__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4953:1: ( ( ( rule__DSL_Expression_And__Group_1__0 )* ) )
+ // InternalSensinact.g:4954:1: ( ( rule__DSL_Expression_And__Group_1__0 )* )
+ {
+ // InternalSensinact.g:4954:1: ( ( rule__DSL_Expression_And__Group_1__0 )* )
+ // InternalSensinact.g:4955:2: ( rule__DSL_Expression_And__Group_1__0 )*
+ {
+ before(grammarAccess.getDSL_Expression_AndAccess().getGroup_1());
+ // InternalSensinact.g:4956:2: ( rule__DSL_Expression_And__Group_1__0 )*
+ loop24:
+ do {
+ int alt24=2;
+ int LA24_0 = input.LA(1);
+
+ if ( (LA24_0==41) ) {
+ alt24=1;
+ }
+
+
+ switch (alt24) {
+ case 1 :
+ // InternalSensinact.g:4956:3: rule__DSL_Expression_And__Group_1__0
+ {
+ pushFollow(FOLLOW_34);
+ rule__DSL_Expression_And__Group_1__0();
+
+ state._fsp--;
+
+
+ }
+ break;
+
+ default :
+ break loop24;
+ }
+ } while (true);
+
+ after(grammarAccess.getDSL_Expression_AndAccess().getGroup_1());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_And__Group__1__Impl"
+
+
+ // $ANTLR start "rule__DSL_Expression_And__Group_1__0"
+ // InternalSensinact.g:4965:1: rule__DSL_Expression_And__Group_1__0 : rule__DSL_Expression_And__Group_1__0__Impl rule__DSL_Expression_And__Group_1__1 ;
+ public final void rule__DSL_Expression_And__Group_1__0() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4969:1: ( rule__DSL_Expression_And__Group_1__0__Impl rule__DSL_Expression_And__Group_1__1 )
+ // InternalSensinact.g:4970:2: rule__DSL_Expression_And__Group_1__0__Impl rule__DSL_Expression_And__Group_1__1
+ {
+ pushFollow(FOLLOW_18);
+ rule__DSL_Expression_And__Group_1__0__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_And__Group_1__1();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_And__Group_1__0"
+
+
+ // $ANTLR start "rule__DSL_Expression_And__Group_1__0__Impl"
+ // InternalSensinact.g:4977:1: rule__DSL_Expression_And__Group_1__0__Impl : ( 'and' ) ;
+ public final void rule__DSL_Expression_And__Group_1__0__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4981:1: ( ( 'and' ) )
+ // InternalSensinact.g:4982:1: ( 'and' )
+ {
+ // InternalSensinact.g:4982:1: ( 'and' )
+ // InternalSensinact.g:4983:2: 'and'
+ {
+ before(grammarAccess.getDSL_Expression_AndAccess().getAndKeyword_1_0());
+ match(input,41,FOLLOW_2);
+ after(grammarAccess.getDSL_Expression_AndAccess().getAndKeyword_1_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_And__Group_1__0__Impl"
+
+
+ // $ANTLR start "rule__DSL_Expression_And__Group_1__1"
+ // InternalSensinact.g:4992:1: rule__DSL_Expression_And__Group_1__1 : rule__DSL_Expression_And__Group_1__1__Impl rule__DSL_Expression_And__Group_1__2 ;
+ public final void rule__DSL_Expression_And__Group_1__1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:4996:1: ( rule__DSL_Expression_And__Group_1__1__Impl rule__DSL_Expression_And__Group_1__2 )
+ // InternalSensinact.g:4997:2: rule__DSL_Expression_And__Group_1__1__Impl rule__DSL_Expression_And__Group_1__2
+ {
+ pushFollow(FOLLOW_18);
+ rule__DSL_Expression_And__Group_1__1__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_And__Group_1__2();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_And__Group_1__1"
+
+
+ // $ANTLR start "rule__DSL_Expression_And__Group_1__1__Impl"
+ // InternalSensinact.g:5004:1: rule__DSL_Expression_And__Group_1__1__Impl : ( () ) ;
+ public final void rule__DSL_Expression_And__Group_1__1__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5008:1: ( ( () ) )
+ // InternalSensinact.g:5009:1: ( () )
+ {
+ // InternalSensinact.g:5009:1: ( () )
+ // InternalSensinact.g:5010:2: ()
+ {
+ before(grammarAccess.getDSL_Expression_AndAccess().getDSL_Expression_AndLeftAction_1_1());
+ // InternalSensinact.g:5011:2: ()
+ // InternalSensinact.g:5011:3:
+ {
+ }
+
+ after(grammarAccess.getDSL_Expression_AndAccess().getDSL_Expression_AndLeftAction_1_1());
+
+ }
+
+
+ }
+
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_And__Group_1__1__Impl"
+
+
+ // $ANTLR start "rule__DSL_Expression_And__Group_1__2"
+ // InternalSensinact.g:5019:1: rule__DSL_Expression_And__Group_1__2 : rule__DSL_Expression_And__Group_1__2__Impl ;
+ public final void rule__DSL_Expression_And__Group_1__2() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5023:1: ( rule__DSL_Expression_And__Group_1__2__Impl )
+ // InternalSensinact.g:5024:2: rule__DSL_Expression_And__Group_1__2__Impl
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_And__Group_1__2__Impl();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_And__Group_1__2"
+
+
+ // $ANTLR start "rule__DSL_Expression_And__Group_1__2__Impl"
+ // InternalSensinact.g:5030:1: rule__DSL_Expression_And__Group_1__2__Impl : ( ( rule__DSL_Expression_And__RightAssignment_1_2 ) ) ;
+ public final void rule__DSL_Expression_And__Group_1__2__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5034:1: ( ( ( rule__DSL_Expression_And__RightAssignment_1_2 ) ) )
+ // InternalSensinact.g:5035:1: ( ( rule__DSL_Expression_And__RightAssignment_1_2 ) )
+ {
+ // InternalSensinact.g:5035:1: ( ( rule__DSL_Expression_And__RightAssignment_1_2 ) )
+ // InternalSensinact.g:5036:2: ( rule__DSL_Expression_And__RightAssignment_1_2 )
+ {
+ before(grammarAccess.getDSL_Expression_AndAccess().getRightAssignment_1_2());
+ // InternalSensinact.g:5037:2: ( rule__DSL_Expression_And__RightAssignment_1_2 )
+ // InternalSensinact.g:5037:3: rule__DSL_Expression_And__RightAssignment_1_2
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_And__RightAssignment_1_2();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_Expression_AndAccess().getRightAssignment_1_2());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_And__Group_1__2__Impl"
+
+
+ // $ANTLR start "rule__DSL_Expression_DiffEqual__Group__0"
+ // InternalSensinact.g:5046:1: rule__DSL_Expression_DiffEqual__Group__0 : rule__DSL_Expression_DiffEqual__Group__0__Impl rule__DSL_Expression_DiffEqual__Group__1 ;
+ public final void rule__DSL_Expression_DiffEqual__Group__0() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5050:1: ( rule__DSL_Expression_DiffEqual__Group__0__Impl rule__DSL_Expression_DiffEqual__Group__1 )
+ // InternalSensinact.g:5051:2: rule__DSL_Expression_DiffEqual__Group__0__Impl rule__DSL_Expression_DiffEqual__Group__1
+ {
+ pushFollow(FOLLOW_35);
+ rule__DSL_Expression_DiffEqual__Group__0__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_DiffEqual__Group__1();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_DiffEqual__Group__0"
+
+
+ // $ANTLR start "rule__DSL_Expression_DiffEqual__Group__0__Impl"
+ // InternalSensinact.g:5058:1: rule__DSL_Expression_DiffEqual__Group__0__Impl : ( ruleDSL_Expression_Compare ) ;
+ public final void rule__DSL_Expression_DiffEqual__Group__0__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5062:1: ( ( ruleDSL_Expression_Compare ) )
+ // InternalSensinact.g:5063:1: ( ruleDSL_Expression_Compare )
+ {
+ // InternalSensinact.g:5063:1: ( ruleDSL_Expression_Compare )
+ // InternalSensinact.g:5064:2: ruleDSL_Expression_Compare
+ {
+ before(grammarAccess.getDSL_Expression_DiffEqualAccess().getDSL_Expression_CompareParserRuleCall_0());
+ pushFollow(FOLLOW_2);
+ ruleDSL_Expression_Compare();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_Expression_DiffEqualAccess().getDSL_Expression_CompareParserRuleCall_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_DiffEqual__Group__0__Impl"
+
+
+ // $ANTLR start "rule__DSL_Expression_DiffEqual__Group__1"
+ // InternalSensinact.g:5073:1: rule__DSL_Expression_DiffEqual__Group__1 : rule__DSL_Expression_DiffEqual__Group__1__Impl ;
+ public final void rule__DSL_Expression_DiffEqual__Group__1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5077:1: ( rule__DSL_Expression_DiffEqual__Group__1__Impl )
+ // InternalSensinact.g:5078:2: rule__DSL_Expression_DiffEqual__Group__1__Impl
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_DiffEqual__Group__1__Impl();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_DiffEqual__Group__1"
+
+
+ // $ANTLR start "rule__DSL_Expression_DiffEqual__Group__1__Impl"
+ // InternalSensinact.g:5084:1: rule__DSL_Expression_DiffEqual__Group__1__Impl : ( ( rule__DSL_Expression_DiffEqual__Alternatives_1 )* ) ;
+ public final void rule__DSL_Expression_DiffEqual__Group__1__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5088:1: ( ( ( rule__DSL_Expression_DiffEqual__Alternatives_1 )* ) )
+ // InternalSensinact.g:5089:1: ( ( rule__DSL_Expression_DiffEqual__Alternatives_1 )* )
+ {
+ // InternalSensinact.g:5089:1: ( ( rule__DSL_Expression_DiffEqual__Alternatives_1 )* )
+ // InternalSensinact.g:5090:2: ( rule__DSL_Expression_DiffEqual__Alternatives_1 )*
+ {
+ before(grammarAccess.getDSL_Expression_DiffEqualAccess().getAlternatives_1());
+ // InternalSensinact.g:5091:2: ( rule__DSL_Expression_DiffEqual__Alternatives_1 )*
+ loop25:
+ do {
+ int alt25=2;
+ int LA25_0 = input.LA(1);
+
+ if ( ((LA25_0>=42 && LA25_0<=43)) ) {
+ alt25=1;
+ }
+
+
+ switch (alt25) {
+ case 1 :
+ // InternalSensinact.g:5091:3: rule__DSL_Expression_DiffEqual__Alternatives_1
+ {
+ pushFollow(FOLLOW_36);
+ rule__DSL_Expression_DiffEqual__Alternatives_1();
+
+ state._fsp--;
+
+
+ }
+ break;
+
+ default :
+ break loop25;
+ }
+ } while (true);
+
+ after(grammarAccess.getDSL_Expression_DiffEqualAccess().getAlternatives_1());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_DiffEqual__Group__1__Impl"
+
+
+ // $ANTLR start "rule__DSL_Expression_DiffEqual__Group_1_0__0"
+ // InternalSensinact.g:5100:1: rule__DSL_Expression_DiffEqual__Group_1_0__0 : rule__DSL_Expression_DiffEqual__Group_1_0__0__Impl rule__DSL_Expression_DiffEqual__Group_1_0__1 ;
+ public final void rule__DSL_Expression_DiffEqual__Group_1_0__0() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5104:1: ( rule__DSL_Expression_DiffEqual__Group_1_0__0__Impl rule__DSL_Expression_DiffEqual__Group_1_0__1 )
+ // InternalSensinact.g:5105:2: rule__DSL_Expression_DiffEqual__Group_1_0__0__Impl rule__DSL_Expression_DiffEqual__Group_1_0__1
+ {
+ pushFollow(FOLLOW_18);
+ rule__DSL_Expression_DiffEqual__Group_1_0__0__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_DiffEqual__Group_1_0__1();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_DiffEqual__Group_1_0__0"
+
+
+ // $ANTLR start "rule__DSL_Expression_DiffEqual__Group_1_0__0__Impl"
+ // InternalSensinact.g:5112:1: rule__DSL_Expression_DiffEqual__Group_1_0__0__Impl : ( '!=' ) ;
+ public final void rule__DSL_Expression_DiffEqual__Group_1_0__0__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5116:1: ( ( '!=' ) )
+ // InternalSensinact.g:5117:1: ( '!=' )
+ {
+ // InternalSensinact.g:5117:1: ( '!=' )
+ // InternalSensinact.g:5118:2: '!='
+ {
+ before(grammarAccess.getDSL_Expression_DiffEqualAccess().getExclamationMarkEqualsSignKeyword_1_0_0());
+ match(input,42,FOLLOW_2);
+ after(grammarAccess.getDSL_Expression_DiffEqualAccess().getExclamationMarkEqualsSignKeyword_1_0_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_DiffEqual__Group_1_0__0__Impl"
+
+
+ // $ANTLR start "rule__DSL_Expression_DiffEqual__Group_1_0__1"
+ // InternalSensinact.g:5127:1: rule__DSL_Expression_DiffEqual__Group_1_0__1 : rule__DSL_Expression_DiffEqual__Group_1_0__1__Impl rule__DSL_Expression_DiffEqual__Group_1_0__2 ;
+ public final void rule__DSL_Expression_DiffEqual__Group_1_0__1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5131:1: ( rule__DSL_Expression_DiffEqual__Group_1_0__1__Impl rule__DSL_Expression_DiffEqual__Group_1_0__2 )
+ // InternalSensinact.g:5132:2: rule__DSL_Expression_DiffEqual__Group_1_0__1__Impl rule__DSL_Expression_DiffEqual__Group_1_0__2
+ {
+ pushFollow(FOLLOW_18);
+ rule__DSL_Expression_DiffEqual__Group_1_0__1__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_DiffEqual__Group_1_0__2();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_DiffEqual__Group_1_0__1"
+
+
+ // $ANTLR start "rule__DSL_Expression_DiffEqual__Group_1_0__1__Impl"
+ // InternalSensinact.g:5139:1: rule__DSL_Expression_DiffEqual__Group_1_0__1__Impl : ( () ) ;
+ public final void rule__DSL_Expression_DiffEqual__Group_1_0__1__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5143:1: ( ( () ) )
+ // InternalSensinact.g:5144:1: ( () )
+ {
+ // InternalSensinact.g:5144:1: ( () )
+ // InternalSensinact.g:5145:2: ()
+ {
+ before(grammarAccess.getDSL_Expression_DiffEqualAccess().getDSL_Expression_DiffLeftAction_1_0_1());
+ // InternalSensinact.g:5146:2: ()
+ // InternalSensinact.g:5146:3:
+ {
+ }
+
+ after(grammarAccess.getDSL_Expression_DiffEqualAccess().getDSL_Expression_DiffLeftAction_1_0_1());
+
+ }
+
+
+ }
+
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_DiffEqual__Group_1_0__1__Impl"
+
+
+ // $ANTLR start "rule__DSL_Expression_DiffEqual__Group_1_0__2"
+ // InternalSensinact.g:5154:1: rule__DSL_Expression_DiffEqual__Group_1_0__2 : rule__DSL_Expression_DiffEqual__Group_1_0__2__Impl ;
+ public final void rule__DSL_Expression_DiffEqual__Group_1_0__2() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5158:1: ( rule__DSL_Expression_DiffEqual__Group_1_0__2__Impl )
+ // InternalSensinact.g:5159:2: rule__DSL_Expression_DiffEqual__Group_1_0__2__Impl
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_DiffEqual__Group_1_0__2__Impl();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_DiffEqual__Group_1_0__2"
+
+
+ // $ANTLR start "rule__DSL_Expression_DiffEqual__Group_1_0__2__Impl"
+ // InternalSensinact.g:5165:1: rule__DSL_Expression_DiffEqual__Group_1_0__2__Impl : ( ( rule__DSL_Expression_DiffEqual__RightAssignment_1_0_2 ) ) ;
+ public final void rule__DSL_Expression_DiffEqual__Group_1_0__2__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5169:1: ( ( ( rule__DSL_Expression_DiffEqual__RightAssignment_1_0_2 ) ) )
+ // InternalSensinact.g:5170:1: ( ( rule__DSL_Expression_DiffEqual__RightAssignment_1_0_2 ) )
+ {
+ // InternalSensinact.g:5170:1: ( ( rule__DSL_Expression_DiffEqual__RightAssignment_1_0_2 ) )
+ // InternalSensinact.g:5171:2: ( rule__DSL_Expression_DiffEqual__RightAssignment_1_0_2 )
+ {
+ before(grammarAccess.getDSL_Expression_DiffEqualAccess().getRightAssignment_1_0_2());
+ // InternalSensinact.g:5172:2: ( rule__DSL_Expression_DiffEqual__RightAssignment_1_0_2 )
+ // InternalSensinact.g:5172:3: rule__DSL_Expression_DiffEqual__RightAssignment_1_0_2
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_DiffEqual__RightAssignment_1_0_2();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_Expression_DiffEqualAccess().getRightAssignment_1_0_2());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_DiffEqual__Group_1_0__2__Impl"
+
+
+ // $ANTLR start "rule__DSL_Expression_DiffEqual__Group_1_1__0"
+ // InternalSensinact.g:5181:1: rule__DSL_Expression_DiffEqual__Group_1_1__0 : rule__DSL_Expression_DiffEqual__Group_1_1__0__Impl rule__DSL_Expression_DiffEqual__Group_1_1__1 ;
+ public final void rule__DSL_Expression_DiffEqual__Group_1_1__0() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5185:1: ( rule__DSL_Expression_DiffEqual__Group_1_1__0__Impl rule__DSL_Expression_DiffEqual__Group_1_1__1 )
+ // InternalSensinact.g:5186:2: rule__DSL_Expression_DiffEqual__Group_1_1__0__Impl rule__DSL_Expression_DiffEqual__Group_1_1__1
+ {
+ pushFollow(FOLLOW_18);
+ rule__DSL_Expression_DiffEqual__Group_1_1__0__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_DiffEqual__Group_1_1__1();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_DiffEqual__Group_1_1__0"
+
+
+ // $ANTLR start "rule__DSL_Expression_DiffEqual__Group_1_1__0__Impl"
+ // InternalSensinact.g:5193:1: rule__DSL_Expression_DiffEqual__Group_1_1__0__Impl : ( '==' ) ;
+ public final void rule__DSL_Expression_DiffEqual__Group_1_1__0__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5197:1: ( ( '==' ) )
+ // InternalSensinact.g:5198:1: ( '==' )
+ {
+ // InternalSensinact.g:5198:1: ( '==' )
+ // InternalSensinact.g:5199:2: '=='
+ {
+ before(grammarAccess.getDSL_Expression_DiffEqualAccess().getEqualsSignEqualsSignKeyword_1_1_0());
+ match(input,43,FOLLOW_2);
+ after(grammarAccess.getDSL_Expression_DiffEqualAccess().getEqualsSignEqualsSignKeyword_1_1_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_DiffEqual__Group_1_1__0__Impl"
+
+
+ // $ANTLR start "rule__DSL_Expression_DiffEqual__Group_1_1__1"
+ // InternalSensinact.g:5208:1: rule__DSL_Expression_DiffEqual__Group_1_1__1 : rule__DSL_Expression_DiffEqual__Group_1_1__1__Impl rule__DSL_Expression_DiffEqual__Group_1_1__2 ;
+ public final void rule__DSL_Expression_DiffEqual__Group_1_1__1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5212:1: ( rule__DSL_Expression_DiffEqual__Group_1_1__1__Impl rule__DSL_Expression_DiffEqual__Group_1_1__2 )
+ // InternalSensinact.g:5213:2: rule__DSL_Expression_DiffEqual__Group_1_1__1__Impl rule__DSL_Expression_DiffEqual__Group_1_1__2
+ {
+ pushFollow(FOLLOW_18);
+ rule__DSL_Expression_DiffEqual__Group_1_1__1__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_DiffEqual__Group_1_1__2();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_DiffEqual__Group_1_1__1"
+
+
+ // $ANTLR start "rule__DSL_Expression_DiffEqual__Group_1_1__1__Impl"
+ // InternalSensinact.g:5220:1: rule__DSL_Expression_DiffEqual__Group_1_1__1__Impl : ( () ) ;
+ public final void rule__DSL_Expression_DiffEqual__Group_1_1__1__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5224:1: ( ( () ) )
+ // InternalSensinact.g:5225:1: ( () )
+ {
+ // InternalSensinact.g:5225:1: ( () )
+ // InternalSensinact.g:5226:2: ()
+ {
+ before(grammarAccess.getDSL_Expression_DiffEqualAccess().getDSL_Expression_EqualLeftAction_1_1_1());
+ // InternalSensinact.g:5227:2: ()
+ // InternalSensinact.g:5227:3:
+ {
+ }
+
+ after(grammarAccess.getDSL_Expression_DiffEqualAccess().getDSL_Expression_EqualLeftAction_1_1_1());
+
+ }
+
+
+ }
+
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_DiffEqual__Group_1_1__1__Impl"
+
+
+ // $ANTLR start "rule__DSL_Expression_DiffEqual__Group_1_1__2"
+ // InternalSensinact.g:5235:1: rule__DSL_Expression_DiffEqual__Group_1_1__2 : rule__DSL_Expression_DiffEqual__Group_1_1__2__Impl ;
+ public final void rule__DSL_Expression_DiffEqual__Group_1_1__2() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5239:1: ( rule__DSL_Expression_DiffEqual__Group_1_1__2__Impl )
+ // InternalSensinact.g:5240:2: rule__DSL_Expression_DiffEqual__Group_1_1__2__Impl
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_DiffEqual__Group_1_1__2__Impl();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_DiffEqual__Group_1_1__2"
+
+
+ // $ANTLR start "rule__DSL_Expression_DiffEqual__Group_1_1__2__Impl"
+ // InternalSensinact.g:5246:1: rule__DSL_Expression_DiffEqual__Group_1_1__2__Impl : ( ( rule__DSL_Expression_DiffEqual__RightAssignment_1_1_2 ) ) ;
+ public final void rule__DSL_Expression_DiffEqual__Group_1_1__2__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5250:1: ( ( ( rule__DSL_Expression_DiffEqual__RightAssignment_1_1_2 ) ) )
+ // InternalSensinact.g:5251:1: ( ( rule__DSL_Expression_DiffEqual__RightAssignment_1_1_2 ) )
+ {
+ // InternalSensinact.g:5251:1: ( ( rule__DSL_Expression_DiffEqual__RightAssignment_1_1_2 ) )
+ // InternalSensinact.g:5252:2: ( rule__DSL_Expression_DiffEqual__RightAssignment_1_1_2 )
+ {
+ before(grammarAccess.getDSL_Expression_DiffEqualAccess().getRightAssignment_1_1_2());
+ // InternalSensinact.g:5253:2: ( rule__DSL_Expression_DiffEqual__RightAssignment_1_1_2 )
+ // InternalSensinact.g:5253:3: rule__DSL_Expression_DiffEqual__RightAssignment_1_1_2
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_DiffEqual__RightAssignment_1_1_2();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_Expression_DiffEqualAccess().getRightAssignment_1_1_2());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_DiffEqual__Group_1_1__2__Impl"
+
+
+ // $ANTLR start "rule__DSL_Expression_Compare__Group__0"
+ // InternalSensinact.g:5262:1: rule__DSL_Expression_Compare__Group__0 : rule__DSL_Expression_Compare__Group__0__Impl rule__DSL_Expression_Compare__Group__1 ;
+ public final void rule__DSL_Expression_Compare__Group__0() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5266:1: ( rule__DSL_Expression_Compare__Group__0__Impl rule__DSL_Expression_Compare__Group__1 )
+ // InternalSensinact.g:5267:2: rule__DSL_Expression_Compare__Group__0__Impl rule__DSL_Expression_Compare__Group__1
+ {
+ pushFollow(FOLLOW_37);
+ rule__DSL_Expression_Compare__Group__0__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_Compare__Group__1();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Compare__Group__0"
+
+
+ // $ANTLR start "rule__DSL_Expression_Compare__Group__0__Impl"
+ // InternalSensinact.g:5274:1: rule__DSL_Expression_Compare__Group__0__Impl : ( ruleDSL_Expression_PlusMinus ) ;
+ public final void rule__DSL_Expression_Compare__Group__0__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5278:1: ( ( ruleDSL_Expression_PlusMinus ) )
+ // InternalSensinact.g:5279:1: ( ruleDSL_Expression_PlusMinus )
+ {
+ // InternalSensinact.g:5279:1: ( ruleDSL_Expression_PlusMinus )
+ // InternalSensinact.g:5280:2: ruleDSL_Expression_PlusMinus
+ {
+ before(grammarAccess.getDSL_Expression_CompareAccess().getDSL_Expression_PlusMinusParserRuleCall_0());
+ pushFollow(FOLLOW_2);
+ ruleDSL_Expression_PlusMinus();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_Expression_CompareAccess().getDSL_Expression_PlusMinusParserRuleCall_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Compare__Group__0__Impl"
+
+
+ // $ANTLR start "rule__DSL_Expression_Compare__Group__1"
+ // InternalSensinact.g:5289:1: rule__DSL_Expression_Compare__Group__1 : rule__DSL_Expression_Compare__Group__1__Impl ;
+ public final void rule__DSL_Expression_Compare__Group__1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5293:1: ( rule__DSL_Expression_Compare__Group__1__Impl )
+ // InternalSensinact.g:5294:2: rule__DSL_Expression_Compare__Group__1__Impl
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_Compare__Group__1__Impl();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Compare__Group__1"
+
+
+ // $ANTLR start "rule__DSL_Expression_Compare__Group__1__Impl"
+ // InternalSensinact.g:5300:1: rule__DSL_Expression_Compare__Group__1__Impl : ( ( rule__DSL_Expression_Compare__Alternatives_1 )* ) ;
+ public final void rule__DSL_Expression_Compare__Group__1__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5304:1: ( ( ( rule__DSL_Expression_Compare__Alternatives_1 )* ) )
+ // InternalSensinact.g:5305:1: ( ( rule__DSL_Expression_Compare__Alternatives_1 )* )
+ {
+ // InternalSensinact.g:5305:1: ( ( rule__DSL_Expression_Compare__Alternatives_1 )* )
+ // InternalSensinact.g:5306:2: ( rule__DSL_Expression_Compare__Alternatives_1 )*
+ {
+ before(grammarAccess.getDSL_Expression_CompareAccess().getAlternatives_1());
+ // InternalSensinact.g:5307:2: ( rule__DSL_Expression_Compare__Alternatives_1 )*
+ loop26:
+ do {
+ int alt26=2;
+ int LA26_0 = input.LA(1);
+
+ if ( ((LA26_0>=44 && LA26_0<=47)) ) {
+ alt26=1;
+ }
+
+
+ switch (alt26) {
+ case 1 :
+ // InternalSensinact.g:5307:3: rule__DSL_Expression_Compare__Alternatives_1
+ {
+ pushFollow(FOLLOW_38);
+ rule__DSL_Expression_Compare__Alternatives_1();
+
+ state._fsp--;
+
+
+ }
+ break;
+
+ default :
+ break loop26;
+ }
+ } while (true);
+
+ after(grammarAccess.getDSL_Expression_CompareAccess().getAlternatives_1());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Compare__Group__1__Impl"
+
+
+ // $ANTLR start "rule__DSL_Expression_Compare__Group_1_0__0"
+ // InternalSensinact.g:5316:1: rule__DSL_Expression_Compare__Group_1_0__0 : rule__DSL_Expression_Compare__Group_1_0__0__Impl rule__DSL_Expression_Compare__Group_1_0__1 ;
+ public final void rule__DSL_Expression_Compare__Group_1_0__0() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5320:1: ( rule__DSL_Expression_Compare__Group_1_0__0__Impl rule__DSL_Expression_Compare__Group_1_0__1 )
+ // InternalSensinact.g:5321:2: rule__DSL_Expression_Compare__Group_1_0__0__Impl rule__DSL_Expression_Compare__Group_1_0__1
+ {
+ pushFollow(FOLLOW_18);
+ rule__DSL_Expression_Compare__Group_1_0__0__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_Compare__Group_1_0__1();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Compare__Group_1_0__0"
+
+
+ // $ANTLR start "rule__DSL_Expression_Compare__Group_1_0__0__Impl"
+ // InternalSensinact.g:5328:1: rule__DSL_Expression_Compare__Group_1_0__0__Impl : ( '>' ) ;
+ public final void rule__DSL_Expression_Compare__Group_1_0__0__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5332:1: ( ( '>' ) )
+ // InternalSensinact.g:5333:1: ( '>' )
+ {
+ // InternalSensinact.g:5333:1: ( '>' )
+ // InternalSensinact.g:5334:2: '>'
+ {
+ before(grammarAccess.getDSL_Expression_CompareAccess().getGreaterThanSignKeyword_1_0_0());
+ match(input,44,FOLLOW_2);
+ after(grammarAccess.getDSL_Expression_CompareAccess().getGreaterThanSignKeyword_1_0_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Compare__Group_1_0__0__Impl"
+
+
+ // $ANTLR start "rule__DSL_Expression_Compare__Group_1_0__1"
+ // InternalSensinact.g:5343:1: rule__DSL_Expression_Compare__Group_1_0__1 : rule__DSL_Expression_Compare__Group_1_0__1__Impl rule__DSL_Expression_Compare__Group_1_0__2 ;
+ public final void rule__DSL_Expression_Compare__Group_1_0__1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5347:1: ( rule__DSL_Expression_Compare__Group_1_0__1__Impl rule__DSL_Expression_Compare__Group_1_0__2 )
+ // InternalSensinact.g:5348:2: rule__DSL_Expression_Compare__Group_1_0__1__Impl rule__DSL_Expression_Compare__Group_1_0__2
+ {
+ pushFollow(FOLLOW_18);
+ rule__DSL_Expression_Compare__Group_1_0__1__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_Compare__Group_1_0__2();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Compare__Group_1_0__1"
+
+
+ // $ANTLR start "rule__DSL_Expression_Compare__Group_1_0__1__Impl"
+ // InternalSensinact.g:5355:1: rule__DSL_Expression_Compare__Group_1_0__1__Impl : ( () ) ;
+ public final void rule__DSL_Expression_Compare__Group_1_0__1__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5359:1: ( ( () ) )
+ // InternalSensinact.g:5360:1: ( () )
+ {
+ // InternalSensinact.g:5360:1: ( () )
+ // InternalSensinact.g:5361:2: ()
+ {
+ before(grammarAccess.getDSL_Expression_CompareAccess().getDSL_Expression_LargerLeftAction_1_0_1());
+ // InternalSensinact.g:5362:2: ()
+ // InternalSensinact.g:5362:3:
+ {
+ }
+
+ after(grammarAccess.getDSL_Expression_CompareAccess().getDSL_Expression_LargerLeftAction_1_0_1());
+
+ }
+
+
+ }
+
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Compare__Group_1_0__1__Impl"
+
+
+ // $ANTLR start "rule__DSL_Expression_Compare__Group_1_0__2"
+ // InternalSensinact.g:5370:1: rule__DSL_Expression_Compare__Group_1_0__2 : rule__DSL_Expression_Compare__Group_1_0__2__Impl ;
+ public final void rule__DSL_Expression_Compare__Group_1_0__2() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5374:1: ( rule__DSL_Expression_Compare__Group_1_0__2__Impl )
+ // InternalSensinact.g:5375:2: rule__DSL_Expression_Compare__Group_1_0__2__Impl
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_Compare__Group_1_0__2__Impl();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Compare__Group_1_0__2"
+
+
+ // $ANTLR start "rule__DSL_Expression_Compare__Group_1_0__2__Impl"
+ // InternalSensinact.g:5381:1: rule__DSL_Expression_Compare__Group_1_0__2__Impl : ( ( rule__DSL_Expression_Compare__RightAssignment_1_0_2 ) ) ;
+ public final void rule__DSL_Expression_Compare__Group_1_0__2__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5385:1: ( ( ( rule__DSL_Expression_Compare__RightAssignment_1_0_2 ) ) )
+ // InternalSensinact.g:5386:1: ( ( rule__DSL_Expression_Compare__RightAssignment_1_0_2 ) )
+ {
+ // InternalSensinact.g:5386:1: ( ( rule__DSL_Expression_Compare__RightAssignment_1_0_2 ) )
+ // InternalSensinact.g:5387:2: ( rule__DSL_Expression_Compare__RightAssignment_1_0_2 )
+ {
+ before(grammarAccess.getDSL_Expression_CompareAccess().getRightAssignment_1_0_2());
+ // InternalSensinact.g:5388:2: ( rule__DSL_Expression_Compare__RightAssignment_1_0_2 )
+ // InternalSensinact.g:5388:3: rule__DSL_Expression_Compare__RightAssignment_1_0_2
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_Compare__RightAssignment_1_0_2();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_Expression_CompareAccess().getRightAssignment_1_0_2());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Compare__Group_1_0__2__Impl"
+
+
+ // $ANTLR start "rule__DSL_Expression_Compare__Group_1_1__0"
+ // InternalSensinact.g:5397:1: rule__DSL_Expression_Compare__Group_1_1__0 : rule__DSL_Expression_Compare__Group_1_1__0__Impl rule__DSL_Expression_Compare__Group_1_1__1 ;
+ public final void rule__DSL_Expression_Compare__Group_1_1__0() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5401:1: ( rule__DSL_Expression_Compare__Group_1_1__0__Impl rule__DSL_Expression_Compare__Group_1_1__1 )
+ // InternalSensinact.g:5402:2: rule__DSL_Expression_Compare__Group_1_1__0__Impl rule__DSL_Expression_Compare__Group_1_1__1
+ {
+ pushFollow(FOLLOW_18);
+ rule__DSL_Expression_Compare__Group_1_1__0__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_Compare__Group_1_1__1();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Compare__Group_1_1__0"
+
+
+ // $ANTLR start "rule__DSL_Expression_Compare__Group_1_1__0__Impl"
+ // InternalSensinact.g:5409:1: rule__DSL_Expression_Compare__Group_1_1__0__Impl : ( '>=' ) ;
+ public final void rule__DSL_Expression_Compare__Group_1_1__0__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5413:1: ( ( '>=' ) )
+ // InternalSensinact.g:5414:1: ( '>=' )
+ {
+ // InternalSensinact.g:5414:1: ( '>=' )
+ // InternalSensinact.g:5415:2: '>='
+ {
+ before(grammarAccess.getDSL_Expression_CompareAccess().getGreaterThanSignEqualsSignKeyword_1_1_0());
+ match(input,45,FOLLOW_2);
+ after(grammarAccess.getDSL_Expression_CompareAccess().getGreaterThanSignEqualsSignKeyword_1_1_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Compare__Group_1_1__0__Impl"
+
+
+ // $ANTLR start "rule__DSL_Expression_Compare__Group_1_1__1"
+ // InternalSensinact.g:5424:1: rule__DSL_Expression_Compare__Group_1_1__1 : rule__DSL_Expression_Compare__Group_1_1__1__Impl rule__DSL_Expression_Compare__Group_1_1__2 ;
+ public final void rule__DSL_Expression_Compare__Group_1_1__1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5428:1: ( rule__DSL_Expression_Compare__Group_1_1__1__Impl rule__DSL_Expression_Compare__Group_1_1__2 )
+ // InternalSensinact.g:5429:2: rule__DSL_Expression_Compare__Group_1_1__1__Impl rule__DSL_Expression_Compare__Group_1_1__2
+ {
+ pushFollow(FOLLOW_18);
+ rule__DSL_Expression_Compare__Group_1_1__1__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_Compare__Group_1_1__2();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Compare__Group_1_1__1"
+
+
+ // $ANTLR start "rule__DSL_Expression_Compare__Group_1_1__1__Impl"
+ // InternalSensinact.g:5436:1: rule__DSL_Expression_Compare__Group_1_1__1__Impl : ( () ) ;
+ public final void rule__DSL_Expression_Compare__Group_1_1__1__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5440:1: ( ( () ) )
+ // InternalSensinact.g:5441:1: ( () )
+ {
+ // InternalSensinact.g:5441:1: ( () )
+ // InternalSensinact.g:5442:2: ()
+ {
+ before(grammarAccess.getDSL_Expression_CompareAccess().getDSL_Expression_Larger_EqualLeftAction_1_1_1());
+ // InternalSensinact.g:5443:2: ()
+ // InternalSensinact.g:5443:3:
+ {
+ }
+
+ after(grammarAccess.getDSL_Expression_CompareAccess().getDSL_Expression_Larger_EqualLeftAction_1_1_1());
+
+ }
+
+
+ }
+
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Compare__Group_1_1__1__Impl"
+
+
+ // $ANTLR start "rule__DSL_Expression_Compare__Group_1_1__2"
+ // InternalSensinact.g:5451:1: rule__DSL_Expression_Compare__Group_1_1__2 : rule__DSL_Expression_Compare__Group_1_1__2__Impl ;
+ public final void rule__DSL_Expression_Compare__Group_1_1__2() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5455:1: ( rule__DSL_Expression_Compare__Group_1_1__2__Impl )
+ // InternalSensinact.g:5456:2: rule__DSL_Expression_Compare__Group_1_1__2__Impl
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_Compare__Group_1_1__2__Impl();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Compare__Group_1_1__2"
+
+
+ // $ANTLR start "rule__DSL_Expression_Compare__Group_1_1__2__Impl"
+ // InternalSensinact.g:5462:1: rule__DSL_Expression_Compare__Group_1_1__2__Impl : ( ( rule__DSL_Expression_Compare__RightAssignment_1_1_2 ) ) ;
+ public final void rule__DSL_Expression_Compare__Group_1_1__2__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5466:1: ( ( ( rule__DSL_Expression_Compare__RightAssignment_1_1_2 ) ) )
+ // InternalSensinact.g:5467:1: ( ( rule__DSL_Expression_Compare__RightAssignment_1_1_2 ) )
+ {
+ // InternalSensinact.g:5467:1: ( ( rule__DSL_Expression_Compare__RightAssignment_1_1_2 ) )
+ // InternalSensinact.g:5468:2: ( rule__DSL_Expression_Compare__RightAssignment_1_1_2 )
+ {
+ before(grammarAccess.getDSL_Expression_CompareAccess().getRightAssignment_1_1_2());
+ // InternalSensinact.g:5469:2: ( rule__DSL_Expression_Compare__RightAssignment_1_1_2 )
+ // InternalSensinact.g:5469:3: rule__DSL_Expression_Compare__RightAssignment_1_1_2
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_Compare__RightAssignment_1_1_2();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_Expression_CompareAccess().getRightAssignment_1_1_2());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Compare__Group_1_1__2__Impl"
+
+
+ // $ANTLR start "rule__DSL_Expression_Compare__Group_1_2__0"
+ // InternalSensinact.g:5478:1: rule__DSL_Expression_Compare__Group_1_2__0 : rule__DSL_Expression_Compare__Group_1_2__0__Impl rule__DSL_Expression_Compare__Group_1_2__1 ;
+ public final void rule__DSL_Expression_Compare__Group_1_2__0() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5482:1: ( rule__DSL_Expression_Compare__Group_1_2__0__Impl rule__DSL_Expression_Compare__Group_1_2__1 )
+ // InternalSensinact.g:5483:2: rule__DSL_Expression_Compare__Group_1_2__0__Impl rule__DSL_Expression_Compare__Group_1_2__1
+ {
+ pushFollow(FOLLOW_18);
+ rule__DSL_Expression_Compare__Group_1_2__0__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_Compare__Group_1_2__1();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Compare__Group_1_2__0"
+
+
+ // $ANTLR start "rule__DSL_Expression_Compare__Group_1_2__0__Impl"
+ // InternalSensinact.g:5490:1: rule__DSL_Expression_Compare__Group_1_2__0__Impl : ( '<' ) ;
+ public final void rule__DSL_Expression_Compare__Group_1_2__0__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5494:1: ( ( '<' ) )
+ // InternalSensinact.g:5495:1: ( '<' )
+ {
+ // InternalSensinact.g:5495:1: ( '<' )
+ // InternalSensinact.g:5496:2: '<'
+ {
+ before(grammarAccess.getDSL_Expression_CompareAccess().getLessThanSignKeyword_1_2_0());
+ match(input,46,FOLLOW_2);
+ after(grammarAccess.getDSL_Expression_CompareAccess().getLessThanSignKeyword_1_2_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Compare__Group_1_2__0__Impl"
+
+
+ // $ANTLR start "rule__DSL_Expression_Compare__Group_1_2__1"
+ // InternalSensinact.g:5505:1: rule__DSL_Expression_Compare__Group_1_2__1 : rule__DSL_Expression_Compare__Group_1_2__1__Impl rule__DSL_Expression_Compare__Group_1_2__2 ;
+ public final void rule__DSL_Expression_Compare__Group_1_2__1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5509:1: ( rule__DSL_Expression_Compare__Group_1_2__1__Impl rule__DSL_Expression_Compare__Group_1_2__2 )
+ // InternalSensinact.g:5510:2: rule__DSL_Expression_Compare__Group_1_2__1__Impl rule__DSL_Expression_Compare__Group_1_2__2
+ {
+ pushFollow(FOLLOW_18);
+ rule__DSL_Expression_Compare__Group_1_2__1__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_Compare__Group_1_2__2();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Compare__Group_1_2__1"
+
+
+ // $ANTLR start "rule__DSL_Expression_Compare__Group_1_2__1__Impl"
+ // InternalSensinact.g:5517:1: rule__DSL_Expression_Compare__Group_1_2__1__Impl : ( () ) ;
+ public final void rule__DSL_Expression_Compare__Group_1_2__1__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5521:1: ( ( () ) )
+ // InternalSensinact.g:5522:1: ( () )
+ {
+ // InternalSensinact.g:5522:1: ( () )
+ // InternalSensinact.g:5523:2: ()
+ {
+ before(grammarAccess.getDSL_Expression_CompareAccess().getDSL_Expression_SmallerLeftAction_1_2_1());
+ // InternalSensinact.g:5524:2: ()
+ // InternalSensinact.g:5524:3:
+ {
+ }
+
+ after(grammarAccess.getDSL_Expression_CompareAccess().getDSL_Expression_SmallerLeftAction_1_2_1());
+
+ }
+
+
+ }
+
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Compare__Group_1_2__1__Impl"
+
+
+ // $ANTLR start "rule__DSL_Expression_Compare__Group_1_2__2"
+ // InternalSensinact.g:5532:1: rule__DSL_Expression_Compare__Group_1_2__2 : rule__DSL_Expression_Compare__Group_1_2__2__Impl ;
+ public final void rule__DSL_Expression_Compare__Group_1_2__2() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5536:1: ( rule__DSL_Expression_Compare__Group_1_2__2__Impl )
+ // InternalSensinact.g:5537:2: rule__DSL_Expression_Compare__Group_1_2__2__Impl
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_Compare__Group_1_2__2__Impl();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Compare__Group_1_2__2"
+
+
+ // $ANTLR start "rule__DSL_Expression_Compare__Group_1_2__2__Impl"
+ // InternalSensinact.g:5543:1: rule__DSL_Expression_Compare__Group_1_2__2__Impl : ( ( rule__DSL_Expression_Compare__RightAssignment_1_2_2 ) ) ;
+ public final void rule__DSL_Expression_Compare__Group_1_2__2__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5547:1: ( ( ( rule__DSL_Expression_Compare__RightAssignment_1_2_2 ) ) )
+ // InternalSensinact.g:5548:1: ( ( rule__DSL_Expression_Compare__RightAssignment_1_2_2 ) )
+ {
+ // InternalSensinact.g:5548:1: ( ( rule__DSL_Expression_Compare__RightAssignment_1_2_2 ) )
+ // InternalSensinact.g:5549:2: ( rule__DSL_Expression_Compare__RightAssignment_1_2_2 )
+ {
+ before(grammarAccess.getDSL_Expression_CompareAccess().getRightAssignment_1_2_2());
+ // InternalSensinact.g:5550:2: ( rule__DSL_Expression_Compare__RightAssignment_1_2_2 )
+ // InternalSensinact.g:5550:3: rule__DSL_Expression_Compare__RightAssignment_1_2_2
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_Compare__RightAssignment_1_2_2();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_Expression_CompareAccess().getRightAssignment_1_2_2());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Compare__Group_1_2__2__Impl"
+
+
+ // $ANTLR start "rule__DSL_Expression_Compare__Group_1_3__0"
+ // InternalSensinact.g:5559:1: rule__DSL_Expression_Compare__Group_1_3__0 : rule__DSL_Expression_Compare__Group_1_3__0__Impl rule__DSL_Expression_Compare__Group_1_3__1 ;
+ public final void rule__DSL_Expression_Compare__Group_1_3__0() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5563:1: ( rule__DSL_Expression_Compare__Group_1_3__0__Impl rule__DSL_Expression_Compare__Group_1_3__1 )
+ // InternalSensinact.g:5564:2: rule__DSL_Expression_Compare__Group_1_3__0__Impl rule__DSL_Expression_Compare__Group_1_3__1
+ {
+ pushFollow(FOLLOW_18);
+ rule__DSL_Expression_Compare__Group_1_3__0__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_Compare__Group_1_3__1();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Compare__Group_1_3__0"
+
+
+ // $ANTLR start "rule__DSL_Expression_Compare__Group_1_3__0__Impl"
+ // InternalSensinact.g:5571:1: rule__DSL_Expression_Compare__Group_1_3__0__Impl : ( '<=' ) ;
+ public final void rule__DSL_Expression_Compare__Group_1_3__0__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5575:1: ( ( '<=' ) )
+ // InternalSensinact.g:5576:1: ( '<=' )
+ {
+ // InternalSensinact.g:5576:1: ( '<=' )
+ // InternalSensinact.g:5577:2: '<='
+ {
+ before(grammarAccess.getDSL_Expression_CompareAccess().getLessThanSignEqualsSignKeyword_1_3_0());
+ match(input,47,FOLLOW_2);
+ after(grammarAccess.getDSL_Expression_CompareAccess().getLessThanSignEqualsSignKeyword_1_3_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Compare__Group_1_3__0__Impl"
+
+
+ // $ANTLR start "rule__DSL_Expression_Compare__Group_1_3__1"
+ // InternalSensinact.g:5586:1: rule__DSL_Expression_Compare__Group_1_3__1 : rule__DSL_Expression_Compare__Group_1_3__1__Impl rule__DSL_Expression_Compare__Group_1_3__2 ;
+ public final void rule__DSL_Expression_Compare__Group_1_3__1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5590:1: ( rule__DSL_Expression_Compare__Group_1_3__1__Impl rule__DSL_Expression_Compare__Group_1_3__2 )
+ // InternalSensinact.g:5591:2: rule__DSL_Expression_Compare__Group_1_3__1__Impl rule__DSL_Expression_Compare__Group_1_3__2
+ {
+ pushFollow(FOLLOW_18);
+ rule__DSL_Expression_Compare__Group_1_3__1__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_Compare__Group_1_3__2();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Compare__Group_1_3__1"
+
+
+ // $ANTLR start "rule__DSL_Expression_Compare__Group_1_3__1__Impl"
+ // InternalSensinact.g:5598:1: rule__DSL_Expression_Compare__Group_1_3__1__Impl : ( () ) ;
+ public final void rule__DSL_Expression_Compare__Group_1_3__1__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5602:1: ( ( () ) )
+ // InternalSensinact.g:5603:1: ( () )
+ {
+ // InternalSensinact.g:5603:1: ( () )
+ // InternalSensinact.g:5604:2: ()
+ {
+ before(grammarAccess.getDSL_Expression_CompareAccess().getDSL_Expression_Smaller_EqualLeftAction_1_3_1());
+ // InternalSensinact.g:5605:2: ()
+ // InternalSensinact.g:5605:3:
+ {
+ }
+
+ after(grammarAccess.getDSL_Expression_CompareAccess().getDSL_Expression_Smaller_EqualLeftAction_1_3_1());
+
+ }
+
+
+ }
+
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Compare__Group_1_3__1__Impl"
+
+
+ // $ANTLR start "rule__DSL_Expression_Compare__Group_1_3__2"
+ // InternalSensinact.g:5613:1: rule__DSL_Expression_Compare__Group_1_3__2 : rule__DSL_Expression_Compare__Group_1_3__2__Impl ;
+ public final void rule__DSL_Expression_Compare__Group_1_3__2() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5617:1: ( rule__DSL_Expression_Compare__Group_1_3__2__Impl )
+ // InternalSensinact.g:5618:2: rule__DSL_Expression_Compare__Group_1_3__2__Impl
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_Compare__Group_1_3__2__Impl();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Compare__Group_1_3__2"
+
+
+ // $ANTLR start "rule__DSL_Expression_Compare__Group_1_3__2__Impl"
+ // InternalSensinact.g:5624:1: rule__DSL_Expression_Compare__Group_1_3__2__Impl : ( ( rule__DSL_Expression_Compare__RightAssignment_1_3_2 ) ) ;
+ public final void rule__DSL_Expression_Compare__Group_1_3__2__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5628:1: ( ( ( rule__DSL_Expression_Compare__RightAssignment_1_3_2 ) ) )
+ // InternalSensinact.g:5629:1: ( ( rule__DSL_Expression_Compare__RightAssignment_1_3_2 ) )
+ {
+ // InternalSensinact.g:5629:1: ( ( rule__DSL_Expression_Compare__RightAssignment_1_3_2 ) )
+ // InternalSensinact.g:5630:2: ( rule__DSL_Expression_Compare__RightAssignment_1_3_2 )
+ {
+ before(grammarAccess.getDSL_Expression_CompareAccess().getRightAssignment_1_3_2());
+ // InternalSensinact.g:5631:2: ( rule__DSL_Expression_Compare__RightAssignment_1_3_2 )
+ // InternalSensinact.g:5631:3: rule__DSL_Expression_Compare__RightAssignment_1_3_2
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_Compare__RightAssignment_1_3_2();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_Expression_CompareAccess().getRightAssignment_1_3_2());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Compare__Group_1_3__2__Impl"
+
+
+ // $ANTLR start "rule__DSL_Expression_PlusMinus__Group__0"
+ // InternalSensinact.g:5640:1: rule__DSL_Expression_PlusMinus__Group__0 : rule__DSL_Expression_PlusMinus__Group__0__Impl rule__DSL_Expression_PlusMinus__Group__1 ;
+ public final void rule__DSL_Expression_PlusMinus__Group__0() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5644:1: ( rule__DSL_Expression_PlusMinus__Group__0__Impl rule__DSL_Expression_PlusMinus__Group__1 )
+ // InternalSensinact.g:5645:2: rule__DSL_Expression_PlusMinus__Group__0__Impl rule__DSL_Expression_PlusMinus__Group__1
+ {
+ pushFollow(FOLLOW_39);
+ rule__DSL_Expression_PlusMinus__Group__0__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_PlusMinus__Group__1();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_PlusMinus__Group__0"
+
+
+ // $ANTLR start "rule__DSL_Expression_PlusMinus__Group__0__Impl"
+ // InternalSensinact.g:5652:1: rule__DSL_Expression_PlusMinus__Group__0__Impl : ( ruleDSL_Expression_MultiplicationDivision ) ;
+ public final void rule__DSL_Expression_PlusMinus__Group__0__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5656:1: ( ( ruleDSL_Expression_MultiplicationDivision ) )
+ // InternalSensinact.g:5657:1: ( ruleDSL_Expression_MultiplicationDivision )
+ {
+ // InternalSensinact.g:5657:1: ( ruleDSL_Expression_MultiplicationDivision )
+ // InternalSensinact.g:5658:2: ruleDSL_Expression_MultiplicationDivision
+ {
+ before(grammarAccess.getDSL_Expression_PlusMinusAccess().getDSL_Expression_MultiplicationDivisionParserRuleCall_0());
+ pushFollow(FOLLOW_2);
+ ruleDSL_Expression_MultiplicationDivision();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_Expression_PlusMinusAccess().getDSL_Expression_MultiplicationDivisionParserRuleCall_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_PlusMinus__Group__0__Impl"
+
+
+ // $ANTLR start "rule__DSL_Expression_PlusMinus__Group__1"
+ // InternalSensinact.g:5667:1: rule__DSL_Expression_PlusMinus__Group__1 : rule__DSL_Expression_PlusMinus__Group__1__Impl ;
+ public final void rule__DSL_Expression_PlusMinus__Group__1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5671:1: ( rule__DSL_Expression_PlusMinus__Group__1__Impl )
+ // InternalSensinact.g:5672:2: rule__DSL_Expression_PlusMinus__Group__1__Impl
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_PlusMinus__Group__1__Impl();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_PlusMinus__Group__1"
+
+
+ // $ANTLR start "rule__DSL_Expression_PlusMinus__Group__1__Impl"
+ // InternalSensinact.g:5678:1: rule__DSL_Expression_PlusMinus__Group__1__Impl : ( ( rule__DSL_Expression_PlusMinus__Alternatives_1 )* ) ;
+ public final void rule__DSL_Expression_PlusMinus__Group__1__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5682:1: ( ( ( rule__DSL_Expression_PlusMinus__Alternatives_1 )* ) )
+ // InternalSensinact.g:5683:1: ( ( rule__DSL_Expression_PlusMinus__Alternatives_1 )* )
+ {
+ // InternalSensinact.g:5683:1: ( ( rule__DSL_Expression_PlusMinus__Alternatives_1 )* )
+ // InternalSensinact.g:5684:2: ( rule__DSL_Expression_PlusMinus__Alternatives_1 )*
+ {
+ before(grammarAccess.getDSL_Expression_PlusMinusAccess().getAlternatives_1());
+ // InternalSensinact.g:5685:2: ( rule__DSL_Expression_PlusMinus__Alternatives_1 )*
+ loop27:
+ do {
+ int alt27=2;
+ int LA27_0 = input.LA(1);
+
+ if ( ((LA27_0>=48 && LA27_0<=49)) ) {
+ alt27=1;
+ }
+
+
+ switch (alt27) {
+ case 1 :
+ // InternalSensinact.g:5685:3: rule__DSL_Expression_PlusMinus__Alternatives_1
+ {
+ pushFollow(FOLLOW_40);
+ rule__DSL_Expression_PlusMinus__Alternatives_1();
+
+ state._fsp--;
+
+
+ }
+ break;
+
+ default :
+ break loop27;
+ }
+ } while (true);
+
+ after(grammarAccess.getDSL_Expression_PlusMinusAccess().getAlternatives_1());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_PlusMinus__Group__1__Impl"
+
+
+ // $ANTLR start "rule__DSL_Expression_PlusMinus__Group_1_0__0"
+ // InternalSensinact.g:5694:1: rule__DSL_Expression_PlusMinus__Group_1_0__0 : rule__DSL_Expression_PlusMinus__Group_1_0__0__Impl rule__DSL_Expression_PlusMinus__Group_1_0__1 ;
+ public final void rule__DSL_Expression_PlusMinus__Group_1_0__0() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5698:1: ( rule__DSL_Expression_PlusMinus__Group_1_0__0__Impl rule__DSL_Expression_PlusMinus__Group_1_0__1 )
+ // InternalSensinact.g:5699:2: rule__DSL_Expression_PlusMinus__Group_1_0__0__Impl rule__DSL_Expression_PlusMinus__Group_1_0__1
+ {
+ pushFollow(FOLLOW_18);
+ rule__DSL_Expression_PlusMinus__Group_1_0__0__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_PlusMinus__Group_1_0__1();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_PlusMinus__Group_1_0__0"
+
+
+ // $ANTLR start "rule__DSL_Expression_PlusMinus__Group_1_0__0__Impl"
+ // InternalSensinact.g:5706:1: rule__DSL_Expression_PlusMinus__Group_1_0__0__Impl : ( '+' ) ;
+ public final void rule__DSL_Expression_PlusMinus__Group_1_0__0__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5710:1: ( ( '+' ) )
+ // InternalSensinact.g:5711:1: ( '+' )
+ {
+ // InternalSensinact.g:5711:1: ( '+' )
+ // InternalSensinact.g:5712:2: '+'
+ {
+ before(grammarAccess.getDSL_Expression_PlusMinusAccess().getPlusSignKeyword_1_0_0());
+ match(input,48,FOLLOW_2);
+ after(grammarAccess.getDSL_Expression_PlusMinusAccess().getPlusSignKeyword_1_0_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_PlusMinus__Group_1_0__0__Impl"
+
+
+ // $ANTLR start "rule__DSL_Expression_PlusMinus__Group_1_0__1"
+ // InternalSensinact.g:5721:1: rule__DSL_Expression_PlusMinus__Group_1_0__1 : rule__DSL_Expression_PlusMinus__Group_1_0__1__Impl rule__DSL_Expression_PlusMinus__Group_1_0__2 ;
+ public final void rule__DSL_Expression_PlusMinus__Group_1_0__1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5725:1: ( rule__DSL_Expression_PlusMinus__Group_1_0__1__Impl rule__DSL_Expression_PlusMinus__Group_1_0__2 )
+ // InternalSensinact.g:5726:2: rule__DSL_Expression_PlusMinus__Group_1_0__1__Impl rule__DSL_Expression_PlusMinus__Group_1_0__2
+ {
+ pushFollow(FOLLOW_18);
+ rule__DSL_Expression_PlusMinus__Group_1_0__1__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_PlusMinus__Group_1_0__2();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_PlusMinus__Group_1_0__1"
+
+
+ // $ANTLR start "rule__DSL_Expression_PlusMinus__Group_1_0__1__Impl"
+ // InternalSensinact.g:5733:1: rule__DSL_Expression_PlusMinus__Group_1_0__1__Impl : ( () ) ;
+ public final void rule__DSL_Expression_PlusMinus__Group_1_0__1__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5737:1: ( ( () ) )
+ // InternalSensinact.g:5738:1: ( () )
+ {
+ // InternalSensinact.g:5738:1: ( () )
+ // InternalSensinact.g:5739:2: ()
+ {
+ before(grammarAccess.getDSL_Expression_PlusMinusAccess().getDSL_Expression_PlusLeftAction_1_0_1());
+ // InternalSensinact.g:5740:2: ()
+ // InternalSensinact.g:5740:3:
+ {
+ }
+
+ after(grammarAccess.getDSL_Expression_PlusMinusAccess().getDSL_Expression_PlusLeftAction_1_0_1());
+
+ }
+
+
+ }
+
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_PlusMinus__Group_1_0__1__Impl"
+
+
+ // $ANTLR start "rule__DSL_Expression_PlusMinus__Group_1_0__2"
+ // InternalSensinact.g:5748:1: rule__DSL_Expression_PlusMinus__Group_1_0__2 : rule__DSL_Expression_PlusMinus__Group_1_0__2__Impl ;
+ public final void rule__DSL_Expression_PlusMinus__Group_1_0__2() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5752:1: ( rule__DSL_Expression_PlusMinus__Group_1_0__2__Impl )
+ // InternalSensinact.g:5753:2: rule__DSL_Expression_PlusMinus__Group_1_0__2__Impl
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_PlusMinus__Group_1_0__2__Impl();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_PlusMinus__Group_1_0__2"
+
+
+ // $ANTLR start "rule__DSL_Expression_PlusMinus__Group_1_0__2__Impl"
+ // InternalSensinact.g:5759:1: rule__DSL_Expression_PlusMinus__Group_1_0__2__Impl : ( ( rule__DSL_Expression_PlusMinus__RightAssignment_1_0_2 ) ) ;
+ public final void rule__DSL_Expression_PlusMinus__Group_1_0__2__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5763:1: ( ( ( rule__DSL_Expression_PlusMinus__RightAssignment_1_0_2 ) ) )
+ // InternalSensinact.g:5764:1: ( ( rule__DSL_Expression_PlusMinus__RightAssignment_1_0_2 ) )
+ {
+ // InternalSensinact.g:5764:1: ( ( rule__DSL_Expression_PlusMinus__RightAssignment_1_0_2 ) )
+ // InternalSensinact.g:5765:2: ( rule__DSL_Expression_PlusMinus__RightAssignment_1_0_2 )
+ {
+ before(grammarAccess.getDSL_Expression_PlusMinusAccess().getRightAssignment_1_0_2());
+ // InternalSensinact.g:5766:2: ( rule__DSL_Expression_PlusMinus__RightAssignment_1_0_2 )
+ // InternalSensinact.g:5766:3: rule__DSL_Expression_PlusMinus__RightAssignment_1_0_2
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_PlusMinus__RightAssignment_1_0_2();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_Expression_PlusMinusAccess().getRightAssignment_1_0_2());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_PlusMinus__Group_1_0__2__Impl"
+
+
+ // $ANTLR start "rule__DSL_Expression_PlusMinus__Group_1_1__0"
+ // InternalSensinact.g:5775:1: rule__DSL_Expression_PlusMinus__Group_1_1__0 : rule__DSL_Expression_PlusMinus__Group_1_1__0__Impl rule__DSL_Expression_PlusMinus__Group_1_1__1 ;
+ public final void rule__DSL_Expression_PlusMinus__Group_1_1__0() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5779:1: ( rule__DSL_Expression_PlusMinus__Group_1_1__0__Impl rule__DSL_Expression_PlusMinus__Group_1_1__1 )
+ // InternalSensinact.g:5780:2: rule__DSL_Expression_PlusMinus__Group_1_1__0__Impl rule__DSL_Expression_PlusMinus__Group_1_1__1
+ {
+ pushFollow(FOLLOW_18);
+ rule__DSL_Expression_PlusMinus__Group_1_1__0__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_PlusMinus__Group_1_1__1();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_PlusMinus__Group_1_1__0"
+
+
+ // $ANTLR start "rule__DSL_Expression_PlusMinus__Group_1_1__0__Impl"
+ // InternalSensinact.g:5787:1: rule__DSL_Expression_PlusMinus__Group_1_1__0__Impl : ( '-' ) ;
+ public final void rule__DSL_Expression_PlusMinus__Group_1_1__0__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5791:1: ( ( '-' ) )
+ // InternalSensinact.g:5792:1: ( '-' )
+ {
+ // InternalSensinact.g:5792:1: ( '-' )
+ // InternalSensinact.g:5793:2: '-'
+ {
+ before(grammarAccess.getDSL_Expression_PlusMinusAccess().getHyphenMinusKeyword_1_1_0());
+ match(input,49,FOLLOW_2);
+ after(grammarAccess.getDSL_Expression_PlusMinusAccess().getHyphenMinusKeyword_1_1_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_PlusMinus__Group_1_1__0__Impl"
+
+
+ // $ANTLR start "rule__DSL_Expression_PlusMinus__Group_1_1__1"
+ // InternalSensinact.g:5802:1: rule__DSL_Expression_PlusMinus__Group_1_1__1 : rule__DSL_Expression_PlusMinus__Group_1_1__1__Impl rule__DSL_Expression_PlusMinus__Group_1_1__2 ;
+ public final void rule__DSL_Expression_PlusMinus__Group_1_1__1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5806:1: ( rule__DSL_Expression_PlusMinus__Group_1_1__1__Impl rule__DSL_Expression_PlusMinus__Group_1_1__2 )
+ // InternalSensinact.g:5807:2: rule__DSL_Expression_PlusMinus__Group_1_1__1__Impl rule__DSL_Expression_PlusMinus__Group_1_1__2
+ {
+ pushFollow(FOLLOW_18);
+ rule__DSL_Expression_PlusMinus__Group_1_1__1__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_PlusMinus__Group_1_1__2();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_PlusMinus__Group_1_1__1"
+
+
+ // $ANTLR start "rule__DSL_Expression_PlusMinus__Group_1_1__1__Impl"
+ // InternalSensinact.g:5814:1: rule__DSL_Expression_PlusMinus__Group_1_1__1__Impl : ( () ) ;
+ public final void rule__DSL_Expression_PlusMinus__Group_1_1__1__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5818:1: ( ( () ) )
+ // InternalSensinact.g:5819:1: ( () )
+ {
+ // InternalSensinact.g:5819:1: ( () )
+ // InternalSensinact.g:5820:2: ()
+ {
+ before(grammarAccess.getDSL_Expression_PlusMinusAccess().getDSL_Expression_MinusLeftAction_1_1_1());
+ // InternalSensinact.g:5821:2: ()
+ // InternalSensinact.g:5821:3:
+ {
+ }
+
+ after(grammarAccess.getDSL_Expression_PlusMinusAccess().getDSL_Expression_MinusLeftAction_1_1_1());
+
+ }
+
+
+ }
+
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_PlusMinus__Group_1_1__1__Impl"
+
+
+ // $ANTLR start "rule__DSL_Expression_PlusMinus__Group_1_1__2"
+ // InternalSensinact.g:5829:1: rule__DSL_Expression_PlusMinus__Group_1_1__2 : rule__DSL_Expression_PlusMinus__Group_1_1__2__Impl ;
+ public final void rule__DSL_Expression_PlusMinus__Group_1_1__2() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5833:1: ( rule__DSL_Expression_PlusMinus__Group_1_1__2__Impl )
+ // InternalSensinact.g:5834:2: rule__DSL_Expression_PlusMinus__Group_1_1__2__Impl
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_PlusMinus__Group_1_1__2__Impl();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_PlusMinus__Group_1_1__2"
+
+
+ // $ANTLR start "rule__DSL_Expression_PlusMinus__Group_1_1__2__Impl"
+ // InternalSensinact.g:5840:1: rule__DSL_Expression_PlusMinus__Group_1_1__2__Impl : ( ( rule__DSL_Expression_PlusMinus__RightAssignment_1_1_2 ) ) ;
+ public final void rule__DSL_Expression_PlusMinus__Group_1_1__2__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5844:1: ( ( ( rule__DSL_Expression_PlusMinus__RightAssignment_1_1_2 ) ) )
+ // InternalSensinact.g:5845:1: ( ( rule__DSL_Expression_PlusMinus__RightAssignment_1_1_2 ) )
+ {
+ // InternalSensinact.g:5845:1: ( ( rule__DSL_Expression_PlusMinus__RightAssignment_1_1_2 ) )
+ // InternalSensinact.g:5846:2: ( rule__DSL_Expression_PlusMinus__RightAssignment_1_1_2 )
+ {
+ before(grammarAccess.getDSL_Expression_PlusMinusAccess().getRightAssignment_1_1_2());
+ // InternalSensinact.g:5847:2: ( rule__DSL_Expression_PlusMinus__RightAssignment_1_1_2 )
+ // InternalSensinact.g:5847:3: rule__DSL_Expression_PlusMinus__RightAssignment_1_1_2
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_PlusMinus__RightAssignment_1_1_2();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_Expression_PlusMinusAccess().getRightAssignment_1_1_2());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_PlusMinus__Group_1_1__2__Impl"
+
+
+ // $ANTLR start "rule__DSL_Expression_MultiplicationDivision__Group__0"
+ // InternalSensinact.g:5856:1: rule__DSL_Expression_MultiplicationDivision__Group__0 : rule__DSL_Expression_MultiplicationDivision__Group__0__Impl rule__DSL_Expression_MultiplicationDivision__Group__1 ;
+ public final void rule__DSL_Expression_MultiplicationDivision__Group__0() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5860:1: ( rule__DSL_Expression_MultiplicationDivision__Group__0__Impl rule__DSL_Expression_MultiplicationDivision__Group__1 )
+ // InternalSensinact.g:5861:2: rule__DSL_Expression_MultiplicationDivision__Group__0__Impl rule__DSL_Expression_MultiplicationDivision__Group__1
+ {
+ pushFollow(FOLLOW_41);
+ rule__DSL_Expression_MultiplicationDivision__Group__0__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_MultiplicationDivision__Group__1();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_MultiplicationDivision__Group__0"
+
+
+ // $ANTLR start "rule__DSL_Expression_MultiplicationDivision__Group__0__Impl"
+ // InternalSensinact.g:5868:1: rule__DSL_Expression_MultiplicationDivision__Group__0__Impl : ( ruleDSL_Expression_Unary ) ;
+ public final void rule__DSL_Expression_MultiplicationDivision__Group__0__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5872:1: ( ( ruleDSL_Expression_Unary ) )
+ // InternalSensinact.g:5873:1: ( ruleDSL_Expression_Unary )
+ {
+ // InternalSensinact.g:5873:1: ( ruleDSL_Expression_Unary )
+ // InternalSensinact.g:5874:2: ruleDSL_Expression_Unary
+ {
+ before(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getDSL_Expression_UnaryParserRuleCall_0());
+ pushFollow(FOLLOW_2);
+ ruleDSL_Expression_Unary();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getDSL_Expression_UnaryParserRuleCall_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_MultiplicationDivision__Group__0__Impl"
+
+
+ // $ANTLR start "rule__DSL_Expression_MultiplicationDivision__Group__1"
+ // InternalSensinact.g:5883:1: rule__DSL_Expression_MultiplicationDivision__Group__1 : rule__DSL_Expression_MultiplicationDivision__Group__1__Impl ;
+ public final void rule__DSL_Expression_MultiplicationDivision__Group__1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5887:1: ( rule__DSL_Expression_MultiplicationDivision__Group__1__Impl )
+ // InternalSensinact.g:5888:2: rule__DSL_Expression_MultiplicationDivision__Group__1__Impl
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_MultiplicationDivision__Group__1__Impl();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_MultiplicationDivision__Group__1"
+
+
+ // $ANTLR start "rule__DSL_Expression_MultiplicationDivision__Group__1__Impl"
+ // InternalSensinact.g:5894:1: rule__DSL_Expression_MultiplicationDivision__Group__1__Impl : ( ( rule__DSL_Expression_MultiplicationDivision__Alternatives_1 )* ) ;
+ public final void rule__DSL_Expression_MultiplicationDivision__Group__1__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5898:1: ( ( ( rule__DSL_Expression_MultiplicationDivision__Alternatives_1 )* ) )
+ // InternalSensinact.g:5899:1: ( ( rule__DSL_Expression_MultiplicationDivision__Alternatives_1 )* )
+ {
+ // InternalSensinact.g:5899:1: ( ( rule__DSL_Expression_MultiplicationDivision__Alternatives_1 )* )
+ // InternalSensinact.g:5900:2: ( rule__DSL_Expression_MultiplicationDivision__Alternatives_1 )*
+ {
+ before(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getAlternatives_1());
+ // InternalSensinact.g:5901:2: ( rule__DSL_Expression_MultiplicationDivision__Alternatives_1 )*
+ loop28:
+ do {
+ int alt28=2;
+ int LA28_0 = input.LA(1);
+
+ if ( (LA28_0==17||(LA28_0>=50 && LA28_0<=51)) ) {
+ alt28=1;
+ }
+
+
+ switch (alt28) {
+ case 1 :
+ // InternalSensinact.g:5901:3: rule__DSL_Expression_MultiplicationDivision__Alternatives_1
+ {
+ pushFollow(FOLLOW_42);
+ rule__DSL_Expression_MultiplicationDivision__Alternatives_1();
+
+ state._fsp--;
+
+
+ }
+ break;
+
+ default :
+ break loop28;
+ }
+ } while (true);
+
+ after(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getAlternatives_1());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_MultiplicationDivision__Group__1__Impl"
+
+
+ // $ANTLR start "rule__DSL_Expression_MultiplicationDivision__Group_1_0__0"
+ // InternalSensinact.g:5910:1: rule__DSL_Expression_MultiplicationDivision__Group_1_0__0 : rule__DSL_Expression_MultiplicationDivision__Group_1_0__0__Impl rule__DSL_Expression_MultiplicationDivision__Group_1_0__1 ;
+ public final void rule__DSL_Expression_MultiplicationDivision__Group_1_0__0() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5914:1: ( rule__DSL_Expression_MultiplicationDivision__Group_1_0__0__Impl rule__DSL_Expression_MultiplicationDivision__Group_1_0__1 )
+ // InternalSensinact.g:5915:2: rule__DSL_Expression_MultiplicationDivision__Group_1_0__0__Impl rule__DSL_Expression_MultiplicationDivision__Group_1_0__1
+ {
+ pushFollow(FOLLOW_18);
+ rule__DSL_Expression_MultiplicationDivision__Group_1_0__0__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_MultiplicationDivision__Group_1_0__1();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_MultiplicationDivision__Group_1_0__0"
+
+
+ // $ANTLR start "rule__DSL_Expression_MultiplicationDivision__Group_1_0__0__Impl"
+ // InternalSensinact.g:5922:1: rule__DSL_Expression_MultiplicationDivision__Group_1_0__0__Impl : ( '*' ) ;
+ public final void rule__DSL_Expression_MultiplicationDivision__Group_1_0__0__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5926:1: ( ( '*' ) )
+ // InternalSensinact.g:5927:1: ( '*' )
+ {
+ // InternalSensinact.g:5927:1: ( '*' )
+ // InternalSensinact.g:5928:2: '*'
+ {
+ before(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getAsteriskKeyword_1_0_0());
+ match(input,50,FOLLOW_2);
+ after(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getAsteriskKeyword_1_0_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_MultiplicationDivision__Group_1_0__0__Impl"
+
+
+ // $ANTLR start "rule__DSL_Expression_MultiplicationDivision__Group_1_0__1"
+ // InternalSensinact.g:5937:1: rule__DSL_Expression_MultiplicationDivision__Group_1_0__1 : rule__DSL_Expression_MultiplicationDivision__Group_1_0__1__Impl rule__DSL_Expression_MultiplicationDivision__Group_1_0__2 ;
+ public final void rule__DSL_Expression_MultiplicationDivision__Group_1_0__1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5941:1: ( rule__DSL_Expression_MultiplicationDivision__Group_1_0__1__Impl rule__DSL_Expression_MultiplicationDivision__Group_1_0__2 )
+ // InternalSensinact.g:5942:2: rule__DSL_Expression_MultiplicationDivision__Group_1_0__1__Impl rule__DSL_Expression_MultiplicationDivision__Group_1_0__2
+ {
+ pushFollow(FOLLOW_18);
+ rule__DSL_Expression_MultiplicationDivision__Group_1_0__1__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_MultiplicationDivision__Group_1_0__2();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_MultiplicationDivision__Group_1_0__1"
+
+
+ // $ANTLR start "rule__DSL_Expression_MultiplicationDivision__Group_1_0__1__Impl"
+ // InternalSensinact.g:5949:1: rule__DSL_Expression_MultiplicationDivision__Group_1_0__1__Impl : ( () ) ;
+ public final void rule__DSL_Expression_MultiplicationDivision__Group_1_0__1__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5953:1: ( ( () ) )
+ // InternalSensinact.g:5954:1: ( () )
+ {
+ // InternalSensinact.g:5954:1: ( () )
+ // InternalSensinact.g:5955:2: ()
+ {
+ before(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getDSL_Expression_MultiplicationLeftAction_1_0_1());
+ // InternalSensinact.g:5956:2: ()
+ // InternalSensinact.g:5956:3:
+ {
+ }
+
+ after(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getDSL_Expression_MultiplicationLeftAction_1_0_1());
+
+ }
+
+
+ }
+
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_MultiplicationDivision__Group_1_0__1__Impl"
+
+
+ // $ANTLR start "rule__DSL_Expression_MultiplicationDivision__Group_1_0__2"
+ // InternalSensinact.g:5964:1: rule__DSL_Expression_MultiplicationDivision__Group_1_0__2 : rule__DSL_Expression_MultiplicationDivision__Group_1_0__2__Impl ;
+ public final void rule__DSL_Expression_MultiplicationDivision__Group_1_0__2() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5968:1: ( rule__DSL_Expression_MultiplicationDivision__Group_1_0__2__Impl )
+ // InternalSensinact.g:5969:2: rule__DSL_Expression_MultiplicationDivision__Group_1_0__2__Impl
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_MultiplicationDivision__Group_1_0__2__Impl();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_MultiplicationDivision__Group_1_0__2"
+
+
+ // $ANTLR start "rule__DSL_Expression_MultiplicationDivision__Group_1_0__2__Impl"
+ // InternalSensinact.g:5975:1: rule__DSL_Expression_MultiplicationDivision__Group_1_0__2__Impl : ( ( rule__DSL_Expression_MultiplicationDivision__RightAssignment_1_0_2 ) ) ;
+ public final void rule__DSL_Expression_MultiplicationDivision__Group_1_0__2__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5979:1: ( ( ( rule__DSL_Expression_MultiplicationDivision__RightAssignment_1_0_2 ) ) )
+ // InternalSensinact.g:5980:1: ( ( rule__DSL_Expression_MultiplicationDivision__RightAssignment_1_0_2 ) )
+ {
+ // InternalSensinact.g:5980:1: ( ( rule__DSL_Expression_MultiplicationDivision__RightAssignment_1_0_2 ) )
+ // InternalSensinact.g:5981:2: ( rule__DSL_Expression_MultiplicationDivision__RightAssignment_1_0_2 )
+ {
+ before(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getRightAssignment_1_0_2());
+ // InternalSensinact.g:5982:2: ( rule__DSL_Expression_MultiplicationDivision__RightAssignment_1_0_2 )
+ // InternalSensinact.g:5982:3: rule__DSL_Expression_MultiplicationDivision__RightAssignment_1_0_2
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_MultiplicationDivision__RightAssignment_1_0_2();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getRightAssignment_1_0_2());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_MultiplicationDivision__Group_1_0__2__Impl"
+
+
+ // $ANTLR start "rule__DSL_Expression_MultiplicationDivision__Group_1_1__0"
+ // InternalSensinact.g:5991:1: rule__DSL_Expression_MultiplicationDivision__Group_1_1__0 : rule__DSL_Expression_MultiplicationDivision__Group_1_1__0__Impl rule__DSL_Expression_MultiplicationDivision__Group_1_1__1 ;
+ public final void rule__DSL_Expression_MultiplicationDivision__Group_1_1__0() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:5995:1: ( rule__DSL_Expression_MultiplicationDivision__Group_1_1__0__Impl rule__DSL_Expression_MultiplicationDivision__Group_1_1__1 )
+ // InternalSensinact.g:5996:2: rule__DSL_Expression_MultiplicationDivision__Group_1_1__0__Impl rule__DSL_Expression_MultiplicationDivision__Group_1_1__1
+ {
+ pushFollow(FOLLOW_18);
+ rule__DSL_Expression_MultiplicationDivision__Group_1_1__0__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_MultiplicationDivision__Group_1_1__1();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_MultiplicationDivision__Group_1_1__0"
+
+
+ // $ANTLR start "rule__DSL_Expression_MultiplicationDivision__Group_1_1__0__Impl"
+ // InternalSensinact.g:6003:1: rule__DSL_Expression_MultiplicationDivision__Group_1_1__0__Impl : ( '/' ) ;
+ public final void rule__DSL_Expression_MultiplicationDivision__Group_1_1__0__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:6007:1: ( ( '/' ) )
+ // InternalSensinact.g:6008:1: ( '/' )
+ {
+ // InternalSensinact.g:6008:1: ( '/' )
+ // InternalSensinact.g:6009:2: '/'
+ {
+ before(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getSolidusKeyword_1_1_0());
+ match(input,17,FOLLOW_2);
+ after(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getSolidusKeyword_1_1_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_MultiplicationDivision__Group_1_1__0__Impl"
+
+
+ // $ANTLR start "rule__DSL_Expression_MultiplicationDivision__Group_1_1__1"
+ // InternalSensinact.g:6018:1: rule__DSL_Expression_MultiplicationDivision__Group_1_1__1 : rule__DSL_Expression_MultiplicationDivision__Group_1_1__1__Impl rule__DSL_Expression_MultiplicationDivision__Group_1_1__2 ;
+ public final void rule__DSL_Expression_MultiplicationDivision__Group_1_1__1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:6022:1: ( rule__DSL_Expression_MultiplicationDivision__Group_1_1__1__Impl rule__DSL_Expression_MultiplicationDivision__Group_1_1__2 )
+ // InternalSensinact.g:6023:2: rule__DSL_Expression_MultiplicationDivision__Group_1_1__1__Impl rule__DSL_Expression_MultiplicationDivision__Group_1_1__2
+ {
+ pushFollow(FOLLOW_18);
+ rule__DSL_Expression_MultiplicationDivision__Group_1_1__1__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_MultiplicationDivision__Group_1_1__2();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_MultiplicationDivision__Group_1_1__1"
+
+
+ // $ANTLR start "rule__DSL_Expression_MultiplicationDivision__Group_1_1__1__Impl"
+ // InternalSensinact.g:6030:1: rule__DSL_Expression_MultiplicationDivision__Group_1_1__1__Impl : ( () ) ;
+ public final void rule__DSL_Expression_MultiplicationDivision__Group_1_1__1__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:6034:1: ( ( () ) )
+ // InternalSensinact.g:6035:1: ( () )
+ {
+ // InternalSensinact.g:6035:1: ( () )
+ // InternalSensinact.g:6036:2: ()
+ {
+ before(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getDSL_Expression_DivisionLeftAction_1_1_1());
+ // InternalSensinact.g:6037:2: ()
+ // InternalSensinact.g:6037:3:
+ {
+ }
+
+ after(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getDSL_Expression_DivisionLeftAction_1_1_1());
+
+ }
+
+
+ }
+
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_MultiplicationDivision__Group_1_1__1__Impl"
+
+
+ // $ANTLR start "rule__DSL_Expression_MultiplicationDivision__Group_1_1__2"
+ // InternalSensinact.g:6045:1: rule__DSL_Expression_MultiplicationDivision__Group_1_1__2 : rule__DSL_Expression_MultiplicationDivision__Group_1_1__2__Impl ;
+ public final void rule__DSL_Expression_MultiplicationDivision__Group_1_1__2() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:6049:1: ( rule__DSL_Expression_MultiplicationDivision__Group_1_1__2__Impl )
+ // InternalSensinact.g:6050:2: rule__DSL_Expression_MultiplicationDivision__Group_1_1__2__Impl
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_MultiplicationDivision__Group_1_1__2__Impl();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_MultiplicationDivision__Group_1_1__2"
+
+
+ // $ANTLR start "rule__DSL_Expression_MultiplicationDivision__Group_1_1__2__Impl"
+ // InternalSensinact.g:6056:1: rule__DSL_Expression_MultiplicationDivision__Group_1_1__2__Impl : ( ( rule__DSL_Expression_MultiplicationDivision__RightAssignment_1_1_2 ) ) ;
+ public final void rule__DSL_Expression_MultiplicationDivision__Group_1_1__2__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:6060:1: ( ( ( rule__DSL_Expression_MultiplicationDivision__RightAssignment_1_1_2 ) ) )
+ // InternalSensinact.g:6061:1: ( ( rule__DSL_Expression_MultiplicationDivision__RightAssignment_1_1_2 ) )
+ {
+ // InternalSensinact.g:6061:1: ( ( rule__DSL_Expression_MultiplicationDivision__RightAssignment_1_1_2 ) )
+ // InternalSensinact.g:6062:2: ( rule__DSL_Expression_MultiplicationDivision__RightAssignment_1_1_2 )
+ {
+ before(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getRightAssignment_1_1_2());
+ // InternalSensinact.g:6063:2: ( rule__DSL_Expression_MultiplicationDivision__RightAssignment_1_1_2 )
+ // InternalSensinact.g:6063:3: rule__DSL_Expression_MultiplicationDivision__RightAssignment_1_1_2
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_MultiplicationDivision__RightAssignment_1_1_2();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getRightAssignment_1_1_2());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_MultiplicationDivision__Group_1_1__2__Impl"
+
+
+ // $ANTLR start "rule__DSL_Expression_MultiplicationDivision__Group_1_2__0"
+ // InternalSensinact.g:6072:1: rule__DSL_Expression_MultiplicationDivision__Group_1_2__0 : rule__DSL_Expression_MultiplicationDivision__Group_1_2__0__Impl rule__DSL_Expression_MultiplicationDivision__Group_1_2__1 ;
+ public final void rule__DSL_Expression_MultiplicationDivision__Group_1_2__0() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:6076:1: ( rule__DSL_Expression_MultiplicationDivision__Group_1_2__0__Impl rule__DSL_Expression_MultiplicationDivision__Group_1_2__1 )
+ // InternalSensinact.g:6077:2: rule__DSL_Expression_MultiplicationDivision__Group_1_2__0__Impl rule__DSL_Expression_MultiplicationDivision__Group_1_2__1
+ {
+ pushFollow(FOLLOW_18);
+ rule__DSL_Expression_MultiplicationDivision__Group_1_2__0__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_MultiplicationDivision__Group_1_2__1();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_MultiplicationDivision__Group_1_2__0"
+
+
+ // $ANTLR start "rule__DSL_Expression_MultiplicationDivision__Group_1_2__0__Impl"
+ // InternalSensinact.g:6084:1: rule__DSL_Expression_MultiplicationDivision__Group_1_2__0__Impl : ( '%' ) ;
+ public final void rule__DSL_Expression_MultiplicationDivision__Group_1_2__0__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:6088:1: ( ( '%' ) )
+ // InternalSensinact.g:6089:1: ( '%' )
+ {
+ // InternalSensinact.g:6089:1: ( '%' )
+ // InternalSensinact.g:6090:2: '%'
+ {
+ before(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getPercentSignKeyword_1_2_0());
+ match(input,51,FOLLOW_2);
+ after(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getPercentSignKeyword_1_2_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_MultiplicationDivision__Group_1_2__0__Impl"
+
+
+ // $ANTLR start "rule__DSL_Expression_MultiplicationDivision__Group_1_2__1"
+ // InternalSensinact.g:6099:1: rule__DSL_Expression_MultiplicationDivision__Group_1_2__1 : rule__DSL_Expression_MultiplicationDivision__Group_1_2__1__Impl rule__DSL_Expression_MultiplicationDivision__Group_1_2__2 ;
+ public final void rule__DSL_Expression_MultiplicationDivision__Group_1_2__1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:6103:1: ( rule__DSL_Expression_MultiplicationDivision__Group_1_2__1__Impl rule__DSL_Expression_MultiplicationDivision__Group_1_2__2 )
+ // InternalSensinact.g:6104:2: rule__DSL_Expression_MultiplicationDivision__Group_1_2__1__Impl rule__DSL_Expression_MultiplicationDivision__Group_1_2__2
+ {
+ pushFollow(FOLLOW_18);
+ rule__DSL_Expression_MultiplicationDivision__Group_1_2__1__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_MultiplicationDivision__Group_1_2__2();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_MultiplicationDivision__Group_1_2__1"
+
+
+ // $ANTLR start "rule__DSL_Expression_MultiplicationDivision__Group_1_2__1__Impl"
+ // InternalSensinact.g:6111:1: rule__DSL_Expression_MultiplicationDivision__Group_1_2__1__Impl : ( () ) ;
+ public final void rule__DSL_Expression_MultiplicationDivision__Group_1_2__1__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:6115:1: ( ( () ) )
+ // InternalSensinact.g:6116:1: ( () )
+ {
+ // InternalSensinact.g:6116:1: ( () )
+ // InternalSensinact.g:6117:2: ()
+ {
+ before(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getDSL_Expression_ModuloLeftAction_1_2_1());
+ // InternalSensinact.g:6118:2: ()
+ // InternalSensinact.g:6118:3:
+ {
+ }
+
+ after(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getDSL_Expression_ModuloLeftAction_1_2_1());
+
+ }
+
+
+ }
+
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_MultiplicationDivision__Group_1_2__1__Impl"
+
+
+ // $ANTLR start "rule__DSL_Expression_MultiplicationDivision__Group_1_2__2"
+ // InternalSensinact.g:6126:1: rule__DSL_Expression_MultiplicationDivision__Group_1_2__2 : rule__DSL_Expression_MultiplicationDivision__Group_1_2__2__Impl ;
+ public final void rule__DSL_Expression_MultiplicationDivision__Group_1_2__2() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:6130:1: ( rule__DSL_Expression_MultiplicationDivision__Group_1_2__2__Impl )
+ // InternalSensinact.g:6131:2: rule__DSL_Expression_MultiplicationDivision__Group_1_2__2__Impl
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_MultiplicationDivision__Group_1_2__2__Impl();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_MultiplicationDivision__Group_1_2__2"
+
+
+ // $ANTLR start "rule__DSL_Expression_MultiplicationDivision__Group_1_2__2__Impl"
+ // InternalSensinact.g:6137:1: rule__DSL_Expression_MultiplicationDivision__Group_1_2__2__Impl : ( ( rule__DSL_Expression_MultiplicationDivision__RightAssignment_1_2_2 ) ) ;
+ public final void rule__DSL_Expression_MultiplicationDivision__Group_1_2__2__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:6141:1: ( ( ( rule__DSL_Expression_MultiplicationDivision__RightAssignment_1_2_2 ) ) )
+ // InternalSensinact.g:6142:1: ( ( rule__DSL_Expression_MultiplicationDivision__RightAssignment_1_2_2 ) )
+ {
+ // InternalSensinact.g:6142:1: ( ( rule__DSL_Expression_MultiplicationDivision__RightAssignment_1_2_2 ) )
+ // InternalSensinact.g:6143:2: ( rule__DSL_Expression_MultiplicationDivision__RightAssignment_1_2_2 )
+ {
+ before(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getRightAssignment_1_2_2());
+ // InternalSensinact.g:6144:2: ( rule__DSL_Expression_MultiplicationDivision__RightAssignment_1_2_2 )
+ // InternalSensinact.g:6144:3: rule__DSL_Expression_MultiplicationDivision__RightAssignment_1_2_2
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_MultiplicationDivision__RightAssignment_1_2_2();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getRightAssignment_1_2_2());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_MultiplicationDivision__Group_1_2__2__Impl"
+
+
+ // $ANTLR start "rule__DSL_Expression_Unary__Group_0__0"
+ // InternalSensinact.g:6153:1: rule__DSL_Expression_Unary__Group_0__0 : rule__DSL_Expression_Unary__Group_0__0__Impl rule__DSL_Expression_Unary__Group_0__1 ;
+ public final void rule__DSL_Expression_Unary__Group_0__0() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:6157:1: ( rule__DSL_Expression_Unary__Group_0__0__Impl rule__DSL_Expression_Unary__Group_0__1 )
+ // InternalSensinact.g:6158:2: rule__DSL_Expression_Unary__Group_0__0__Impl rule__DSL_Expression_Unary__Group_0__1
+ {
+ pushFollow(FOLLOW_21);
+ rule__DSL_Expression_Unary__Group_0__0__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_Unary__Group_0__1();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Unary__Group_0__0"
+
+
+ // $ANTLR start "rule__DSL_Expression_Unary__Group_0__0__Impl"
+ // InternalSensinact.g:6165:1: rule__DSL_Expression_Unary__Group_0__0__Impl : ( () ) ;
+ public final void rule__DSL_Expression_Unary__Group_0__0__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:6169:1: ( ( () ) )
+ // InternalSensinact.g:6170:1: ( () )
+ {
+ // InternalSensinact.g:6170:1: ( () )
+ // InternalSensinact.g:6171:2: ()
+ {
+ before(grammarAccess.getDSL_Expression_UnaryAccess().getDSL_Object_NumberAction_0_0());
+ // InternalSensinact.g:6172:2: ()
+ // InternalSensinact.g:6172:3:
+ {
+ }
+
+ after(grammarAccess.getDSL_Expression_UnaryAccess().getDSL_Object_NumberAction_0_0());
+
+ }
+
+
+ }
+
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Unary__Group_0__0__Impl"
+
+
+ // $ANTLR start "rule__DSL_Expression_Unary__Group_0__1"
+ // InternalSensinact.g:6180:1: rule__DSL_Expression_Unary__Group_0__1 : rule__DSL_Expression_Unary__Group_0__1__Impl ;
+ public final void rule__DSL_Expression_Unary__Group_0__1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:6184:1: ( rule__DSL_Expression_Unary__Group_0__1__Impl )
+ // InternalSensinact.g:6185:2: rule__DSL_Expression_Unary__Group_0__1__Impl
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_Unary__Group_0__1__Impl();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Unary__Group_0__1"
+
+
+ // $ANTLR start "rule__DSL_Expression_Unary__Group_0__1__Impl"
+ // InternalSensinact.g:6191:1: rule__DSL_Expression_Unary__Group_0__1__Impl : ( ( rule__DSL_Expression_Unary__ValueAssignment_0_1 ) ) ;
+ public final void rule__DSL_Expression_Unary__Group_0__1__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:6195:1: ( ( ( rule__DSL_Expression_Unary__ValueAssignment_0_1 ) ) )
+ // InternalSensinact.g:6196:1: ( ( rule__DSL_Expression_Unary__ValueAssignment_0_1 ) )
+ {
+ // InternalSensinact.g:6196:1: ( ( rule__DSL_Expression_Unary__ValueAssignment_0_1 ) )
+ // InternalSensinact.g:6197:2: ( rule__DSL_Expression_Unary__ValueAssignment_0_1 )
+ {
+ before(grammarAccess.getDSL_Expression_UnaryAccess().getValueAssignment_0_1());
+ // InternalSensinact.g:6198:2: ( rule__DSL_Expression_Unary__ValueAssignment_0_1 )
+ // InternalSensinact.g:6198:3: rule__DSL_Expression_Unary__ValueAssignment_0_1
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_Unary__ValueAssignment_0_1();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_Expression_UnaryAccess().getValueAssignment_0_1());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Unary__Group_0__1__Impl"
+
+
+ // $ANTLR start "rule__DSL_Expression_Unary__Group_1__0"
+ // InternalSensinact.g:6207:1: rule__DSL_Expression_Unary__Group_1__0 : rule__DSL_Expression_Unary__Group_1__0__Impl rule__DSL_Expression_Unary__Group_1__1 ;
+ public final void rule__DSL_Expression_Unary__Group_1__0() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:6211:1: ( rule__DSL_Expression_Unary__Group_1__0__Impl rule__DSL_Expression_Unary__Group_1__1 )
+ // InternalSensinact.g:6212:2: rule__DSL_Expression_Unary__Group_1__0__Impl rule__DSL_Expression_Unary__Group_1__1
+ {
+ pushFollow(FOLLOW_43);
+ rule__DSL_Expression_Unary__Group_1__0__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_Unary__Group_1__1();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Unary__Group_1__0"
+
+
+ // $ANTLR start "rule__DSL_Expression_Unary__Group_1__0__Impl"
+ // InternalSensinact.g:6219:1: rule__DSL_Expression_Unary__Group_1__0__Impl : ( () ) ;
+ public final void rule__DSL_Expression_Unary__Group_1__0__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:6223:1: ( ( () ) )
+ // InternalSensinact.g:6224:1: ( () )
+ {
+ // InternalSensinact.g:6224:1: ( () )
+ // InternalSensinact.g:6225:2: ()
+ {
+ before(grammarAccess.getDSL_Expression_UnaryAccess().getDSL_Object_StringAction_1_0());
+ // InternalSensinact.g:6226:2: ()
+ // InternalSensinact.g:6226:3:
+ {
+ }
+
+ after(grammarAccess.getDSL_Expression_UnaryAccess().getDSL_Object_StringAction_1_0());
+
+ }
+
+
+ }
+
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Unary__Group_1__0__Impl"
+
+
+ // $ANTLR start "rule__DSL_Expression_Unary__Group_1__1"
+ // InternalSensinact.g:6234:1: rule__DSL_Expression_Unary__Group_1__1 : rule__DSL_Expression_Unary__Group_1__1__Impl ;
+ public final void rule__DSL_Expression_Unary__Group_1__1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:6238:1: ( rule__DSL_Expression_Unary__Group_1__1__Impl )
+ // InternalSensinact.g:6239:2: rule__DSL_Expression_Unary__Group_1__1__Impl
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_Unary__Group_1__1__Impl();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Unary__Group_1__1"
+
+
+ // $ANTLR start "rule__DSL_Expression_Unary__Group_1__1__Impl"
+ // InternalSensinact.g:6245:1: rule__DSL_Expression_Unary__Group_1__1__Impl : ( ( rule__DSL_Expression_Unary__ValueAssignment_1_1 ) ) ;
+ public final void rule__DSL_Expression_Unary__Group_1__1__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:6249:1: ( ( ( rule__DSL_Expression_Unary__ValueAssignment_1_1 ) ) )
+ // InternalSensinact.g:6250:1: ( ( rule__DSL_Expression_Unary__ValueAssignment_1_1 ) )
+ {
+ // InternalSensinact.g:6250:1: ( ( rule__DSL_Expression_Unary__ValueAssignment_1_1 ) )
+ // InternalSensinact.g:6251:2: ( rule__DSL_Expression_Unary__ValueAssignment_1_1 )
+ {
+ before(grammarAccess.getDSL_Expression_UnaryAccess().getValueAssignment_1_1());
+ // InternalSensinact.g:6252:2: ( rule__DSL_Expression_Unary__ValueAssignment_1_1 )
+ // InternalSensinact.g:6252:3: rule__DSL_Expression_Unary__ValueAssignment_1_1
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_Unary__ValueAssignment_1_1();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_Expression_UnaryAccess().getValueAssignment_1_1());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Unary__Group_1__1__Impl"
+
+
+ // $ANTLR start "rule__DSL_Expression_Unary__Group_2__0"
+ // InternalSensinact.g:6261:1: rule__DSL_Expression_Unary__Group_2__0 : rule__DSL_Expression_Unary__Group_2__0__Impl rule__DSL_Expression_Unary__Group_2__1 ;
+ public final void rule__DSL_Expression_Unary__Group_2__0() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:6265:1: ( rule__DSL_Expression_Unary__Group_2__0__Impl rule__DSL_Expression_Unary__Group_2__1 )
+ // InternalSensinact.g:6266:2: rule__DSL_Expression_Unary__Group_2__0__Impl rule__DSL_Expression_Unary__Group_2__1
+ {
+ pushFollow(FOLLOW_44);
+ rule__DSL_Expression_Unary__Group_2__0__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_Unary__Group_2__1();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Unary__Group_2__0"
+
+
+ // $ANTLR start "rule__DSL_Expression_Unary__Group_2__0__Impl"
+ // InternalSensinact.g:6273:1: rule__DSL_Expression_Unary__Group_2__0__Impl : ( () ) ;
+ public final void rule__DSL_Expression_Unary__Group_2__0__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:6277:1: ( ( () ) )
+ // InternalSensinact.g:6278:1: ( () )
+ {
+ // InternalSensinact.g:6278:1: ( () )
+ // InternalSensinact.g:6279:2: ()
+ {
+ before(grammarAccess.getDSL_Expression_UnaryAccess().getDSL_Object_BooleanAction_2_0());
+ // InternalSensinact.g:6280:2: ()
+ // InternalSensinact.g:6280:3:
+ {
+ }
+
+ after(grammarAccess.getDSL_Expression_UnaryAccess().getDSL_Object_BooleanAction_2_0());
+
+ }
+
+
+ }
+
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Unary__Group_2__0__Impl"
+
+
+ // $ANTLR start "rule__DSL_Expression_Unary__Group_2__1"
+ // InternalSensinact.g:6288:1: rule__DSL_Expression_Unary__Group_2__1 : rule__DSL_Expression_Unary__Group_2__1__Impl ;
+ public final void rule__DSL_Expression_Unary__Group_2__1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:6292:1: ( rule__DSL_Expression_Unary__Group_2__1__Impl )
+ // InternalSensinact.g:6293:2: rule__DSL_Expression_Unary__Group_2__1__Impl
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_Unary__Group_2__1__Impl();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Unary__Group_2__1"
+
+
+ // $ANTLR start "rule__DSL_Expression_Unary__Group_2__1__Impl"
+ // InternalSensinact.g:6299:1: rule__DSL_Expression_Unary__Group_2__1__Impl : ( ( rule__DSL_Expression_Unary__ValueAssignment_2_1 ) ) ;
+ public final void rule__DSL_Expression_Unary__Group_2__1__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:6303:1: ( ( ( rule__DSL_Expression_Unary__ValueAssignment_2_1 ) ) )
+ // InternalSensinact.g:6304:1: ( ( rule__DSL_Expression_Unary__ValueAssignment_2_1 ) )
+ {
+ // InternalSensinact.g:6304:1: ( ( rule__DSL_Expression_Unary__ValueAssignment_2_1 ) )
+ // InternalSensinact.g:6305:2: ( rule__DSL_Expression_Unary__ValueAssignment_2_1 )
+ {
+ before(grammarAccess.getDSL_Expression_UnaryAccess().getValueAssignment_2_1());
+ // InternalSensinact.g:6306:2: ( rule__DSL_Expression_Unary__ValueAssignment_2_1 )
+ // InternalSensinact.g:6306:3: rule__DSL_Expression_Unary__ValueAssignment_2_1
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_Unary__ValueAssignment_2_1();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_Expression_UnaryAccess().getValueAssignment_2_1());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Unary__Group_2__1__Impl"
+
+
+ // $ANTLR start "rule__DSL_Expression_Unary__Group_3__0"
+ // InternalSensinact.g:6315:1: rule__DSL_Expression_Unary__Group_3__0 : rule__DSL_Expression_Unary__Group_3__0__Impl rule__DSL_Expression_Unary__Group_3__1 ;
+ public final void rule__DSL_Expression_Unary__Group_3__0() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:6319:1: ( rule__DSL_Expression_Unary__Group_3__0__Impl rule__DSL_Expression_Unary__Group_3__1 )
+ // InternalSensinact.g:6320:2: rule__DSL_Expression_Unary__Group_3__0__Impl rule__DSL_Expression_Unary__Group_3__1
+ {
+ pushFollow(FOLLOW_9);
+ rule__DSL_Expression_Unary__Group_3__0__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_Unary__Group_3__1();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Unary__Group_3__0"
+
+
+ // $ANTLR start "rule__DSL_Expression_Unary__Group_3__0__Impl"
+ // InternalSensinact.g:6327:1: rule__DSL_Expression_Unary__Group_3__0__Impl : ( () ) ;
+ public final void rule__DSL_Expression_Unary__Group_3__0__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:6331:1: ( ( () ) )
+ // InternalSensinact.g:6332:1: ( () )
+ {
+ // InternalSensinact.g:6332:1: ( () )
+ // InternalSensinact.g:6333:2: ()
+ {
+ before(grammarAccess.getDSL_Expression_UnaryAccess().getDSL_Object_RefAction_3_0());
+ // InternalSensinact.g:6334:2: ()
+ // InternalSensinact.g:6334:3:
+ {
+ }
+
+ after(grammarAccess.getDSL_Expression_UnaryAccess().getDSL_Object_RefAction_3_0());
+
+ }
+
+
+ }
+
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Unary__Group_3__0__Impl"
+
+
+ // $ANTLR start "rule__DSL_Expression_Unary__Group_3__1"
+ // InternalSensinact.g:6342:1: rule__DSL_Expression_Unary__Group_3__1 : rule__DSL_Expression_Unary__Group_3__1__Impl rule__DSL_Expression_Unary__Group_3__2 ;
+ public final void rule__DSL_Expression_Unary__Group_3__1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:6346:1: ( rule__DSL_Expression_Unary__Group_3__1__Impl rule__DSL_Expression_Unary__Group_3__2 )
+ // InternalSensinact.g:6347:2: rule__DSL_Expression_Unary__Group_3__1__Impl rule__DSL_Expression_Unary__Group_3__2
+ {
+ pushFollow(FOLLOW_45);
+ rule__DSL_Expression_Unary__Group_3__1__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_Unary__Group_3__2();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Unary__Group_3__1"
+
+
+ // $ANTLR start "rule__DSL_Expression_Unary__Group_3__1__Impl"
+ // InternalSensinact.g:6354:1: rule__DSL_Expression_Unary__Group_3__1__Impl : ( ( rule__DSL_Expression_Unary__ValueAssignment_3_1 ) ) ;
+ public final void rule__DSL_Expression_Unary__Group_3__1__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:6358:1: ( ( ( rule__DSL_Expression_Unary__ValueAssignment_3_1 ) ) )
+ // InternalSensinact.g:6359:1: ( ( rule__DSL_Expression_Unary__ValueAssignment_3_1 ) )
+ {
+ // InternalSensinact.g:6359:1: ( ( rule__DSL_Expression_Unary__ValueAssignment_3_1 ) )
+ // InternalSensinact.g:6360:2: ( rule__DSL_Expression_Unary__ValueAssignment_3_1 )
+ {
+ before(grammarAccess.getDSL_Expression_UnaryAccess().getValueAssignment_3_1());
+ // InternalSensinact.g:6361:2: ( rule__DSL_Expression_Unary__ValueAssignment_3_1 )
+ // InternalSensinact.g:6361:3: rule__DSL_Expression_Unary__ValueAssignment_3_1
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_Unary__ValueAssignment_3_1();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_Expression_UnaryAccess().getValueAssignment_3_1());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Unary__Group_3__1__Impl"
+
+
+ // $ANTLR start "rule__DSL_Expression_Unary__Group_3__2"
+ // InternalSensinact.g:6369:1: rule__DSL_Expression_Unary__Group_3__2 : rule__DSL_Expression_Unary__Group_3__2__Impl ;
+ public final void rule__DSL_Expression_Unary__Group_3__2() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:6373:1: ( rule__DSL_Expression_Unary__Group_3__2__Impl )
+ // InternalSensinact.g:6374:2: rule__DSL_Expression_Unary__Group_3__2__Impl
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_Unary__Group_3__2__Impl();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Unary__Group_3__2"
+
+
+ // $ANTLR start "rule__DSL_Expression_Unary__Group_3__2__Impl"
+ // InternalSensinact.g:6380:1: rule__DSL_Expression_Unary__Group_3__2__Impl : ( '.get()' ) ;
+ public final void rule__DSL_Expression_Unary__Group_3__2__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:6384:1: ( ( '.get()' ) )
+ // InternalSensinact.g:6385:1: ( '.get()' )
+ {
+ // InternalSensinact.g:6385:1: ( '.get()' )
+ // InternalSensinact.g:6386:2: '.get()'
+ {
+ before(grammarAccess.getDSL_Expression_UnaryAccess().getGetKeyword_3_2());
+ match(input,52,FOLLOW_2);
+ after(grammarAccess.getDSL_Expression_UnaryAccess().getGetKeyword_3_2());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Unary__Group_3__2__Impl"
+
+
+ // $ANTLR start "rule__DSL_Expression_Unary__Group_4__0"
+ // InternalSensinact.g:6396:1: rule__DSL_Expression_Unary__Group_4__0 : rule__DSL_Expression_Unary__Group_4__0__Impl rule__DSL_Expression_Unary__Group_4__1 ;
+ public final void rule__DSL_Expression_Unary__Group_4__0() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:6400:1: ( rule__DSL_Expression_Unary__Group_4__0__Impl rule__DSL_Expression_Unary__Group_4__1 )
+ // InternalSensinact.g:6401:2: rule__DSL_Expression_Unary__Group_4__0__Impl rule__DSL_Expression_Unary__Group_4__1
+ {
+ pushFollow(FOLLOW_18);
+ rule__DSL_Expression_Unary__Group_4__0__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_Unary__Group_4__1();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Unary__Group_4__0"
+
+
+ // $ANTLR start "rule__DSL_Expression_Unary__Group_4__0__Impl"
+ // InternalSensinact.g:6408:1: rule__DSL_Expression_Unary__Group_4__0__Impl : ( '(' ) ;
+ public final void rule__DSL_Expression_Unary__Group_4__0__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:6412:1: ( ( '(' ) )
+ // InternalSensinact.g:6413:1: ( '(' )
+ {
+ // InternalSensinact.g:6413:1: ( '(' )
+ // InternalSensinact.g:6414:2: '('
+ {
+ before(grammarAccess.getDSL_Expression_UnaryAccess().getLeftParenthesisKeyword_4_0());
+ match(input,28,FOLLOW_2);
+ after(grammarAccess.getDSL_Expression_UnaryAccess().getLeftParenthesisKeyword_4_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Unary__Group_4__0__Impl"
+
+
+ // $ANTLR start "rule__DSL_Expression_Unary__Group_4__1"
+ // InternalSensinact.g:6423:1: rule__DSL_Expression_Unary__Group_4__1 : rule__DSL_Expression_Unary__Group_4__1__Impl rule__DSL_Expression_Unary__Group_4__2 ;
+ public final void rule__DSL_Expression_Unary__Group_4__1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:6427:1: ( rule__DSL_Expression_Unary__Group_4__1__Impl rule__DSL_Expression_Unary__Group_4__2 )
+ // InternalSensinact.g:6428:2: rule__DSL_Expression_Unary__Group_4__1__Impl rule__DSL_Expression_Unary__Group_4__2
+ {
+ pushFollow(FOLLOW_25);
+ rule__DSL_Expression_Unary__Group_4__1__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_Unary__Group_4__2();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Unary__Group_4__1"
+
+
+ // $ANTLR start "rule__DSL_Expression_Unary__Group_4__1__Impl"
+ // InternalSensinact.g:6435:1: rule__DSL_Expression_Unary__Group_4__1__Impl : ( ruleDSL_Expression_Or ) ;
+ public final void rule__DSL_Expression_Unary__Group_4__1__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:6439:1: ( ( ruleDSL_Expression_Or ) )
+ // InternalSensinact.g:6440:1: ( ruleDSL_Expression_Or )
+ {
+ // InternalSensinact.g:6440:1: ( ruleDSL_Expression_Or )
+ // InternalSensinact.g:6441:2: ruleDSL_Expression_Or
+ {
+ before(grammarAccess.getDSL_Expression_UnaryAccess().getDSL_Expression_OrParserRuleCall_4_1());
+ pushFollow(FOLLOW_2);
+ ruleDSL_Expression_Or();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_Expression_UnaryAccess().getDSL_Expression_OrParserRuleCall_4_1());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Unary__Group_4__1__Impl"
+
+
+ // $ANTLR start "rule__DSL_Expression_Unary__Group_4__2"
+ // InternalSensinact.g:6450:1: rule__DSL_Expression_Unary__Group_4__2 : rule__DSL_Expression_Unary__Group_4__2__Impl ;
+ public final void rule__DSL_Expression_Unary__Group_4__2() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:6454:1: ( rule__DSL_Expression_Unary__Group_4__2__Impl )
+ // InternalSensinact.g:6455:2: rule__DSL_Expression_Unary__Group_4__2__Impl
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_Unary__Group_4__2__Impl();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Unary__Group_4__2"
+
+
+ // $ANTLR start "rule__DSL_Expression_Unary__Group_4__2__Impl"
+ // InternalSensinact.g:6461:1: rule__DSL_Expression_Unary__Group_4__2__Impl : ( ')' ) ;
+ public final void rule__DSL_Expression_Unary__Group_4__2__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:6465:1: ( ( ')' ) )
+ // InternalSensinact.g:6466:1: ( ')' )
+ {
+ // InternalSensinact.g:6466:1: ( ')' )
+ // InternalSensinact.g:6467:2: ')'
+ {
+ before(grammarAccess.getDSL_Expression_UnaryAccess().getRightParenthesisKeyword_4_2());
+ match(input,29,FOLLOW_2);
+ after(grammarAccess.getDSL_Expression_UnaryAccess().getRightParenthesisKeyword_4_2());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Unary__Group_4__2__Impl"
+
+
+ // $ANTLR start "rule__DSL_Expression_Unary__Group_5__0"
+ // InternalSensinact.g:6477:1: rule__DSL_Expression_Unary__Group_5__0 : rule__DSL_Expression_Unary__Group_5__0__Impl rule__DSL_Expression_Unary__Group_5__1 ;
+ public final void rule__DSL_Expression_Unary__Group_5__0() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:6481:1: ( rule__DSL_Expression_Unary__Group_5__0__Impl rule__DSL_Expression_Unary__Group_5__1 )
+ // InternalSensinact.g:6482:2: rule__DSL_Expression_Unary__Group_5__0__Impl rule__DSL_Expression_Unary__Group_5__1
+ {
+ pushFollow(FOLLOW_18);
+ rule__DSL_Expression_Unary__Group_5__0__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_Unary__Group_5__1();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Unary__Group_5__0"
+
+
+ // $ANTLR start "rule__DSL_Expression_Unary__Group_5__0__Impl"
+ // InternalSensinact.g:6489:1: rule__DSL_Expression_Unary__Group_5__0__Impl : ( 'not' ) ;
+ public final void rule__DSL_Expression_Unary__Group_5__0__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:6493:1: ( ( 'not' ) )
+ // InternalSensinact.g:6494:1: ( 'not' )
+ {
+ // InternalSensinact.g:6494:1: ( 'not' )
+ // InternalSensinact.g:6495:2: 'not'
+ {
+ before(grammarAccess.getDSL_Expression_UnaryAccess().getNotKeyword_5_0());
+ match(input,53,FOLLOW_2);
+ after(grammarAccess.getDSL_Expression_UnaryAccess().getNotKeyword_5_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Unary__Group_5__0__Impl"
+
+
+ // $ANTLR start "rule__DSL_Expression_Unary__Group_5__1"
+ // InternalSensinact.g:6504:1: rule__DSL_Expression_Unary__Group_5__1 : rule__DSL_Expression_Unary__Group_5__1__Impl rule__DSL_Expression_Unary__Group_5__2 ;
+ public final void rule__DSL_Expression_Unary__Group_5__1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:6508:1: ( rule__DSL_Expression_Unary__Group_5__1__Impl rule__DSL_Expression_Unary__Group_5__2 )
+ // InternalSensinact.g:6509:2: rule__DSL_Expression_Unary__Group_5__1__Impl rule__DSL_Expression_Unary__Group_5__2
+ {
+ pushFollow(FOLLOW_18);
+ rule__DSL_Expression_Unary__Group_5__1__Impl();
+
+ state._fsp--;
+
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_Unary__Group_5__2();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Unary__Group_5__1"
+
+
+ // $ANTLR start "rule__DSL_Expression_Unary__Group_5__1__Impl"
+ // InternalSensinact.g:6516:1: rule__DSL_Expression_Unary__Group_5__1__Impl : ( () ) ;
+ public final void rule__DSL_Expression_Unary__Group_5__1__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:6520:1: ( ( () ) )
+ // InternalSensinact.g:6521:1: ( () )
+ {
+ // InternalSensinact.g:6521:1: ( () )
+ // InternalSensinact.g:6522:2: ()
+ {
+ before(grammarAccess.getDSL_Expression_UnaryAccess().getDSL_Expression_NegateAction_5_1());
+ // InternalSensinact.g:6523:2: ()
+ // InternalSensinact.g:6523:3:
+ {
+ }
+
+ after(grammarAccess.getDSL_Expression_UnaryAccess().getDSL_Expression_NegateAction_5_1());
+
+ }
+
+
+ }
+
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Unary__Group_5__1__Impl"
+
+
+ // $ANTLR start "rule__DSL_Expression_Unary__Group_5__2"
+ // InternalSensinact.g:6531:1: rule__DSL_Expression_Unary__Group_5__2 : rule__DSL_Expression_Unary__Group_5__2__Impl ;
+ public final void rule__DSL_Expression_Unary__Group_5__2() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:6535:1: ( rule__DSL_Expression_Unary__Group_5__2__Impl )
+ // InternalSensinact.g:6536:2: rule__DSL_Expression_Unary__Group_5__2__Impl
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_Unary__Group_5__2__Impl();
+
+ state._fsp--;
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Unary__Group_5__2"
+
+
+ // $ANTLR start "rule__DSL_Expression_Unary__Group_5__2__Impl"
+ // InternalSensinact.g:6542:1: rule__DSL_Expression_Unary__Group_5__2__Impl : ( ( rule__DSL_Expression_Unary__ExpAssignment_5_2 ) ) ;
+ public final void rule__DSL_Expression_Unary__Group_5__2__Impl() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:6546:1: ( ( ( rule__DSL_Expression_Unary__ExpAssignment_5_2 ) ) )
+ // InternalSensinact.g:6547:1: ( ( rule__DSL_Expression_Unary__ExpAssignment_5_2 ) )
+ {
+ // InternalSensinact.g:6547:1: ( ( rule__DSL_Expression_Unary__ExpAssignment_5_2 ) )
+ // InternalSensinact.g:6548:2: ( rule__DSL_Expression_Unary__ExpAssignment_5_2 )
+ {
+ before(grammarAccess.getDSL_Expression_UnaryAccess().getExpAssignment_5_2());
+ // InternalSensinact.g:6549:2: ( rule__DSL_Expression_Unary__ExpAssignment_5_2 )
+ // InternalSensinact.g:6549:3: rule__DSL_Expression_Unary__ExpAssignment_5_2
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_Expression_Unary__ExpAssignment_5_2();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_Expression_UnaryAccess().getExpAssignment_5_2());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Unary__Group_5__2__Impl"
+
+
+ // $ANTLR start "rule__Sensinact__EcaAssignment_1"
+ // InternalSensinact.g:6558:1: rule__Sensinact__EcaAssignment_1 : ( ruleDSL_SENSINACT ) ;
+ public final void rule__Sensinact__EcaAssignment_1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:6562:1: ( ( ruleDSL_SENSINACT ) )
+ // InternalSensinact.g:6563:2: ( ruleDSL_SENSINACT )
+ {
+ // InternalSensinact.g:6563:2: ( ruleDSL_SENSINACT )
+ // InternalSensinact.g:6564:3: ruleDSL_SENSINACT
+ {
+ before(grammarAccess.getSensinactAccess().getEcaDSL_SENSINACTParserRuleCall_1_0());
+ pushFollow(FOLLOW_2);
+ ruleDSL_SENSINACT();
+
+ state._fsp--;
+
+ after(grammarAccess.getSensinactAccess().getEcaDSL_SENSINACTParserRuleCall_1_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__Sensinact__EcaAssignment_1"
+
+
+ // $ANTLR start "rule__DSL_SENSINACT__ResourcesAssignment_0"
+ // InternalSensinact.g:6573:1: rule__DSL_SENSINACT__ResourcesAssignment_0 : ( ruleDSL_Resource ) ;
+ public final void rule__DSL_SENSINACT__ResourcesAssignment_0() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:6577:1: ( ( ruleDSL_Resource ) )
+ // InternalSensinact.g:6578:2: ( ruleDSL_Resource )
+ {
+ // InternalSensinact.g:6578:2: ( ruleDSL_Resource )
+ // InternalSensinact.g:6579:3: ruleDSL_Resource
+ {
+ before(grammarAccess.getDSL_SENSINACTAccess().getResourcesDSL_ResourceParserRuleCall_0_0());
+ pushFollow(FOLLOW_2);
+ ruleDSL_Resource();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_SENSINACTAccess().getResourcesDSL_ResourceParserRuleCall_0_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_SENSINACT__ResourcesAssignment_0"
+
+
+ // $ANTLR start "rule__DSL_SENSINACT__CepAssignment_1"
+ // InternalSensinact.g:6588:1: rule__DSL_SENSINACT__CepAssignment_1 : ( ruleDSL_CEP_STATEMENT ) ;
+ public final void rule__DSL_SENSINACT__CepAssignment_1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:6592:1: ( ( ruleDSL_CEP_STATEMENT ) )
+ // InternalSensinact.g:6593:2: ( ruleDSL_CEP_STATEMENT )
+ {
+ // InternalSensinact.g:6593:2: ( ruleDSL_CEP_STATEMENT )
+ // InternalSensinact.g:6594:3: ruleDSL_CEP_STATEMENT
+ {
+ before(grammarAccess.getDSL_SENSINACTAccess().getCepDSL_CEP_STATEMENTParserRuleCall_1_0());
+ pushFollow(FOLLOW_2);
+ ruleDSL_CEP_STATEMENT();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_SENSINACTAccess().getCepDSL_CEP_STATEMENTParserRuleCall_1_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_SENSINACT__CepAssignment_1"
+
+
+ // $ANTLR start "rule__DSL_SENSINACT__OnAssignment_2"
+ // InternalSensinact.g:6603:1: rule__DSL_SENSINACT__OnAssignment_2 : ( ruleDSL_On ) ;
+ public final void rule__DSL_SENSINACT__OnAssignment_2() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:6607:1: ( ( ruleDSL_On ) )
+ // InternalSensinact.g:6608:2: ( ruleDSL_On )
+ {
+ // InternalSensinact.g:6608:2: ( ruleDSL_On )
+ // InternalSensinact.g:6609:3: ruleDSL_On
+ {
+ before(grammarAccess.getDSL_SENSINACTAccess().getOnDSL_OnParserRuleCall_2_0());
+ pushFollow(FOLLOW_2);
+ ruleDSL_On();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_SENSINACTAccess().getOnDSL_OnParserRuleCall_2_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_SENSINACT__OnAssignment_2"
+
+
+ // $ANTLR start "rule__DSL_SENSINACT__EcaAssignment_3"
+ // InternalSensinact.g:6618:1: rule__DSL_SENSINACT__EcaAssignment_3 : ( ruleDSL_ECA_STATEMENT ) ;
+ public final void rule__DSL_SENSINACT__EcaAssignment_3() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:6622:1: ( ( ruleDSL_ECA_STATEMENT ) )
+ // InternalSensinact.g:6623:2: ( ruleDSL_ECA_STATEMENT )
+ {
+ // InternalSensinact.g:6623:2: ( ruleDSL_ECA_STATEMENT )
+ // InternalSensinact.g:6624:3: ruleDSL_ECA_STATEMENT
+ {
+ before(grammarAccess.getDSL_SENSINACTAccess().getEcaDSL_ECA_STATEMENTParserRuleCall_3_0());
+ pushFollow(FOLLOW_2);
+ ruleDSL_ECA_STATEMENT();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_SENSINACTAccess().getEcaDSL_ECA_STATEMENTParserRuleCall_3_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_SENSINACT__EcaAssignment_3"
+
+
+ // $ANTLR start "rule__DSL_Resource__NameAssignment_1"
+ // InternalSensinact.g:6633:1: rule__DSL_Resource__NameAssignment_1 : ( RULE_ID ) ;
+ public final void rule__DSL_Resource__NameAssignment_1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:6637:1: ( ( RULE_ID ) )
+ // InternalSensinact.g:6638:2: ( RULE_ID )
+ {
+ // InternalSensinact.g:6638:2: ( RULE_ID )
+ // InternalSensinact.g:6639:3: RULE_ID
+ {
+ before(grammarAccess.getDSL_ResourceAccess().getNameIDTerminalRuleCall_1_0());
+ match(input,RULE_ID,FOLLOW_2);
+ after(grammarAccess.getDSL_ResourceAccess().getNameIDTerminalRuleCall_1_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Resource__NameAssignment_1"
+
+
+ // $ANTLR start "rule__DSL_Resource__GatewayIDAssignment_4"
+ // InternalSensinact.g:6648:1: rule__DSL_Resource__GatewayIDAssignment_4 : ( ruleEXTENDED_ID ) ;
+ public final void rule__DSL_Resource__GatewayIDAssignment_4() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:6652:1: ( ( ruleEXTENDED_ID ) )
+ // InternalSensinact.g:6653:2: ( ruleEXTENDED_ID )
+ {
+ // InternalSensinact.g:6653:2: ( ruleEXTENDED_ID )
+ // InternalSensinact.g:6654:3: ruleEXTENDED_ID
+ {
+ before(grammarAccess.getDSL_ResourceAccess().getGatewayIDEXTENDED_IDParserRuleCall_4_0());
+ pushFollow(FOLLOW_2);
+ ruleEXTENDED_ID();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_ResourceAccess().getGatewayIDEXTENDED_IDParserRuleCall_4_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Resource__GatewayIDAssignment_4"
+
+
+ // $ANTLR start "rule__DSL_Resource__DeviceIDAssignment_6"
+ // InternalSensinact.g:6663:1: rule__DSL_Resource__DeviceIDAssignment_6 : ( ruleEXTENDED_ID ) ;
+ public final void rule__DSL_Resource__DeviceIDAssignment_6() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:6667:1: ( ( ruleEXTENDED_ID ) )
+ // InternalSensinact.g:6668:2: ( ruleEXTENDED_ID )
+ {
+ // InternalSensinact.g:6668:2: ( ruleEXTENDED_ID )
+ // InternalSensinact.g:6669:3: ruleEXTENDED_ID
+ {
+ before(grammarAccess.getDSL_ResourceAccess().getDeviceIDEXTENDED_IDParserRuleCall_6_0());
+ pushFollow(FOLLOW_2);
+ ruleEXTENDED_ID();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_ResourceAccess().getDeviceIDEXTENDED_IDParserRuleCall_6_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Resource__DeviceIDAssignment_6"
+
+
+ // $ANTLR start "rule__DSL_Resource__ServiceIDAssignment_8"
+ // InternalSensinact.g:6678:1: rule__DSL_Resource__ServiceIDAssignment_8 : ( ruleEXTENDED_ID ) ;
+ public final void rule__DSL_Resource__ServiceIDAssignment_8() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:6682:1: ( ( ruleEXTENDED_ID ) )
+ // InternalSensinact.g:6683:2: ( ruleEXTENDED_ID )
+ {
+ // InternalSensinact.g:6683:2: ( ruleEXTENDED_ID )
+ // InternalSensinact.g:6684:3: ruleEXTENDED_ID
+ {
+ before(grammarAccess.getDSL_ResourceAccess().getServiceIDEXTENDED_IDParserRuleCall_8_0());
+ pushFollow(FOLLOW_2);
+ ruleEXTENDED_ID();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_ResourceAccess().getServiceIDEXTENDED_IDParserRuleCall_8_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Resource__ServiceIDAssignment_8"
+
+
+ // $ANTLR start "rule__DSL_Resource__ResourceIDAssignment_10"
+ // InternalSensinact.g:6693:1: rule__DSL_Resource__ResourceIDAssignment_10 : ( ruleEXTENDED_ID ) ;
+ public final void rule__DSL_Resource__ResourceIDAssignment_10() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:6697:1: ( ( ruleEXTENDED_ID ) )
+ // InternalSensinact.g:6698:2: ( ruleEXTENDED_ID )
+ {
+ // InternalSensinact.g:6698:2: ( ruleEXTENDED_ID )
+ // InternalSensinact.g:6699:3: ruleEXTENDED_ID
+ {
+ before(grammarAccess.getDSL_ResourceAccess().getResourceIDEXTENDED_IDParserRuleCall_10_0());
+ pushFollow(FOLLOW_2);
+ ruleEXTENDED_ID();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_ResourceAccess().getResourceIDEXTENDED_IDParserRuleCall_10_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Resource__ResourceIDAssignment_10"
+
+
+ // $ANTLR start "rule__DSL_On__TriggersAssignment_1"
+ // InternalSensinact.g:6708:1: rule__DSL_On__TriggersAssignment_1 : ( ruleDSL_REF_CONDITION ) ;
+ public final void rule__DSL_On__TriggersAssignment_1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:6712:1: ( ( ruleDSL_REF_CONDITION ) )
+ // InternalSensinact.g:6713:2: ( ruleDSL_REF_CONDITION )
+ {
+ // InternalSensinact.g:6713:2: ( ruleDSL_REF_CONDITION )
+ // InternalSensinact.g:6714:3: ruleDSL_REF_CONDITION
+ {
+ before(grammarAccess.getDSL_OnAccess().getTriggersDSL_REF_CONDITIONParserRuleCall_1_0());
+ pushFollow(FOLLOW_2);
+ ruleDSL_REF_CONDITION();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_OnAccess().getTriggersDSL_REF_CONDITIONParserRuleCall_1_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_On__TriggersAssignment_1"
+
+
+ // $ANTLR start "rule__DSL_On__TriggersAssignment_2_1"
+ // InternalSensinact.g:6723:1: rule__DSL_On__TriggersAssignment_2_1 : ( ruleDSL_REF_CONDITION ) ;
+ public final void rule__DSL_On__TriggersAssignment_2_1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:6727:1: ( ( ruleDSL_REF_CONDITION ) )
+ // InternalSensinact.g:6728:2: ( ruleDSL_REF_CONDITION )
+ {
+ // InternalSensinact.g:6728:2: ( ruleDSL_REF_CONDITION )
+ // InternalSensinact.g:6729:3: ruleDSL_REF_CONDITION
+ {
+ before(grammarAccess.getDSL_OnAccess().getTriggersDSL_REF_CONDITIONParserRuleCall_2_1_0());
+ pushFollow(FOLLOW_2);
+ ruleDSL_REF_CONDITION();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_OnAccess().getTriggersDSL_REF_CONDITIONParserRuleCall_2_1_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_On__TriggersAssignment_2_1"
+
+
+ // $ANTLR start "rule__DSL_ECA_STATEMENT__IfdoAssignment_0"
+ // InternalSensinact.g:6738:1: rule__DSL_ECA_STATEMENT__IfdoAssignment_0 : ( ruleDSL_IfDo ) ;
+ public final void rule__DSL_ECA_STATEMENT__IfdoAssignment_0() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:6742:1: ( ( ruleDSL_IfDo ) )
+ // InternalSensinact.g:6743:2: ( ruleDSL_IfDo )
+ {
+ // InternalSensinact.g:6743:2: ( ruleDSL_IfDo )
+ // InternalSensinact.g:6744:3: ruleDSL_IfDo
+ {
+ before(grammarAccess.getDSL_ECA_STATEMENTAccess().getIfdoDSL_IfDoParserRuleCall_0_0());
+ pushFollow(FOLLOW_2);
+ ruleDSL_IfDo();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_ECA_STATEMENTAccess().getIfdoDSL_IfDoParserRuleCall_0_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_ECA_STATEMENT__IfdoAssignment_0"
+
+
+ // $ANTLR start "rule__DSL_ECA_STATEMENT__ElseIfdoAssignment_1"
+ // InternalSensinact.g:6753:1: rule__DSL_ECA_STATEMENT__ElseIfdoAssignment_1 : ( ruleDSL_ElseIfDo ) ;
+ public final void rule__DSL_ECA_STATEMENT__ElseIfdoAssignment_1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:6757:1: ( ( ruleDSL_ElseIfDo ) )
+ // InternalSensinact.g:6758:2: ( ruleDSL_ElseIfDo )
+ {
+ // InternalSensinact.g:6758:2: ( ruleDSL_ElseIfDo )
+ // InternalSensinact.g:6759:3: ruleDSL_ElseIfDo
+ {
+ before(grammarAccess.getDSL_ECA_STATEMENTAccess().getElseIfdoDSL_ElseIfDoParserRuleCall_1_0());
+ pushFollow(FOLLOW_2);
+ ruleDSL_ElseIfDo();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_ECA_STATEMENTAccess().getElseIfdoDSL_ElseIfDoParserRuleCall_1_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_ECA_STATEMENT__ElseIfdoAssignment_1"
+
+
+ // $ANTLR start "rule__DSL_ECA_STATEMENT__ElsedoAssignment_2"
+ // InternalSensinact.g:6768:1: rule__DSL_ECA_STATEMENT__ElsedoAssignment_2 : ( ruleDSL_ElseDo ) ;
+ public final void rule__DSL_ECA_STATEMENT__ElsedoAssignment_2() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:6772:1: ( ( ruleDSL_ElseDo ) )
+ // InternalSensinact.g:6773:2: ( ruleDSL_ElseDo )
+ {
+ // InternalSensinact.g:6773:2: ( ruleDSL_ElseDo )
+ // InternalSensinact.g:6774:3: ruleDSL_ElseDo
+ {
+ before(grammarAccess.getDSL_ECA_STATEMENTAccess().getElsedoDSL_ElseDoParserRuleCall_2_0());
+ pushFollow(FOLLOW_2);
+ ruleDSL_ElseDo();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_ECA_STATEMENTAccess().getElsedoDSL_ElseDoParserRuleCall_2_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_ECA_STATEMENT__ElsedoAssignment_2"
+
+
+ // $ANTLR start "rule__DSL_IfDo__ConditionAssignment_1"
+ // InternalSensinact.g:6783:1: rule__DSL_IfDo__ConditionAssignment_1 : ( ruleDSL_Expression_Or ) ;
+ public final void rule__DSL_IfDo__ConditionAssignment_1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:6787:1: ( ( ruleDSL_Expression_Or ) )
+ // InternalSensinact.g:6788:2: ( ruleDSL_Expression_Or )
+ {
+ // InternalSensinact.g:6788:2: ( ruleDSL_Expression_Or )
+ // InternalSensinact.g:6789:3: ruleDSL_Expression_Or
+ {
+ before(grammarAccess.getDSL_IfDoAccess().getConditionDSL_Expression_OrParserRuleCall_1_0());
+ pushFollow(FOLLOW_2);
+ ruleDSL_Expression_Or();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_IfDoAccess().getConditionDSL_Expression_OrParserRuleCall_1_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_IfDo__ConditionAssignment_1"
+
+
+ // $ANTLR start "rule__DSL_IfDo__ActionsAssignment_3"
+ // InternalSensinact.g:6798:1: rule__DSL_IfDo__ActionsAssignment_3 : ( ruleDSL_ListActions ) ;
+ public final void rule__DSL_IfDo__ActionsAssignment_3() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:6802:1: ( ( ruleDSL_ListActions ) )
+ // InternalSensinact.g:6803:2: ( ruleDSL_ListActions )
+ {
+ // InternalSensinact.g:6803:2: ( ruleDSL_ListActions )
+ // InternalSensinact.g:6804:3: ruleDSL_ListActions
+ {
+ before(grammarAccess.getDSL_IfDoAccess().getActionsDSL_ListActionsParserRuleCall_3_0());
+ pushFollow(FOLLOW_2);
+ ruleDSL_ListActions();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_IfDoAccess().getActionsDSL_ListActionsParserRuleCall_3_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_IfDo__ActionsAssignment_3"
+
+
+ // $ANTLR start "rule__DSL_ElseIfDo__ConditionAssignment_1"
+ // InternalSensinact.g:6813:1: rule__DSL_ElseIfDo__ConditionAssignment_1 : ( ruleDSL_Expression_Or ) ;
+ public final void rule__DSL_ElseIfDo__ConditionAssignment_1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:6817:1: ( ( ruleDSL_Expression_Or ) )
+ // InternalSensinact.g:6818:2: ( ruleDSL_Expression_Or )
+ {
+ // InternalSensinact.g:6818:2: ( ruleDSL_Expression_Or )
+ // InternalSensinact.g:6819:3: ruleDSL_Expression_Or
+ {
+ before(grammarAccess.getDSL_ElseIfDoAccess().getConditionDSL_Expression_OrParserRuleCall_1_0());
+ pushFollow(FOLLOW_2);
+ ruleDSL_Expression_Or();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_ElseIfDoAccess().getConditionDSL_Expression_OrParserRuleCall_1_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_ElseIfDo__ConditionAssignment_1"
+
+
+ // $ANTLR start "rule__DSL_ElseIfDo__ActionsAssignment_3"
+ // InternalSensinact.g:6828:1: rule__DSL_ElseIfDo__ActionsAssignment_3 : ( ruleDSL_ListActions ) ;
+ public final void rule__DSL_ElseIfDo__ActionsAssignment_3() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:6832:1: ( ( ruleDSL_ListActions ) )
+ // InternalSensinact.g:6833:2: ( ruleDSL_ListActions )
+ {
+ // InternalSensinact.g:6833:2: ( ruleDSL_ListActions )
+ // InternalSensinact.g:6834:3: ruleDSL_ListActions
+ {
+ before(grammarAccess.getDSL_ElseIfDoAccess().getActionsDSL_ListActionsParserRuleCall_3_0());
+ pushFollow(FOLLOW_2);
+ ruleDSL_ListActions();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_ElseIfDoAccess().getActionsDSL_ListActionsParserRuleCall_3_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_ElseIfDo__ActionsAssignment_3"
+
+
+ // $ANTLR start "rule__DSL_ElseDo__ActionsAssignment_1"
+ // InternalSensinact.g:6843:1: rule__DSL_ElseDo__ActionsAssignment_1 : ( ruleDSL_ListActions ) ;
+ public final void rule__DSL_ElseDo__ActionsAssignment_1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:6847:1: ( ( ruleDSL_ListActions ) )
+ // InternalSensinact.g:6848:2: ( ruleDSL_ListActions )
+ {
+ // InternalSensinact.g:6848:2: ( ruleDSL_ListActions )
+ // InternalSensinact.g:6849:3: ruleDSL_ListActions
+ {
+ before(grammarAccess.getDSL_ElseDoAccess().getActionsDSL_ListActionsParserRuleCall_1_0());
+ pushFollow(FOLLOW_2);
+ ruleDSL_ListActions();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_ElseDoAccess().getActionsDSL_ListActionsParserRuleCall_1_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_ElseDo__ActionsAssignment_1"
+
+
+ // $ANTLR start "rule__DSL_REF_CONDITION__RefAssignment_0"
+ // InternalSensinact.g:6858:1: rule__DSL_REF_CONDITION__RefAssignment_0 : ( ( RULE_ID ) ) ;
+ public final void rule__DSL_REF_CONDITION__RefAssignment_0() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:6862:1: ( ( ( RULE_ID ) ) )
+ // InternalSensinact.g:6863:2: ( ( RULE_ID ) )
+ {
+ // InternalSensinact.g:6863:2: ( ( RULE_ID ) )
+ // InternalSensinact.g:6864:3: ( RULE_ID )
+ {
+ before(grammarAccess.getDSL_REF_CONDITIONAccess().getRefDSL_REFCrossReference_0_0());
+ // InternalSensinact.g:6865:3: ( RULE_ID )
+ // InternalSensinact.g:6866:4: RULE_ID
+ {
+ before(grammarAccess.getDSL_REF_CONDITIONAccess().getRefDSL_REFIDTerminalRuleCall_0_0_1());
+ match(input,RULE_ID,FOLLOW_2);
+ after(grammarAccess.getDSL_REF_CONDITIONAccess().getRefDSL_REFIDTerminalRuleCall_0_0_1());
+
+ }
+
+ after(grammarAccess.getDSL_REF_CONDITIONAccess().getRefDSL_REFCrossReference_0_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_REF_CONDITION__RefAssignment_0"
+
+
+ // $ANTLR start "rule__DSL_CEP_STATEMENT__NameAssignment_1"
+ // InternalSensinact.g:6877:1: rule__DSL_CEP_STATEMENT__NameAssignment_1 : ( RULE_ID ) ;
+ public final void rule__DSL_CEP_STATEMENT__NameAssignment_1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:6881:1: ( ( RULE_ID ) )
+ // InternalSensinact.g:6882:2: ( RULE_ID )
+ {
+ // InternalSensinact.g:6882:2: ( RULE_ID )
+ // InternalSensinact.g:6883:3: RULE_ID
+ {
+ before(grammarAccess.getDSL_CEP_STATEMENTAccess().getNameIDTerminalRuleCall_1_0());
+ match(input,RULE_ID,FOLLOW_2);
+ after(grammarAccess.getDSL_CEP_STATEMENTAccess().getNameIDTerminalRuleCall_1_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_STATEMENT__NameAssignment_1"
+
+
+ // $ANTLR start "rule__DSL_CEP_STATEMENT__OperationAssignment_3"
+ // InternalSensinact.g:6892:1: rule__DSL_CEP_STATEMENT__OperationAssignment_3 : ( ( rule__DSL_CEP_STATEMENT__OperationAlternatives_3_0 ) ) ;
+ public final void rule__DSL_CEP_STATEMENT__OperationAssignment_3() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:6896:1: ( ( ( rule__DSL_CEP_STATEMENT__OperationAlternatives_3_0 ) ) )
+ // InternalSensinact.g:6897:2: ( ( rule__DSL_CEP_STATEMENT__OperationAlternatives_3_0 ) )
+ {
+ // InternalSensinact.g:6897:2: ( ( rule__DSL_CEP_STATEMENT__OperationAlternatives_3_0 ) )
+ // InternalSensinact.g:6898:3: ( rule__DSL_CEP_STATEMENT__OperationAlternatives_3_0 )
+ {
+ before(grammarAccess.getDSL_CEP_STATEMENTAccess().getOperationAlternatives_3_0());
+ // InternalSensinact.g:6899:3: ( rule__DSL_CEP_STATEMENT__OperationAlternatives_3_0 )
+ // InternalSensinact.g:6899:4: rule__DSL_CEP_STATEMENT__OperationAlternatives_3_0
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_STATEMENT__OperationAlternatives_3_0();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_CEP_STATEMENTAccess().getOperationAlternatives_3_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_STATEMENT__OperationAssignment_3"
+
+
+ // $ANTLR start "rule__DSL_CEP_AFTER__Ref1Assignment_2"
+ // InternalSensinact.g:6907:1: rule__DSL_CEP_AFTER__Ref1Assignment_2 : ( ruleDSL_REF_CONDITION ) ;
+ public final void rule__DSL_CEP_AFTER__Ref1Assignment_2() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:6911:1: ( ( ruleDSL_REF_CONDITION ) )
+ // InternalSensinact.g:6912:2: ( ruleDSL_REF_CONDITION )
+ {
+ // InternalSensinact.g:6912:2: ( ruleDSL_REF_CONDITION )
+ // InternalSensinact.g:6913:3: ruleDSL_REF_CONDITION
+ {
+ before(grammarAccess.getDSL_CEP_AFTERAccess().getRef1DSL_REF_CONDITIONParserRuleCall_2_0());
+ pushFollow(FOLLOW_2);
+ ruleDSL_REF_CONDITION();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_CEP_AFTERAccess().getRef1DSL_REF_CONDITIONParserRuleCall_2_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_AFTER__Ref1Assignment_2"
+
+
+ // $ANTLR start "rule__DSL_CEP_AFTER__Ref2Assignment_4"
+ // InternalSensinact.g:6922:1: rule__DSL_CEP_AFTER__Ref2Assignment_4 : ( ruleDSL_REF_CONDITION ) ;
+ public final void rule__DSL_CEP_AFTER__Ref2Assignment_4() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:6926:1: ( ( ruleDSL_REF_CONDITION ) )
+ // InternalSensinact.g:6927:2: ( ruleDSL_REF_CONDITION )
+ {
+ // InternalSensinact.g:6927:2: ( ruleDSL_REF_CONDITION )
+ // InternalSensinact.g:6928:3: ruleDSL_REF_CONDITION
+ {
+ before(grammarAccess.getDSL_CEP_AFTERAccess().getRef2DSL_REF_CONDITIONParserRuleCall_4_0());
+ pushFollow(FOLLOW_2);
+ ruleDSL_REF_CONDITION();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_CEP_AFTERAccess().getRef2DSL_REF_CONDITIONParserRuleCall_4_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_AFTER__Ref2Assignment_4"
+
+
+ // $ANTLR start "rule__DSL_CEP_AFTER__StartAssignment_6_0"
+ // InternalSensinact.g:6937:1: rule__DSL_CEP_AFTER__StartAssignment_6_0 : ( ruleDSL_CEP_DURATION ) ;
+ public final void rule__DSL_CEP_AFTER__StartAssignment_6_0() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:6941:1: ( ( ruleDSL_CEP_DURATION ) )
+ // InternalSensinact.g:6942:2: ( ruleDSL_CEP_DURATION )
+ {
+ // InternalSensinact.g:6942:2: ( ruleDSL_CEP_DURATION )
+ // InternalSensinact.g:6943:3: ruleDSL_CEP_DURATION
+ {
+ before(grammarAccess.getDSL_CEP_AFTERAccess().getStartDSL_CEP_DURATIONParserRuleCall_6_0_0());
+ pushFollow(FOLLOW_2);
+ ruleDSL_CEP_DURATION();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_CEP_AFTERAccess().getStartDSL_CEP_DURATIONParserRuleCall_6_0_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_AFTER__StartAssignment_6_0"
+
+
+ // $ANTLR start "rule__DSL_CEP_AFTER__EndAssignment_7"
+ // InternalSensinact.g:6952:1: rule__DSL_CEP_AFTER__EndAssignment_7 : ( ruleDSL_CEP_DURATION ) ;
+ public final void rule__DSL_CEP_AFTER__EndAssignment_7() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:6956:1: ( ( ruleDSL_CEP_DURATION ) )
+ // InternalSensinact.g:6957:2: ( ruleDSL_CEP_DURATION )
+ {
+ // InternalSensinact.g:6957:2: ( ruleDSL_CEP_DURATION )
+ // InternalSensinact.g:6958:3: ruleDSL_CEP_DURATION
+ {
+ before(grammarAccess.getDSL_CEP_AFTERAccess().getEndDSL_CEP_DURATIONParserRuleCall_7_0());
+ pushFollow(FOLLOW_2);
+ ruleDSL_CEP_DURATION();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_CEP_AFTERAccess().getEndDSL_CEP_DURATIONParserRuleCall_7_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_AFTER__EndAssignment_7"
+
+
+ // $ANTLR start "rule__DSL_CEP_BEFORE__Ref1Assignment_2"
+ // InternalSensinact.g:6967:1: rule__DSL_CEP_BEFORE__Ref1Assignment_2 : ( ruleDSL_REF_CONDITION ) ;
+ public final void rule__DSL_CEP_BEFORE__Ref1Assignment_2() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:6971:1: ( ( ruleDSL_REF_CONDITION ) )
+ // InternalSensinact.g:6972:2: ( ruleDSL_REF_CONDITION )
+ {
+ // InternalSensinact.g:6972:2: ( ruleDSL_REF_CONDITION )
+ // InternalSensinact.g:6973:3: ruleDSL_REF_CONDITION
+ {
+ before(grammarAccess.getDSL_CEP_BEFOREAccess().getRef1DSL_REF_CONDITIONParserRuleCall_2_0());
+ pushFollow(FOLLOW_2);
+ ruleDSL_REF_CONDITION();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_CEP_BEFOREAccess().getRef1DSL_REF_CONDITIONParserRuleCall_2_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_BEFORE__Ref1Assignment_2"
+
+
+ // $ANTLR start "rule__DSL_CEP_BEFORE__Ref2Assignment_4"
+ // InternalSensinact.g:6982:1: rule__DSL_CEP_BEFORE__Ref2Assignment_4 : ( ruleDSL_REF_CONDITION ) ;
+ public final void rule__DSL_CEP_BEFORE__Ref2Assignment_4() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:6986:1: ( ( ruleDSL_REF_CONDITION ) )
+ // InternalSensinact.g:6987:2: ( ruleDSL_REF_CONDITION )
+ {
+ // InternalSensinact.g:6987:2: ( ruleDSL_REF_CONDITION )
+ // InternalSensinact.g:6988:3: ruleDSL_REF_CONDITION
+ {
+ before(grammarAccess.getDSL_CEP_BEFOREAccess().getRef2DSL_REF_CONDITIONParserRuleCall_4_0());
+ pushFollow(FOLLOW_2);
+ ruleDSL_REF_CONDITION();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_CEP_BEFOREAccess().getRef2DSL_REF_CONDITIONParserRuleCall_4_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_BEFORE__Ref2Assignment_4"
+
+
+ // $ANTLR start "rule__DSL_CEP_BEFORE__StartAssignment_6_0"
+ // InternalSensinact.g:6997:1: rule__DSL_CEP_BEFORE__StartAssignment_6_0 : ( ruleDSL_CEP_DURATION ) ;
+ public final void rule__DSL_CEP_BEFORE__StartAssignment_6_0() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:7001:1: ( ( ruleDSL_CEP_DURATION ) )
+ // InternalSensinact.g:7002:2: ( ruleDSL_CEP_DURATION )
+ {
+ // InternalSensinact.g:7002:2: ( ruleDSL_CEP_DURATION )
+ // InternalSensinact.g:7003:3: ruleDSL_CEP_DURATION
+ {
+ before(grammarAccess.getDSL_CEP_BEFOREAccess().getStartDSL_CEP_DURATIONParserRuleCall_6_0_0());
+ pushFollow(FOLLOW_2);
+ ruleDSL_CEP_DURATION();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_CEP_BEFOREAccess().getStartDSL_CEP_DURATIONParserRuleCall_6_0_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_BEFORE__StartAssignment_6_0"
+
+
+ // $ANTLR start "rule__DSL_CEP_BEFORE__EndAssignment_7"
+ // InternalSensinact.g:7012:1: rule__DSL_CEP_BEFORE__EndAssignment_7 : ( ruleDSL_CEP_DURATION ) ;
+ public final void rule__DSL_CEP_BEFORE__EndAssignment_7() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:7016:1: ( ( ruleDSL_CEP_DURATION ) )
+ // InternalSensinact.g:7017:2: ( ruleDSL_CEP_DURATION )
+ {
+ // InternalSensinact.g:7017:2: ( ruleDSL_CEP_DURATION )
+ // InternalSensinact.g:7018:3: ruleDSL_CEP_DURATION
+ {
+ before(grammarAccess.getDSL_CEP_BEFOREAccess().getEndDSL_CEP_DURATIONParserRuleCall_7_0());
+ pushFollow(FOLLOW_2);
+ ruleDSL_CEP_DURATION();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_CEP_BEFOREAccess().getEndDSL_CEP_DURATIONParserRuleCall_7_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_BEFORE__EndAssignment_7"
+
+
+ // $ANTLR start "rule__DSL_CEP_COINCIDE__Ref1Assignment_2"
+ // InternalSensinact.g:7027:1: rule__DSL_CEP_COINCIDE__Ref1Assignment_2 : ( ruleDSL_REF_CONDITION ) ;
+ public final void rule__DSL_CEP_COINCIDE__Ref1Assignment_2() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:7031:1: ( ( ruleDSL_REF_CONDITION ) )
+ // InternalSensinact.g:7032:2: ( ruleDSL_REF_CONDITION )
+ {
+ // InternalSensinact.g:7032:2: ( ruleDSL_REF_CONDITION )
+ // InternalSensinact.g:7033:3: ruleDSL_REF_CONDITION
+ {
+ before(grammarAccess.getDSL_CEP_COINCIDEAccess().getRef1DSL_REF_CONDITIONParserRuleCall_2_0());
+ pushFollow(FOLLOW_2);
+ ruleDSL_REF_CONDITION();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_CEP_COINCIDEAccess().getRef1DSL_REF_CONDITIONParserRuleCall_2_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_COINCIDE__Ref1Assignment_2"
+
+
+ // $ANTLR start "rule__DSL_CEP_COINCIDE__Ref2Assignment_4"
+ // InternalSensinact.g:7042:1: rule__DSL_CEP_COINCIDE__Ref2Assignment_4 : ( ruleDSL_REF_CONDITION ) ;
+ public final void rule__DSL_CEP_COINCIDE__Ref2Assignment_4() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:7046:1: ( ( ruleDSL_REF_CONDITION ) )
+ // InternalSensinact.g:7047:2: ( ruleDSL_REF_CONDITION )
+ {
+ // InternalSensinact.g:7047:2: ( ruleDSL_REF_CONDITION )
+ // InternalSensinact.g:7048:3: ruleDSL_REF_CONDITION
+ {
+ before(grammarAccess.getDSL_CEP_COINCIDEAccess().getRef2DSL_REF_CONDITIONParserRuleCall_4_0());
+ pushFollow(FOLLOW_2);
+ ruleDSL_REF_CONDITION();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_CEP_COINCIDEAccess().getRef2DSL_REF_CONDITIONParserRuleCall_4_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_COINCIDE__Ref2Assignment_4"
+
+
+ // $ANTLR start "rule__DSL_CEP_COINCIDE__WindowAssignment_6"
+ // InternalSensinact.g:7057:1: rule__DSL_CEP_COINCIDE__WindowAssignment_6 : ( ruleDSL_CEP_DURATION ) ;
+ public final void rule__DSL_CEP_COINCIDE__WindowAssignment_6() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:7061:1: ( ( ruleDSL_CEP_DURATION ) )
+ // InternalSensinact.g:7062:2: ( ruleDSL_CEP_DURATION )
+ {
+ // InternalSensinact.g:7062:2: ( ruleDSL_CEP_DURATION )
+ // InternalSensinact.g:7063:3: ruleDSL_CEP_DURATION
+ {
+ before(grammarAccess.getDSL_CEP_COINCIDEAccess().getWindowDSL_CEP_DURATIONParserRuleCall_6_0());
+ pushFollow(FOLLOW_2);
+ ruleDSL_CEP_DURATION();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_CEP_COINCIDEAccess().getWindowDSL_CEP_DURATIONParserRuleCall_6_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_COINCIDE__WindowAssignment_6"
+
+
+ // $ANTLR start "rule__DSL_CEP_MIN__RefAssignment_2"
+ // InternalSensinact.g:7072:1: rule__DSL_CEP_MIN__RefAssignment_2 : ( ruleDSL_REF_CONDITION ) ;
+ public final void rule__DSL_CEP_MIN__RefAssignment_2() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:7076:1: ( ( ruleDSL_REF_CONDITION ) )
+ // InternalSensinact.g:7077:2: ( ruleDSL_REF_CONDITION )
+ {
+ // InternalSensinact.g:7077:2: ( ruleDSL_REF_CONDITION )
+ // InternalSensinact.g:7078:3: ruleDSL_REF_CONDITION
+ {
+ before(grammarAccess.getDSL_CEP_MINAccess().getRefDSL_REF_CONDITIONParserRuleCall_2_0());
+ pushFollow(FOLLOW_2);
+ ruleDSL_REF_CONDITION();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_CEP_MINAccess().getRefDSL_REF_CONDITIONParserRuleCall_2_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_MIN__RefAssignment_2"
+
+
+ // $ANTLR start "rule__DSL_CEP_MIN__WindowAssignment_4"
+ // InternalSensinact.g:7087:1: rule__DSL_CEP_MIN__WindowAssignment_4 : ( ruleDSL_CEP_DURATION ) ;
+ public final void rule__DSL_CEP_MIN__WindowAssignment_4() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:7091:1: ( ( ruleDSL_CEP_DURATION ) )
+ // InternalSensinact.g:7092:2: ( ruleDSL_CEP_DURATION )
+ {
+ // InternalSensinact.g:7092:2: ( ruleDSL_CEP_DURATION )
+ // InternalSensinact.g:7093:3: ruleDSL_CEP_DURATION
+ {
+ before(grammarAccess.getDSL_CEP_MINAccess().getWindowDSL_CEP_DURATIONParserRuleCall_4_0());
+ pushFollow(FOLLOW_2);
+ ruleDSL_CEP_DURATION();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_CEP_MINAccess().getWindowDSL_CEP_DURATIONParserRuleCall_4_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_MIN__WindowAssignment_4"
+
+
+ // $ANTLR start "rule__DSL_CEP_MAX__RefAssignment_2"
+ // InternalSensinact.g:7102:1: rule__DSL_CEP_MAX__RefAssignment_2 : ( ruleDSL_REF_CONDITION ) ;
+ public final void rule__DSL_CEP_MAX__RefAssignment_2() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:7106:1: ( ( ruleDSL_REF_CONDITION ) )
+ // InternalSensinact.g:7107:2: ( ruleDSL_REF_CONDITION )
+ {
+ // InternalSensinact.g:7107:2: ( ruleDSL_REF_CONDITION )
+ // InternalSensinact.g:7108:3: ruleDSL_REF_CONDITION
+ {
+ before(grammarAccess.getDSL_CEP_MAXAccess().getRefDSL_REF_CONDITIONParserRuleCall_2_0());
+ pushFollow(FOLLOW_2);
+ ruleDSL_REF_CONDITION();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_CEP_MAXAccess().getRefDSL_REF_CONDITIONParserRuleCall_2_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_MAX__RefAssignment_2"
+
+
+ // $ANTLR start "rule__DSL_CEP_MAX__WindowAssignment_4"
+ // InternalSensinact.g:7117:1: rule__DSL_CEP_MAX__WindowAssignment_4 : ( ruleDSL_CEP_DURATION ) ;
+ public final void rule__DSL_CEP_MAX__WindowAssignment_4() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:7121:1: ( ( ruleDSL_CEP_DURATION ) )
+ // InternalSensinact.g:7122:2: ( ruleDSL_CEP_DURATION )
+ {
+ // InternalSensinact.g:7122:2: ( ruleDSL_CEP_DURATION )
+ // InternalSensinact.g:7123:3: ruleDSL_CEP_DURATION
+ {
+ before(grammarAccess.getDSL_CEP_MAXAccess().getWindowDSL_CEP_DURATIONParserRuleCall_4_0());
+ pushFollow(FOLLOW_2);
+ ruleDSL_CEP_DURATION();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_CEP_MAXAccess().getWindowDSL_CEP_DURATIONParserRuleCall_4_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_MAX__WindowAssignment_4"
+
+
+ // $ANTLR start "rule__DSL_CEP_AVG__RefAssignment_2"
+ // InternalSensinact.g:7132:1: rule__DSL_CEP_AVG__RefAssignment_2 : ( ruleDSL_REF_CONDITION ) ;
+ public final void rule__DSL_CEP_AVG__RefAssignment_2() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:7136:1: ( ( ruleDSL_REF_CONDITION ) )
+ // InternalSensinact.g:7137:2: ( ruleDSL_REF_CONDITION )
+ {
+ // InternalSensinact.g:7137:2: ( ruleDSL_REF_CONDITION )
+ // InternalSensinact.g:7138:3: ruleDSL_REF_CONDITION
+ {
+ before(grammarAccess.getDSL_CEP_AVGAccess().getRefDSL_REF_CONDITIONParserRuleCall_2_0());
+ pushFollow(FOLLOW_2);
+ ruleDSL_REF_CONDITION();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_CEP_AVGAccess().getRefDSL_REF_CONDITIONParserRuleCall_2_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_AVG__RefAssignment_2"
+
+
+ // $ANTLR start "rule__DSL_CEP_AVG__WindowAssignment_4"
+ // InternalSensinact.g:7147:1: rule__DSL_CEP_AVG__WindowAssignment_4 : ( ruleDSL_CEP_DURATION ) ;
+ public final void rule__DSL_CEP_AVG__WindowAssignment_4() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:7151:1: ( ( ruleDSL_CEP_DURATION ) )
+ // InternalSensinact.g:7152:2: ( ruleDSL_CEP_DURATION )
+ {
+ // InternalSensinact.g:7152:2: ( ruleDSL_CEP_DURATION )
+ // InternalSensinact.g:7153:3: ruleDSL_CEP_DURATION
+ {
+ before(grammarAccess.getDSL_CEP_AVGAccess().getWindowDSL_CEP_DURATIONParserRuleCall_4_0());
+ pushFollow(FOLLOW_2);
+ ruleDSL_CEP_DURATION();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_CEP_AVGAccess().getWindowDSL_CEP_DURATIONParserRuleCall_4_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_AVG__WindowAssignment_4"
+
+
+ // $ANTLR start "rule__DSL_CEP_SUM__RefAssignment_2"
+ // InternalSensinact.g:7162:1: rule__DSL_CEP_SUM__RefAssignment_2 : ( ruleDSL_REF_CONDITION ) ;
+ public final void rule__DSL_CEP_SUM__RefAssignment_2() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:7166:1: ( ( ruleDSL_REF_CONDITION ) )
+ // InternalSensinact.g:7167:2: ( ruleDSL_REF_CONDITION )
+ {
+ // InternalSensinact.g:7167:2: ( ruleDSL_REF_CONDITION )
+ // InternalSensinact.g:7168:3: ruleDSL_REF_CONDITION
+ {
+ before(grammarAccess.getDSL_CEP_SUMAccess().getRefDSL_REF_CONDITIONParserRuleCall_2_0());
+ pushFollow(FOLLOW_2);
+ ruleDSL_REF_CONDITION();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_CEP_SUMAccess().getRefDSL_REF_CONDITIONParserRuleCall_2_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_SUM__RefAssignment_2"
+
+
+ // $ANTLR start "rule__DSL_CEP_SUM__WindowAssignment_4"
+ // InternalSensinact.g:7177:1: rule__DSL_CEP_SUM__WindowAssignment_4 : ( ruleDSL_CEP_DURATION ) ;
+ public final void rule__DSL_CEP_SUM__WindowAssignment_4() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:7181:1: ( ( ruleDSL_CEP_DURATION ) )
+ // InternalSensinact.g:7182:2: ( ruleDSL_CEP_DURATION )
+ {
+ // InternalSensinact.g:7182:2: ( ruleDSL_CEP_DURATION )
+ // InternalSensinact.g:7183:3: ruleDSL_CEP_DURATION
+ {
+ before(grammarAccess.getDSL_CEP_SUMAccess().getWindowDSL_CEP_DURATIONParserRuleCall_4_0());
+ pushFollow(FOLLOW_2);
+ ruleDSL_CEP_DURATION();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_CEP_SUMAccess().getWindowDSL_CEP_DURATIONParserRuleCall_4_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_SUM__WindowAssignment_4"
+
+
+ // $ANTLR start "rule__DSL_CEP_COUNT__RefAssignment_2"
+ // InternalSensinact.g:7192:1: rule__DSL_CEP_COUNT__RefAssignment_2 : ( ruleDSL_REF_CONDITION ) ;
+ public final void rule__DSL_CEP_COUNT__RefAssignment_2() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:7196:1: ( ( ruleDSL_REF_CONDITION ) )
+ // InternalSensinact.g:7197:2: ( ruleDSL_REF_CONDITION )
+ {
+ // InternalSensinact.g:7197:2: ( ruleDSL_REF_CONDITION )
+ // InternalSensinact.g:7198:3: ruleDSL_REF_CONDITION
+ {
+ before(grammarAccess.getDSL_CEP_COUNTAccess().getRefDSL_REF_CONDITIONParserRuleCall_2_0());
+ pushFollow(FOLLOW_2);
+ ruleDSL_REF_CONDITION();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_CEP_COUNTAccess().getRefDSL_REF_CONDITIONParserRuleCall_2_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_COUNT__RefAssignment_2"
+
+
+ // $ANTLR start "rule__DSL_CEP_COUNT__WindowAssignment_4"
+ // InternalSensinact.g:7207:1: rule__DSL_CEP_COUNT__WindowAssignment_4 : ( ruleDSL_CEP_DURATION ) ;
+ public final void rule__DSL_CEP_COUNT__WindowAssignment_4() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:7211:1: ( ( ruleDSL_CEP_DURATION ) )
+ // InternalSensinact.g:7212:2: ( ruleDSL_CEP_DURATION )
+ {
+ // InternalSensinact.g:7212:2: ( ruleDSL_CEP_DURATION )
+ // InternalSensinact.g:7213:3: ruleDSL_CEP_DURATION
+ {
+ before(grammarAccess.getDSL_CEP_COUNTAccess().getWindowDSL_CEP_DURATIONParserRuleCall_4_0());
+ pushFollow(FOLLOW_2);
+ ruleDSL_CEP_DURATION();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_CEP_COUNTAccess().getWindowDSL_CEP_DURATIONParserRuleCall_4_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_COUNT__WindowAssignment_4"
+
+
+ // $ANTLR start "rule__DSL_CEP_DURATION__UnitsAssignment"
+ // InternalSensinact.g:7222:1: rule__DSL_CEP_DURATION__UnitsAssignment : ( ( rule__DSL_CEP_DURATION__UnitsAlternatives_0 ) ) ;
+ public final void rule__DSL_CEP_DURATION__UnitsAssignment() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:7226:1: ( ( ( rule__DSL_CEP_DURATION__UnitsAlternatives_0 ) ) )
+ // InternalSensinact.g:7227:2: ( ( rule__DSL_CEP_DURATION__UnitsAlternatives_0 ) )
+ {
+ // InternalSensinact.g:7227:2: ( ( rule__DSL_CEP_DURATION__UnitsAlternatives_0 ) )
+ // InternalSensinact.g:7228:3: ( rule__DSL_CEP_DURATION__UnitsAlternatives_0 )
+ {
+ before(grammarAccess.getDSL_CEP_DURATIONAccess().getUnitsAlternatives_0());
+ // InternalSensinact.g:7229:3: ( rule__DSL_CEP_DURATION__UnitsAlternatives_0 )
+ // InternalSensinact.g:7229:4: rule__DSL_CEP_DURATION__UnitsAlternatives_0
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_CEP_DURATION__UnitsAlternatives_0();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_CEP_DURATIONAccess().getUnitsAlternatives_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_DURATION__UnitsAssignment"
+
+
+ // $ANTLR start "rule__DSL_CEP_DURATION_MIN__MinAssignment_0"
+ // InternalSensinact.g:7237:1: rule__DSL_CEP_DURATION_MIN__MinAssignment_0 : ( ruleNUMBER ) ;
+ public final void rule__DSL_CEP_DURATION_MIN__MinAssignment_0() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:7241:1: ( ( ruleNUMBER ) )
+ // InternalSensinact.g:7242:2: ( ruleNUMBER )
+ {
+ // InternalSensinact.g:7242:2: ( ruleNUMBER )
+ // InternalSensinact.g:7243:3: ruleNUMBER
+ {
+ before(grammarAccess.getDSL_CEP_DURATION_MINAccess().getMinNUMBERParserRuleCall_0_0());
+ pushFollow(FOLLOW_2);
+ ruleNUMBER();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_CEP_DURATION_MINAccess().getMinNUMBERParserRuleCall_0_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_DURATION_MIN__MinAssignment_0"
+
+
+ // $ANTLR start "rule__DSL_CEP_DURATION_SEC__SecAssignment_0"
+ // InternalSensinact.g:7252:1: rule__DSL_CEP_DURATION_SEC__SecAssignment_0 : ( ruleNUMBER ) ;
+ public final void rule__DSL_CEP_DURATION_SEC__SecAssignment_0() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:7256:1: ( ( ruleNUMBER ) )
+ // InternalSensinact.g:7257:2: ( ruleNUMBER )
+ {
+ // InternalSensinact.g:7257:2: ( ruleNUMBER )
+ // InternalSensinact.g:7258:3: ruleNUMBER
+ {
+ before(grammarAccess.getDSL_CEP_DURATION_SECAccess().getSecNUMBERParserRuleCall_0_0());
+ pushFollow(FOLLOW_2);
+ ruleNUMBER();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_CEP_DURATION_SECAccess().getSecNUMBERParserRuleCall_0_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_CEP_DURATION_SEC__SecAssignment_0"
+
+
+ // $ANTLR start "rule__DSL_ListActions__ActionListAssignment_0"
+ // InternalSensinact.g:7267:1: rule__DSL_ListActions__ActionListAssignment_0 : ( ruleDSL_ResourceAction ) ;
+ public final void rule__DSL_ListActions__ActionListAssignment_0() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:7271:1: ( ( ruleDSL_ResourceAction ) )
+ // InternalSensinact.g:7272:2: ( ruleDSL_ResourceAction )
+ {
+ // InternalSensinact.g:7272:2: ( ruleDSL_ResourceAction )
+ // InternalSensinact.g:7273:3: ruleDSL_ResourceAction
+ {
+ before(grammarAccess.getDSL_ListActionsAccess().getActionListDSL_ResourceActionParserRuleCall_0_0());
+ pushFollow(FOLLOW_2);
+ ruleDSL_ResourceAction();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_ListActionsAccess().getActionListDSL_ResourceActionParserRuleCall_0_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_ListActions__ActionListAssignment_0"
+
+
+ // $ANTLR start "rule__DSL_ListActions__ActionListAssignment_1_1"
+ // InternalSensinact.g:7282:1: rule__DSL_ListActions__ActionListAssignment_1_1 : ( ruleDSL_ResourceAction ) ;
+ public final void rule__DSL_ListActions__ActionListAssignment_1_1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:7286:1: ( ( ruleDSL_ResourceAction ) )
+ // InternalSensinact.g:7287:2: ( ruleDSL_ResourceAction )
+ {
+ // InternalSensinact.g:7287:2: ( ruleDSL_ResourceAction )
+ // InternalSensinact.g:7288:3: ruleDSL_ResourceAction
+ {
+ before(grammarAccess.getDSL_ListActionsAccess().getActionListDSL_ResourceActionParserRuleCall_1_1_0());
+ pushFollow(FOLLOW_2);
+ ruleDSL_ResourceAction();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_ListActionsAccess().getActionListDSL_ResourceActionParserRuleCall_1_1_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_ListActions__ActionListAssignment_1_1"
+
+
+ // $ANTLR start "rule__DSL_ResourceAction__VariableAssignment_0_0"
+ // InternalSensinact.g:7297:1: rule__DSL_ResourceAction__VariableAssignment_0_0 : ( RULE_ID ) ;
+ public final void rule__DSL_ResourceAction__VariableAssignment_0_0() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:7301:1: ( ( RULE_ID ) )
+ // InternalSensinact.g:7302:2: ( RULE_ID )
+ {
+ // InternalSensinact.g:7302:2: ( RULE_ID )
+ // InternalSensinact.g:7303:3: RULE_ID
+ {
+ before(grammarAccess.getDSL_ResourceActionAccess().getVariableIDTerminalRuleCall_0_0_0());
+ match(input,RULE_ID,FOLLOW_2);
+ after(grammarAccess.getDSL_ResourceActionAccess().getVariableIDTerminalRuleCall_0_0_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_ResourceAction__VariableAssignment_0_0"
+
+
+ // $ANTLR start "rule__DSL_ResourceAction__RefAssignment_1"
+ // InternalSensinact.g:7312:1: rule__DSL_ResourceAction__RefAssignment_1 : ( ( RULE_ID ) ) ;
+ public final void rule__DSL_ResourceAction__RefAssignment_1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:7316:1: ( ( ( RULE_ID ) ) )
+ // InternalSensinact.g:7317:2: ( ( RULE_ID ) )
+ {
+ // InternalSensinact.g:7317:2: ( ( RULE_ID ) )
+ // InternalSensinact.g:7318:3: ( RULE_ID )
+ {
+ before(grammarAccess.getDSL_ResourceActionAccess().getRefDSL_REFCrossReference_1_0());
+ // InternalSensinact.g:7319:3: ( RULE_ID )
+ // InternalSensinact.g:7320:4: RULE_ID
+ {
+ before(grammarAccess.getDSL_ResourceActionAccess().getRefDSL_REFIDTerminalRuleCall_1_0_1());
+ match(input,RULE_ID,FOLLOW_2);
+ after(grammarAccess.getDSL_ResourceActionAccess().getRefDSL_REFIDTerminalRuleCall_1_0_1());
+
+ }
+
+ after(grammarAccess.getDSL_ResourceActionAccess().getRefDSL_REFCrossReference_1_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_ResourceAction__RefAssignment_1"
+
+
+ // $ANTLR start "rule__DSL_ResourceAction__ActiontypeAssignment_3"
+ // InternalSensinact.g:7331:1: rule__DSL_ResourceAction__ActiontypeAssignment_3 : ( ( rule__DSL_ResourceAction__ActiontypeAlternatives_3_0 ) ) ;
+ public final void rule__DSL_ResourceAction__ActiontypeAssignment_3() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:7335:1: ( ( ( rule__DSL_ResourceAction__ActiontypeAlternatives_3_0 ) ) )
+ // InternalSensinact.g:7336:2: ( ( rule__DSL_ResourceAction__ActiontypeAlternatives_3_0 ) )
+ {
+ // InternalSensinact.g:7336:2: ( ( rule__DSL_ResourceAction__ActiontypeAlternatives_3_0 ) )
+ // InternalSensinact.g:7337:3: ( rule__DSL_ResourceAction__ActiontypeAlternatives_3_0 )
+ {
+ before(grammarAccess.getDSL_ResourceActionAccess().getActiontypeAlternatives_3_0());
+ // InternalSensinact.g:7338:3: ( rule__DSL_ResourceAction__ActiontypeAlternatives_3_0 )
+ // InternalSensinact.g:7338:4: rule__DSL_ResourceAction__ActiontypeAlternatives_3_0
+ {
+ pushFollow(FOLLOW_2);
+ rule__DSL_ResourceAction__ActiontypeAlternatives_3_0();
+
+ state._fsp--;
+
+
+ }
+
+ after(grammarAccess.getDSL_ResourceActionAccess().getActiontypeAlternatives_3_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_ResourceAction__ActiontypeAssignment_3"
+
+
+ // $ANTLR start "rule__DSL_ResourceAction__ListParamAssignment_5"
+ // InternalSensinact.g:7346:1: rule__DSL_ResourceAction__ListParamAssignment_5 : ( ruleDSL_ListParam ) ;
+ public final void rule__DSL_ResourceAction__ListParamAssignment_5() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:7350:1: ( ( ruleDSL_ListParam ) )
+ // InternalSensinact.g:7351:2: ( ruleDSL_ListParam )
+ {
+ // InternalSensinact.g:7351:2: ( ruleDSL_ListParam )
+ // InternalSensinact.g:7352:3: ruleDSL_ListParam
+ {
+ before(grammarAccess.getDSL_ResourceActionAccess().getListParamDSL_ListParamParserRuleCall_5_0());
+ pushFollow(FOLLOW_2);
+ ruleDSL_ListParam();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_ResourceActionAccess().getListParamDSL_ListParamParserRuleCall_5_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_ResourceAction__ListParamAssignment_5"
+
+
+ // $ANTLR start "rule__DSL_ListParam__ParamAssignment_0"
+ // InternalSensinact.g:7361:1: rule__DSL_ListParam__ParamAssignment_0 : ( ruleDSL_Expression_Or ) ;
+ public final void rule__DSL_ListParam__ParamAssignment_0() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:7365:1: ( ( ruleDSL_Expression_Or ) )
+ // InternalSensinact.g:7366:2: ( ruleDSL_Expression_Or )
+ {
+ // InternalSensinact.g:7366:2: ( ruleDSL_Expression_Or )
+ // InternalSensinact.g:7367:3: ruleDSL_Expression_Or
+ {
+ before(grammarAccess.getDSL_ListParamAccess().getParamDSL_Expression_OrParserRuleCall_0_0());
+ pushFollow(FOLLOW_2);
+ ruleDSL_Expression_Or();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_ListParamAccess().getParamDSL_Expression_OrParserRuleCall_0_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_ListParam__ParamAssignment_0"
+
+
+ // $ANTLR start "rule__DSL_ListParam__ParamAssignment_1_1"
+ // InternalSensinact.g:7376:1: rule__DSL_ListParam__ParamAssignment_1_1 : ( ruleDSL_Expression_Or ) ;
+ public final void rule__DSL_ListParam__ParamAssignment_1_1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:7380:1: ( ( ruleDSL_Expression_Or ) )
+ // InternalSensinact.g:7381:2: ( ruleDSL_Expression_Or )
+ {
+ // InternalSensinact.g:7381:2: ( ruleDSL_Expression_Or )
+ // InternalSensinact.g:7382:3: ruleDSL_Expression_Or
+ {
+ before(grammarAccess.getDSL_ListParamAccess().getParamDSL_Expression_OrParserRuleCall_1_1_0());
+ pushFollow(FOLLOW_2);
+ ruleDSL_Expression_Or();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_ListParamAccess().getParamDSL_Expression_OrParserRuleCall_1_1_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_ListParam__ParamAssignment_1_1"
+
+
+ // $ANTLR start "rule__DSL_Expression_Or__RightAssignment_1_2"
+ // InternalSensinact.g:7391:1: rule__DSL_Expression_Or__RightAssignment_1_2 : ( ruleDSL_Expression_And ) ;
+ public final void rule__DSL_Expression_Or__RightAssignment_1_2() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:7395:1: ( ( ruleDSL_Expression_And ) )
+ // InternalSensinact.g:7396:2: ( ruleDSL_Expression_And )
+ {
+ // InternalSensinact.g:7396:2: ( ruleDSL_Expression_And )
+ // InternalSensinact.g:7397:3: ruleDSL_Expression_And
+ {
+ before(grammarAccess.getDSL_Expression_OrAccess().getRightDSL_Expression_AndParserRuleCall_1_2_0());
+ pushFollow(FOLLOW_2);
+ ruleDSL_Expression_And();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_Expression_OrAccess().getRightDSL_Expression_AndParserRuleCall_1_2_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Or__RightAssignment_1_2"
+
+
+ // $ANTLR start "rule__DSL_Expression_And__RightAssignment_1_2"
+ // InternalSensinact.g:7406:1: rule__DSL_Expression_And__RightAssignment_1_2 : ( ruleDSL_Expression_DiffEqual ) ;
+ public final void rule__DSL_Expression_And__RightAssignment_1_2() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:7410:1: ( ( ruleDSL_Expression_DiffEqual ) )
+ // InternalSensinact.g:7411:2: ( ruleDSL_Expression_DiffEqual )
+ {
+ // InternalSensinact.g:7411:2: ( ruleDSL_Expression_DiffEqual )
+ // InternalSensinact.g:7412:3: ruleDSL_Expression_DiffEqual
+ {
+ before(grammarAccess.getDSL_Expression_AndAccess().getRightDSL_Expression_DiffEqualParserRuleCall_1_2_0());
+ pushFollow(FOLLOW_2);
+ ruleDSL_Expression_DiffEqual();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_Expression_AndAccess().getRightDSL_Expression_DiffEqualParserRuleCall_1_2_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_And__RightAssignment_1_2"
+
+
+ // $ANTLR start "rule__DSL_Expression_DiffEqual__RightAssignment_1_0_2"
+ // InternalSensinact.g:7421:1: rule__DSL_Expression_DiffEqual__RightAssignment_1_0_2 : ( ruleDSL_Expression_Compare ) ;
+ public final void rule__DSL_Expression_DiffEqual__RightAssignment_1_0_2() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:7425:1: ( ( ruleDSL_Expression_Compare ) )
+ // InternalSensinact.g:7426:2: ( ruleDSL_Expression_Compare )
+ {
+ // InternalSensinact.g:7426:2: ( ruleDSL_Expression_Compare )
+ // InternalSensinact.g:7427:3: ruleDSL_Expression_Compare
+ {
+ before(grammarAccess.getDSL_Expression_DiffEqualAccess().getRightDSL_Expression_CompareParserRuleCall_1_0_2_0());
+ pushFollow(FOLLOW_2);
+ ruleDSL_Expression_Compare();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_Expression_DiffEqualAccess().getRightDSL_Expression_CompareParserRuleCall_1_0_2_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_DiffEqual__RightAssignment_1_0_2"
+
+
+ // $ANTLR start "rule__DSL_Expression_DiffEqual__RightAssignment_1_1_2"
+ // InternalSensinact.g:7436:1: rule__DSL_Expression_DiffEqual__RightAssignment_1_1_2 : ( ruleDSL_Expression_Compare ) ;
+ public final void rule__DSL_Expression_DiffEqual__RightAssignment_1_1_2() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:7440:1: ( ( ruleDSL_Expression_Compare ) )
+ // InternalSensinact.g:7441:2: ( ruleDSL_Expression_Compare )
+ {
+ // InternalSensinact.g:7441:2: ( ruleDSL_Expression_Compare )
+ // InternalSensinact.g:7442:3: ruleDSL_Expression_Compare
+ {
+ before(grammarAccess.getDSL_Expression_DiffEqualAccess().getRightDSL_Expression_CompareParserRuleCall_1_1_2_0());
+ pushFollow(FOLLOW_2);
+ ruleDSL_Expression_Compare();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_Expression_DiffEqualAccess().getRightDSL_Expression_CompareParserRuleCall_1_1_2_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_DiffEqual__RightAssignment_1_1_2"
+
+
+ // $ANTLR start "rule__DSL_Expression_Compare__RightAssignment_1_0_2"
+ // InternalSensinact.g:7451:1: rule__DSL_Expression_Compare__RightAssignment_1_0_2 : ( ruleDSL_Expression_PlusMinus ) ;
+ public final void rule__DSL_Expression_Compare__RightAssignment_1_0_2() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:7455:1: ( ( ruleDSL_Expression_PlusMinus ) )
+ // InternalSensinact.g:7456:2: ( ruleDSL_Expression_PlusMinus )
+ {
+ // InternalSensinact.g:7456:2: ( ruleDSL_Expression_PlusMinus )
+ // InternalSensinact.g:7457:3: ruleDSL_Expression_PlusMinus
+ {
+ before(grammarAccess.getDSL_Expression_CompareAccess().getRightDSL_Expression_PlusMinusParserRuleCall_1_0_2_0());
+ pushFollow(FOLLOW_2);
+ ruleDSL_Expression_PlusMinus();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_Expression_CompareAccess().getRightDSL_Expression_PlusMinusParserRuleCall_1_0_2_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Compare__RightAssignment_1_0_2"
+
+
+ // $ANTLR start "rule__DSL_Expression_Compare__RightAssignment_1_1_2"
+ // InternalSensinact.g:7466:1: rule__DSL_Expression_Compare__RightAssignment_1_1_2 : ( ruleDSL_Expression_PlusMinus ) ;
+ public final void rule__DSL_Expression_Compare__RightAssignment_1_1_2() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:7470:1: ( ( ruleDSL_Expression_PlusMinus ) )
+ // InternalSensinact.g:7471:2: ( ruleDSL_Expression_PlusMinus )
+ {
+ // InternalSensinact.g:7471:2: ( ruleDSL_Expression_PlusMinus )
+ // InternalSensinact.g:7472:3: ruleDSL_Expression_PlusMinus
+ {
+ before(grammarAccess.getDSL_Expression_CompareAccess().getRightDSL_Expression_PlusMinusParserRuleCall_1_1_2_0());
+ pushFollow(FOLLOW_2);
+ ruleDSL_Expression_PlusMinus();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_Expression_CompareAccess().getRightDSL_Expression_PlusMinusParserRuleCall_1_1_2_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Compare__RightAssignment_1_1_2"
+
+
+ // $ANTLR start "rule__DSL_Expression_Compare__RightAssignment_1_2_2"
+ // InternalSensinact.g:7481:1: rule__DSL_Expression_Compare__RightAssignment_1_2_2 : ( ruleDSL_Expression_PlusMinus ) ;
+ public final void rule__DSL_Expression_Compare__RightAssignment_1_2_2() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:7485:1: ( ( ruleDSL_Expression_PlusMinus ) )
+ // InternalSensinact.g:7486:2: ( ruleDSL_Expression_PlusMinus )
+ {
+ // InternalSensinact.g:7486:2: ( ruleDSL_Expression_PlusMinus )
+ // InternalSensinact.g:7487:3: ruleDSL_Expression_PlusMinus
+ {
+ before(grammarAccess.getDSL_Expression_CompareAccess().getRightDSL_Expression_PlusMinusParserRuleCall_1_2_2_0());
+ pushFollow(FOLLOW_2);
+ ruleDSL_Expression_PlusMinus();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_Expression_CompareAccess().getRightDSL_Expression_PlusMinusParserRuleCall_1_2_2_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Compare__RightAssignment_1_2_2"
+
+
+ // $ANTLR start "rule__DSL_Expression_Compare__RightAssignment_1_3_2"
+ // InternalSensinact.g:7496:1: rule__DSL_Expression_Compare__RightAssignment_1_3_2 : ( ruleDSL_Expression_PlusMinus ) ;
+ public final void rule__DSL_Expression_Compare__RightAssignment_1_3_2() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:7500:1: ( ( ruleDSL_Expression_PlusMinus ) )
+ // InternalSensinact.g:7501:2: ( ruleDSL_Expression_PlusMinus )
+ {
+ // InternalSensinact.g:7501:2: ( ruleDSL_Expression_PlusMinus )
+ // InternalSensinact.g:7502:3: ruleDSL_Expression_PlusMinus
+ {
+ before(grammarAccess.getDSL_Expression_CompareAccess().getRightDSL_Expression_PlusMinusParserRuleCall_1_3_2_0());
+ pushFollow(FOLLOW_2);
+ ruleDSL_Expression_PlusMinus();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_Expression_CompareAccess().getRightDSL_Expression_PlusMinusParserRuleCall_1_3_2_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Compare__RightAssignment_1_3_2"
+
+
+ // $ANTLR start "rule__DSL_Expression_PlusMinus__RightAssignment_1_0_2"
+ // InternalSensinact.g:7511:1: rule__DSL_Expression_PlusMinus__RightAssignment_1_0_2 : ( ruleDSL_Expression_MultiplicationDivision ) ;
+ public final void rule__DSL_Expression_PlusMinus__RightAssignment_1_0_2() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:7515:1: ( ( ruleDSL_Expression_MultiplicationDivision ) )
+ // InternalSensinact.g:7516:2: ( ruleDSL_Expression_MultiplicationDivision )
+ {
+ // InternalSensinact.g:7516:2: ( ruleDSL_Expression_MultiplicationDivision )
+ // InternalSensinact.g:7517:3: ruleDSL_Expression_MultiplicationDivision
+ {
+ before(grammarAccess.getDSL_Expression_PlusMinusAccess().getRightDSL_Expression_MultiplicationDivisionParserRuleCall_1_0_2_0());
+ pushFollow(FOLLOW_2);
+ ruleDSL_Expression_MultiplicationDivision();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_Expression_PlusMinusAccess().getRightDSL_Expression_MultiplicationDivisionParserRuleCall_1_0_2_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_PlusMinus__RightAssignment_1_0_2"
+
+
+ // $ANTLR start "rule__DSL_Expression_PlusMinus__RightAssignment_1_1_2"
+ // InternalSensinact.g:7526:1: rule__DSL_Expression_PlusMinus__RightAssignment_1_1_2 : ( ruleDSL_Expression_MultiplicationDivision ) ;
+ public final void rule__DSL_Expression_PlusMinus__RightAssignment_1_1_2() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:7530:1: ( ( ruleDSL_Expression_MultiplicationDivision ) )
+ // InternalSensinact.g:7531:2: ( ruleDSL_Expression_MultiplicationDivision )
+ {
+ // InternalSensinact.g:7531:2: ( ruleDSL_Expression_MultiplicationDivision )
+ // InternalSensinact.g:7532:3: ruleDSL_Expression_MultiplicationDivision
+ {
+ before(grammarAccess.getDSL_Expression_PlusMinusAccess().getRightDSL_Expression_MultiplicationDivisionParserRuleCall_1_1_2_0());
+ pushFollow(FOLLOW_2);
+ ruleDSL_Expression_MultiplicationDivision();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_Expression_PlusMinusAccess().getRightDSL_Expression_MultiplicationDivisionParserRuleCall_1_1_2_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_PlusMinus__RightAssignment_1_1_2"
+
+
+ // $ANTLR start "rule__DSL_Expression_MultiplicationDivision__RightAssignment_1_0_2"
+ // InternalSensinact.g:7541:1: rule__DSL_Expression_MultiplicationDivision__RightAssignment_1_0_2 : ( ruleDSL_Expression_Unary ) ;
+ public final void rule__DSL_Expression_MultiplicationDivision__RightAssignment_1_0_2() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:7545:1: ( ( ruleDSL_Expression_Unary ) )
+ // InternalSensinact.g:7546:2: ( ruleDSL_Expression_Unary )
+ {
+ // InternalSensinact.g:7546:2: ( ruleDSL_Expression_Unary )
+ // InternalSensinact.g:7547:3: ruleDSL_Expression_Unary
+ {
+ before(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getRightDSL_Expression_UnaryParserRuleCall_1_0_2_0());
+ pushFollow(FOLLOW_2);
+ ruleDSL_Expression_Unary();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getRightDSL_Expression_UnaryParserRuleCall_1_0_2_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_MultiplicationDivision__RightAssignment_1_0_2"
+
+
+ // $ANTLR start "rule__DSL_Expression_MultiplicationDivision__RightAssignment_1_1_2"
+ // InternalSensinact.g:7556:1: rule__DSL_Expression_MultiplicationDivision__RightAssignment_1_1_2 : ( ruleDSL_Expression_Unary ) ;
+ public final void rule__DSL_Expression_MultiplicationDivision__RightAssignment_1_1_2() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:7560:1: ( ( ruleDSL_Expression_Unary ) )
+ // InternalSensinact.g:7561:2: ( ruleDSL_Expression_Unary )
+ {
+ // InternalSensinact.g:7561:2: ( ruleDSL_Expression_Unary )
+ // InternalSensinact.g:7562:3: ruleDSL_Expression_Unary
+ {
+ before(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getRightDSL_Expression_UnaryParserRuleCall_1_1_2_0());
+ pushFollow(FOLLOW_2);
+ ruleDSL_Expression_Unary();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getRightDSL_Expression_UnaryParserRuleCall_1_1_2_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_MultiplicationDivision__RightAssignment_1_1_2"
+
+
+ // $ANTLR start "rule__DSL_Expression_MultiplicationDivision__RightAssignment_1_2_2"
+ // InternalSensinact.g:7571:1: rule__DSL_Expression_MultiplicationDivision__RightAssignment_1_2_2 : ( ruleDSL_Expression_Unary ) ;
+ public final void rule__DSL_Expression_MultiplicationDivision__RightAssignment_1_2_2() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:7575:1: ( ( ruleDSL_Expression_Unary ) )
+ // InternalSensinact.g:7576:2: ( ruleDSL_Expression_Unary )
+ {
+ // InternalSensinact.g:7576:2: ( ruleDSL_Expression_Unary )
+ // InternalSensinact.g:7577:3: ruleDSL_Expression_Unary
+ {
+ before(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getRightDSL_Expression_UnaryParserRuleCall_1_2_2_0());
+ pushFollow(FOLLOW_2);
+ ruleDSL_Expression_Unary();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getRightDSL_Expression_UnaryParserRuleCall_1_2_2_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_MultiplicationDivision__RightAssignment_1_2_2"
+
+
+ // $ANTLR start "rule__DSL_Expression_Unary__ValueAssignment_0_1"
+ // InternalSensinact.g:7586:1: rule__DSL_Expression_Unary__ValueAssignment_0_1 : ( ruleNUMBER ) ;
+ public final void rule__DSL_Expression_Unary__ValueAssignment_0_1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:7590:1: ( ( ruleNUMBER ) )
+ // InternalSensinact.g:7591:2: ( ruleNUMBER )
+ {
+ // InternalSensinact.g:7591:2: ( ruleNUMBER )
+ // InternalSensinact.g:7592:3: ruleNUMBER
+ {
+ before(grammarAccess.getDSL_Expression_UnaryAccess().getValueNUMBERParserRuleCall_0_1_0());
+ pushFollow(FOLLOW_2);
+ ruleNUMBER();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_Expression_UnaryAccess().getValueNUMBERParserRuleCall_0_1_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Unary__ValueAssignment_0_1"
+
+
+ // $ANTLR start "rule__DSL_Expression_Unary__ValueAssignment_1_1"
+ // InternalSensinact.g:7601:1: rule__DSL_Expression_Unary__ValueAssignment_1_1 : ( RULE_STRING ) ;
+ public final void rule__DSL_Expression_Unary__ValueAssignment_1_1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:7605:1: ( ( RULE_STRING ) )
+ // InternalSensinact.g:7606:2: ( RULE_STRING )
+ {
+ // InternalSensinact.g:7606:2: ( RULE_STRING )
+ // InternalSensinact.g:7607:3: RULE_STRING
+ {
+ before(grammarAccess.getDSL_Expression_UnaryAccess().getValueSTRINGTerminalRuleCall_1_1_0());
+ match(input,RULE_STRING,FOLLOW_2);
+ after(grammarAccess.getDSL_Expression_UnaryAccess().getValueSTRINGTerminalRuleCall_1_1_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Unary__ValueAssignment_1_1"
+
+
+ // $ANTLR start "rule__DSL_Expression_Unary__ValueAssignment_2_1"
+ // InternalSensinact.g:7616:1: rule__DSL_Expression_Unary__ValueAssignment_2_1 : ( RULE_BOOLEAN ) ;
+ public final void rule__DSL_Expression_Unary__ValueAssignment_2_1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:7620:1: ( ( RULE_BOOLEAN ) )
+ // InternalSensinact.g:7621:2: ( RULE_BOOLEAN )
+ {
+ // InternalSensinact.g:7621:2: ( RULE_BOOLEAN )
+ // InternalSensinact.g:7622:3: RULE_BOOLEAN
+ {
+ before(grammarAccess.getDSL_Expression_UnaryAccess().getValueBOOLEANTerminalRuleCall_2_1_0());
+ match(input,RULE_BOOLEAN,FOLLOW_2);
+ after(grammarAccess.getDSL_Expression_UnaryAccess().getValueBOOLEANTerminalRuleCall_2_1_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Unary__ValueAssignment_2_1"
+
+
+ // $ANTLR start "rule__DSL_Expression_Unary__ValueAssignment_3_1"
+ // InternalSensinact.g:7631:1: rule__DSL_Expression_Unary__ValueAssignment_3_1 : ( ( RULE_ID ) ) ;
+ public final void rule__DSL_Expression_Unary__ValueAssignment_3_1() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:7635:1: ( ( ( RULE_ID ) ) )
+ // InternalSensinact.g:7636:2: ( ( RULE_ID ) )
+ {
+ // InternalSensinact.g:7636:2: ( ( RULE_ID ) )
+ // InternalSensinact.g:7637:3: ( RULE_ID )
+ {
+ before(grammarAccess.getDSL_Expression_UnaryAccess().getValueDSL_REFCrossReference_3_1_0());
+ // InternalSensinact.g:7638:3: ( RULE_ID )
+ // InternalSensinact.g:7639:4: RULE_ID
+ {
+ before(grammarAccess.getDSL_Expression_UnaryAccess().getValueDSL_REFIDTerminalRuleCall_3_1_0_1());
+ match(input,RULE_ID,FOLLOW_2);
+ after(grammarAccess.getDSL_Expression_UnaryAccess().getValueDSL_REFIDTerminalRuleCall_3_1_0_1());
+
+ }
+
+ after(grammarAccess.getDSL_Expression_UnaryAccess().getValueDSL_REFCrossReference_3_1_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Unary__ValueAssignment_3_1"
+
+
+ // $ANTLR start "rule__DSL_Expression_Unary__ExpAssignment_5_2"
+ // InternalSensinact.g:7650:1: rule__DSL_Expression_Unary__ExpAssignment_5_2 : ( ruleDSL_Expression_Unary ) ;
+ public final void rule__DSL_Expression_Unary__ExpAssignment_5_2() throws RecognitionException {
+
+ int stackSize = keepStackSize();
+
+ try {
+ // InternalSensinact.g:7654:1: ( ( ruleDSL_Expression_Unary ) )
+ // InternalSensinact.g:7655:2: ( ruleDSL_Expression_Unary )
+ {
+ // InternalSensinact.g:7655:2: ( ruleDSL_Expression_Unary )
+ // InternalSensinact.g:7656:3: ruleDSL_Expression_Unary
+ {
+ before(grammarAccess.getDSL_Expression_UnaryAccess().getExpDSL_Expression_UnaryParserRuleCall_5_2_0());
+ pushFollow(FOLLOW_2);
+ ruleDSL_Expression_Unary();
+
+ state._fsp--;
+
+ after(grammarAccess.getDSL_Expression_UnaryAccess().getExpDSL_Expression_UnaryParserRuleCall_5_2_0());
+
+ }
+
+
+ }
+
+ }
+ catch (RecognitionException re) {
+ reportError(re);
+ recover(input,re);
+ }
+ finally {
+
+ restoreStackSize(stackSize);
+
+ }
+ return ;
+ }
+ // $ANTLR end "rule__DSL_Expression_Unary__ExpAssignment_5_2"
+
+ // Delegated rules
+
+
+ protected DFA17 dfa17 = new DFA17(this);
+ protected DFA18 dfa18 = new DFA18(this);
+ static final String dfa_1s = "\15\uffff";
+ static final String dfa_2s = "\1\4\1\32\3\4\1\32\2\uffff\1\42\3\4\1\42";
+ static final String dfa_3s = "\1\4\1\47\1\35\1\4\1\35\1\47\2\uffff\1\47\1\4\2\35\1\47";
+ static final String dfa_4s = "\6\uffff\1\1\1\2\5\uffff";
+ static final String dfa_5s = "\15\uffff}>";
+ static final String[] dfa_6s = {
+ "\1\1",
+ "\1\3\7\uffff\1\4\4\uffff\1\2",
+ "\1\5\17\uffff\1\6\10\uffff\1\7",
+ "\1\10",
+ "\1\5\17\uffff\1\6\10\uffff\1\7",
+ "\1\11\7\uffff\1\12\4\uffff\1\13",
+ "",
+ "",
+ "\1\4\4\uffff\1\2",
+ "\1\14",
+ "\1\5\17\uffff\1\6\10\uffff\1\7",
+ "\1\5\17\uffff\1\6\10\uffff\1\7",
+ "\1\12\4\uffff\1\13"
+ };
+
+ static final short[] dfa_1 = DFA.unpackEncodedString(dfa_1s);
+ static final char[] dfa_2 = DFA.unpackEncodedStringToUnsignedChars(dfa_2s);
+ static final char[] dfa_3 = DFA.unpackEncodedStringToUnsignedChars(dfa_3s);
+ static final short[] dfa_4 = DFA.unpackEncodedString(dfa_4s);
+ static final short[] dfa_5 = DFA.unpackEncodedString(dfa_5s);
+ static final short[][] dfa_6 = unpackEncodedStringArray(dfa_6s);
+
+ class DFA17 extends DFA {
+
+ public DFA17(BaseRecognizer recognizer) {
+ this.recognizer = recognizer;
+ this.decisionNumber = 17;
+ this.eot = dfa_1;
+ this.eof = dfa_1;
+ this.min = dfa_2;
+ this.max = dfa_3;
+ this.accept = dfa_4;
+ this.special = dfa_5;
+ this.transition = dfa_6;
+ }
+ public String getDescription() {
+ return "2770:2: ( rule__DSL_CEP_AFTER__Group_6__0 )?";
+ }
+ }
+ static final String dfa_7s = "\1\4\1\32\3\4\1\42\1\32\2\uffff\3\4\1\42";
+ static final String dfa_8s = "\1\4\1\47\1\4\2\35\2\47\2\uffff\1\35\1\4\1\35\1\47";
+ static final String dfa_9s = "\7\uffff\1\1\1\2\4\uffff";
+ static final String[] dfa_10s = {
+ "\1\1",
+ "\1\2\7\uffff\1\3\4\uffff\1\4",
+ "\1\5",
+ "\1\6\17\uffff\1\7\10\uffff\1\10",
+ "\1\6\17\uffff\1\7\10\uffff\1\10",
+ "\1\3\4\uffff\1\4",
+ "\1\12\7\uffff\1\11\4\uffff\1\13",
+ "",
+ "",
+ "\1\6\17\uffff\1\7\10\uffff\1\10",
+ "\1\14",
+ "\1\6\17\uffff\1\7\10\uffff\1\10",
+ "\1\11\4\uffff\1\13"
+ };
+ static final char[] dfa_7 = DFA.unpackEncodedStringToUnsignedChars(dfa_7s);
+ static final char[] dfa_8 = DFA.unpackEncodedStringToUnsignedChars(dfa_8s);
+ static final short[] dfa_9 = DFA.unpackEncodedString(dfa_9s);
+ static final short[][] dfa_10 = unpackEncodedStringArray(dfa_10s);
+
+ class DFA18 extends DFA {
+
+ public DFA18(BaseRecognizer recognizer) {
+ this.recognizer = recognizer;
+ this.decisionNumber = 18;
+ this.eot = dfa_1;
+ this.eof = dfa_1;
+ this.min = dfa_7;
+ this.max = dfa_8;
+ this.accept = dfa_9;
+ this.special = dfa_5;
+ this.transition = dfa_10;
+ }
+ public String getDescription() {
+ return "3067:2: ( rule__DSL_CEP_BEFORE__Group_6__0 )?";
+ }
+ }
+
+
+ public static final BitSet FOLLOW_1 = new BitSet(new long[]{0x0000000000000000L});
+ public static final BitSet FOLLOW_2 = new BitSet(new long[]{0x0000000000000002L});
+ public static final BitSet FOLLOW_3 = new BitSet(new long[]{0x0000000000000012L});
+ public static final BitSet FOLLOW_4 = new BitSet(new long[]{0x0000000000004000L});
+ public static final BitSet FOLLOW_5 = new BitSet(new long[]{0x0000000040080000L});
+ public static final BitSet FOLLOW_6 = new BitSet(new long[]{0x0000000000004002L});
+ public static final BitSet FOLLOW_7 = new BitSet(new long[]{0x0000000040000002L});
+ public static final BitSet FOLLOW_8 = new BitSet(new long[]{0x0000000000400000L});
+ public static final BitSet FOLLOW_9 = new BitSet(new long[]{0x0000000000000020L});
+ public static final BitSet FOLLOW_10 = new BitSet(new long[]{0x0000000000008000L});
+ public static final BitSet FOLLOW_11 = new BitSet(new long[]{0x0000000000010000L});
+ public static final BitSet FOLLOW_12 = new BitSet(new long[]{0x0000000000020000L});
+ public static final BitSet FOLLOW_13 = new BitSet(new long[]{0x0000000000040000L});
+ public static final BitSet FOLLOW_14 = new BitSet(new long[]{0x0000000000100000L});
+ public static final BitSet FOLLOW_15 = new BitSet(new long[]{0x0000000000100002L});
+ public static final BitSet FOLLOW_16 = new BitSet(new long[]{0x0000000003200000L});
+ public static final BitSet FOLLOW_17 = new BitSet(new long[]{0x0000000001000002L});
+ public static final BitSet FOLLOW_18 = new BitSet(new long[]{0x00200000100000F0L});
+ public static final BitSet FOLLOW_19 = new BitSet(new long[]{0x0000000000800000L});
+ public static final BitSet FOLLOW_20 = new BitSet(new long[]{0x0000000004000000L});
+ public static final BitSet FOLLOW_21 = new BitSet(new long[]{0x0000000000000010L});
+ public static final BitSet FOLLOW_22 = new BitSet(new long[]{0x0000000004000002L});
+ public static final BitSet FOLLOW_23 = new BitSet(new long[]{0x0000000008000000L});
+ public static final BitSet FOLLOW_24 = new BitSet(new long[]{0x0000000010000000L});
+ public static final BitSet FOLLOW_25 = new BitSet(new long[]{0x0000000020000000L});
+ public static final BitSet FOLLOW_26 = new BitSet(new long[]{0x0000007F80000000L});
+ public static final BitSet FOLLOW_27 = new BitSet(new long[]{0x0000000400000000L});
+ public static final BitSet FOLLOW_28 = new BitSet(new long[]{0x0000008000000000L});
+ public static final BitSet FOLLOW_29 = new BitSet(new long[]{0x0000000000003000L});
+ public static final BitSet FOLLOW_30 = new BitSet(new long[]{0x00200000300000F0L});
+ public static final BitSet FOLLOW_31 = new BitSet(new long[]{0x0000010000000000L});
+ public static final BitSet FOLLOW_32 = new BitSet(new long[]{0x0000010000000002L});
+ public static final BitSet FOLLOW_33 = new BitSet(new long[]{0x0000020000000000L});
+ public static final BitSet FOLLOW_34 = new BitSet(new long[]{0x0000020000000002L});
+ public static final BitSet FOLLOW_35 = new BitSet(new long[]{0x00000C0000000000L});
+ public static final BitSet FOLLOW_36 = new BitSet(new long[]{0x00000C0000000002L});
+ public static final BitSet FOLLOW_37 = new BitSet(new long[]{0x0000F00000000000L});
+ public static final BitSet FOLLOW_38 = new BitSet(new long[]{0x0000F00000000002L});
+ public static final BitSet FOLLOW_39 = new BitSet(new long[]{0x0003000000000000L});
+ public static final BitSet FOLLOW_40 = new BitSet(new long[]{0x0003000000000002L});
+ public static final BitSet FOLLOW_41 = new BitSet(new long[]{0x000C000000020000L});
+ public static final BitSet FOLLOW_42 = new BitSet(new long[]{0x000C000000020002L});
+ public static final BitSet FOLLOW_43 = new BitSet(new long[]{0x0000000000000040L});
+ public static final BitSet FOLLOW_44 = new BitSet(new long[]{0x0000000000000080L});
+ public static final BitSet FOLLOW_45 = new BitSet(new long[]{0x0010000000000000L});
+
+}
\ No newline at end of file
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact.tests/META-INF/MANIFEST.MF b/xtext/org.eclipse.sensinact.studio.language.sensinact.tests/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..26f2da3
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact.tests/META-INF/MANIFEST.MF
@@ -0,0 +1,21 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: org.eclipse.sensinact.studio.language.sensinact.tests
+Bundle-Vendor: My Company
+Bundle-Version: 1.0.0.qualifier
+Bundle-SymbolicName: org.eclipse.sensinact.studio.language.sensinact.tests; singleton:=true
+Bundle-ActivationPolicy: lazy
+Require-Bundle: org.eclipse.sensinact.studio.language.sensinact,
+ org.junit,
+ org.eclipse.xtext.junit4,
+ org.eclipse.xtext.xbase.junit,
+ org.eclipse.xtext.xbase.lib
+Bundle-RequiredExecutionEnvironment: JavaSE-1.7
+Export-Package: org.eclipse.sensinact.studio.language.tests
+Import-Package: org.hamcrest.core,
+ org.junit,
+ org.junit.runners.model,
+ org.junit.runner,
+ org.junit.runners,
+ org.junit.runner.manipulation,
+ org.junit.runner.notification
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact.tests/about.html b/xtext/org.eclipse.sensinact.studio.language.sensinact.tests/about.html
new file mode 100644
index 0000000..3b39f88
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact.tests/about.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"><head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 5, 2006</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+
+</body></html>
\ No newline at end of file
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact.tests/build.properties b/xtext/org.eclipse.sensinact.studio.language.sensinact.tests/build.properties
new file mode 100644
index 0000000..c4c7717
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact.tests/build.properties
@@ -0,0 +1,16 @@
+#
+# Copyright (c) 2017 CEA.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+# CEA - initial API and implementation and/or initial documentation
+#
+
+source.. = src/,\
+ src-gen/,\
+ xtend-gen/
+bin.includes = .,\
+ META-INF/
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact.tests/src-gen/org/eclipse/sensinact/studio/language/tests/SensinactInjectorProvider.java b/xtext/org.eclipse.sensinact.studio.language.sensinact.tests/src-gen/org/eclipse/sensinact/studio/language/tests/SensinactInjectorProvider.java
new file mode 100644
index 0000000..20fb225
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact.tests/src-gen/org/eclipse/sensinact/studio/language/tests/SensinactInjectorProvider.java
@@ -0,0 +1,57 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/*
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.tests;
+
+import com.google.inject.Injector;
+import org.eclipse.sensinact.studio.language.SensinactStandaloneSetup;
+import org.eclipse.xtext.junit4.GlobalRegistries;
+import org.eclipse.xtext.junit4.GlobalRegistries.GlobalStateMemento;
+import org.eclipse.xtext.junit4.IInjectorProvider;
+import org.eclipse.xtext.junit4.IRegistryConfigurator;
+
+public class SensinactInjectorProvider implements IInjectorProvider, IRegistryConfigurator {
+
+ protected GlobalStateMemento stateBeforeInjectorCreation;
+ protected GlobalStateMemento stateAfterInjectorCreation;
+ protected Injector injector;
+
+ static {
+ GlobalRegistries.initializeDefaults();
+ }
+
+ @Override
+ public Injector getInjector() {
+ if (injector == null) {
+ stateBeforeInjectorCreation = GlobalRegistries.makeCopyOfGlobalState();
+ this.injector = internalCreateInjector();
+ stateAfterInjectorCreation = GlobalRegistries.makeCopyOfGlobalState();
+ }
+ return injector;
+ }
+
+ protected Injector internalCreateInjector() {
+ return new SensinactStandaloneSetup().createInjectorAndDoEMFRegistration();
+ }
+
+ @Override
+ public void restoreRegistry() {
+ stateBeforeInjectorCreation.restoreGlobalState();
+ }
+
+ @Override
+ public void setupRegistry() {
+ getInjector();
+ stateAfterInjectorCreation.restoreGlobalState();
+ }
+}
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact.tests/src/org/eclipse/sensinact/studio/language/tests/SensinactParsingTest.xtend b/xtext/org.eclipse.sensinact.studio.language.sensinact.tests/src/org/eclipse/sensinact/studio/language/tests/SensinactParsingTest.xtend
new file mode 100644
index 0000000..908a32b
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact.tests/src/org/eclipse/sensinact/studio/language/tests/SensinactParsingTest.xtend
@@ -0,0 +1,40 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/*
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.tests
+
+import com.google.inject.Inject
+import org.eclipse.sensinact.studio.language.sensinact.Sensinact
+import org.eclipse.xtext.junit4.InjectWith
+import org.eclipse.xtext.junit4.XtextRunner
+import org.eclipse.xtext.junit4.util.ParseHelper
+import org.junit.Assert
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@RunWith(XtextRunner)
+@InjectWith(SensinactInjectorProvider)
+class SensinactParsingTest{
+
+ @Inject
+ ParseHelper<Sensinact> parseHelper;
+
+ @Test
+ def void loadModel() {
+ val result = parseHelper.parse('''
+ Hello Xtext!
+ ''')
+ Assert.assertNotNull(result)
+ }
+
+}
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact.tests/xtend-gen/org/eclipse/sensinact/studio/language/tests/.SensinactParsingTest.java._trace b/xtext/org.eclipse.sensinact.studio.language.sensinact.tests/xtend-gen/org/eclipse/sensinact/studio/language/tests/.SensinactParsingTest.java._trace
new file mode 100644
index 0000000..c85b669
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact.tests/xtend-gen/org/eclipse/sensinact/studio/language/tests/.SensinactParsingTest.java._trace
Binary files differ
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact.tests/xtend-gen/org/eclipse/sensinact/studio/language/tests/.SensinactParsingTest.xtendbin b/xtext/org.eclipse.sensinact.studio.language.sensinact.tests/xtend-gen/org/eclipse/sensinact/studio/language/tests/.SensinactParsingTest.xtendbin
new file mode 100644
index 0000000..322b50b
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact.tests/xtend-gen/org/eclipse/sensinact/studio/language/tests/.SensinactParsingTest.xtendbin
Binary files differ
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact.tests/xtend-gen/org/eclipse/sensinact/studio/language/tests/SensinactParsingTest.java b/xtext/org.eclipse.sensinact.studio.language.sensinact.tests/xtend-gen/org/eclipse/sensinact/studio/language/tests/SensinactParsingTest.java
new file mode 100644
index 0000000..d9b02dc
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact.tests/xtend-gen/org/eclipse/sensinact/studio/language/tests/SensinactParsingTest.java
@@ -0,0 +1,44 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.language.tests;
+
+import com.google.inject.Inject;
+import org.eclipse.sensinact.studio.language.sensinact.Sensinact;
+import org.eclipse.sensinact.studio.language.tests.SensinactInjectorProvider;
+import org.eclipse.xtend2.lib.StringConcatenation;
+import org.eclipse.xtext.junit4.InjectWith;
+import org.eclipse.xtext.junit4.XtextRunner;
+import org.eclipse.xtext.junit4.util.ParseHelper;
+import org.eclipse.xtext.xbase.lib.Exceptions;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(XtextRunner.class)
+@InjectWith(SensinactInjectorProvider.class)
+@SuppressWarnings("all")
+public class SensinactParsingTest {
+ @Inject
+ private ParseHelper<Sensinact> parseHelper;
+
+ @Test
+ public void loadModel() {
+ try {
+ StringConcatenation _builder = new StringConcatenation();
+ _builder.append("Hello Xtext!");
+ _builder.newLine();
+ final Sensinact result = this.parseHelper.parse(_builder);
+ Assert.assertNotNull(result);
+ } catch (Throwable _e) {
+ throw Exceptions.sneakyThrow(_e);
+ }
+ }
+}
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact.ui.tests/META-INF/MANIFEST.MF b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui.tests/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..cf7b0cb
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui.tests/META-INF/MANIFEST.MF
@@ -0,0 +1,22 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: org.eclipse.sensinact.studio.language.sensinact.ui.tests
+Bundle-Vendor: My Company
+Bundle-Version: 1.0.0.qualifier
+Bundle-SymbolicName: org.eclipse.sensinact.studio.language.sensinact.ui.tests; singleton:=true
+Bundle-ActivationPolicy: lazy
+Require-Bundle: org.eclipse.sensinact.studio.language.sensinact.ui,
+ org.junit,
+ org.eclipse.xtext.junit4,
+ org.eclipse.xtext.xbase.junit,
+ org.eclipse.core.runtime,
+ org.eclipse.ui.workbench
+Bundle-RequiredExecutionEnvironment: JavaSE-1.7
+Export-Package: org.eclipse.sensinact.studio.language.ui.tests
+Import-Package: org.hamcrest.core,
+ org.junit,
+ org.junit.runners.model,
+ org.junit.runner,
+ org.junit.runners,
+ org.junit.runner.manipulation,
+ org.junit.runner.notification
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact.ui.tests/about.html b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui.tests/about.html
new file mode 100644
index 0000000..3b39f88
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui.tests/about.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"><head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 5, 2006</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+
+</body></html>
\ No newline at end of file
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact.ui.tests/build.properties b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui.tests/build.properties
new file mode 100644
index 0000000..c4c7717
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui.tests/build.properties
@@ -0,0 +1,16 @@
+#
+# Copyright (c) 2017 CEA.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+# CEA - initial API and implementation and/or initial documentation
+#
+
+source.. = src/,\
+ src-gen/,\
+ xtend-gen/
+bin.includes = .,\
+ META-INF/
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact.ui.tests/src-gen/org/eclipse/sensinact/studio/language/ui/tests/SensinactUiInjectorProvider.java b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui.tests/src-gen/org/eclipse/sensinact/studio/language/ui/tests/SensinactUiInjectorProvider.java
new file mode 100644
index 0000000..3c81d70
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui.tests/src-gen/org/eclipse/sensinact/studio/language/ui/tests/SensinactUiInjectorProvider.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/*
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.ui.tests;
+
+import com.google.inject.Injector;
+import org.eclipse.sensinact.studio.language.sensinact.ui.internal.SensinactActivator;
+import org.eclipse.xtext.junit4.IInjectorProvider;
+
+public class SensinactUiInjectorProvider implements IInjectorProvider {
+
+ @Override
+ public Injector getInjector() {
+ return SensinactActivator.getInstance().getInjector("org.eclipse.sensinact.studio.language.Sensinact");
+ }
+
+}
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/META-INF/MANIFEST.MF b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..1b3d143
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/META-INF/MANIFEST.MF
@@ -0,0 +1,26 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: org.eclipse.sensinact.studio.language.sensinact.ui
+Bundle-Vendor: My Company
+Bundle-Version: 1.0.0.qualifier
+Bundle-SymbolicName: org.eclipse.sensinact.studio.language.sensinact.ui; singleton:=true
+Bundle-ActivationPolicy: lazy
+Require-Bundle: org.eclipse.sensinact.studio.language.sensinact,
+ org.eclipse.sensinact.studio.language.sensinact.ide,
+ org.eclipse.xtext.ui,
+ org.eclipse.xtext.ui.shared,
+ org.eclipse.xtext.ui.codetemplates.ui,
+ org.eclipse.ui.editors,
+ org.eclipse.ui.ide,
+ org.eclipse.ui,
+ org.eclipse.compare,
+ org.eclipse.xtext.builder,
+ org.eclipse.xtend.lib,
+ org.eclipse.xtext.xbase.lib,
+ org.eclipse.sensinact.studio.model.manager
+Import-Package: org.apache.log4j
+Bundle-RequiredExecutionEnvironment: JavaSE-1.7
+Export-Package: org.eclipse.sensinact.studio.language.ui.quickfix,
+ org.eclipse.sensinact.studio.language.sensinact.ui.internal,
+ org.eclipse.sensinact.studio.language.ui.contentassist
+Bundle-Activator: org.eclipse.sensinact.studio.language.sensinact.ui.internal.SensinactActivator
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/about.html b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/about.html
new file mode 100644
index 0000000..3b39f88
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/about.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"><head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 5, 2006</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+
+</body></html>
\ No newline at end of file
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/build.properties b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/build.properties
new file mode 100644
index 0000000..001be10
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/build.properties
@@ -0,0 +1,17 @@
+#
+# Copyright (c) 2017 CEA.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+# CEA - initial API and implementation and/or initial documentation
+#
+
+source.. = src/,\
+ src-gen/,\
+ xtend-gen/
+bin.includes = .,\
+ META-INF/,\
+ plugin.xml
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/plugin.xml b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/plugin.xml
new file mode 100644
index 0000000..53baa3e
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/plugin.xml
@@ -0,0 +1,422 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Copyright (c) 2017 CEA.
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+
+ Contributors:
+ CEA - initial API and implementation and/or initial documentation
+
+-->
+<?eclipse version="3.0"?>
+<plugin>
+ <extension
+ point="org.eclipse.ui.editors">
+ <editor
+ class="org.eclipse.sensinact.studio.language.ui.SensinactExecutableExtensionFactory:org.eclipse.xtext.ui.editor.XtextEditor"
+ contributorClass="org.eclipse.ui.editors.text.TextEditorActionContributor"
+ default="true"
+ extensions="sna"
+ id="org.eclipse.sensinact.studio.language.Sensinact"
+ name="Sensinact Editor">
+ </editor>
+ </extension>
+ <extension
+ point="org.eclipse.ui.handlers">
+ <handler
+ class="org.eclipse.sensinact.studio.language.ui.SensinactExecutableExtensionFactory:org.eclipse.xtext.ui.editor.hyperlinking.OpenDeclarationHandler"
+ commandId="org.eclipse.xtext.ui.editor.hyperlinking.OpenDeclaration">
+ <activeWhen>
+ <reference
+ definitionId="org.eclipse.sensinact.studio.language.Sensinact.Editor.opened">
+ </reference>
+ </activeWhen>
+ </handler>
+ <handler
+ class="org.eclipse.sensinact.studio.language.ui.SensinactExecutableExtensionFactory:org.eclipse.xtext.ui.editor.handler.ValidateActionHandler"
+ commandId="org.eclipse.sensinact.studio.language.Sensinact.validate">
+ <activeWhen>
+ <reference
+ definitionId="org.eclipse.sensinact.studio.language.Sensinact.Editor.opened">
+ </reference>
+ </activeWhen>
+ </handler>
+ <!-- copy qualified name -->
+ <handler
+ class="org.eclipse.sensinact.studio.language.ui.SensinactExecutableExtensionFactory:org.eclipse.xtext.ui.editor.copyqualifiedname.EditorCopyQualifiedNameHandler"
+ commandId="org.eclipse.xtext.ui.editor.copyqualifiedname.EditorCopyQualifiedName">
+ <activeWhen>
+ <reference definitionId="org.eclipse.sensinact.studio.language.Sensinact.Editor.opened" />
+ </activeWhen>
+ </handler>
+ <handler
+ class="org.eclipse.sensinact.studio.language.ui.SensinactExecutableExtensionFactory:org.eclipse.xtext.ui.editor.copyqualifiedname.OutlineCopyQualifiedNameHandler"
+ commandId="org.eclipse.xtext.ui.editor.copyqualifiedname.OutlineCopyQualifiedName">
+ <activeWhen>
+ <and>
+ <reference definitionId="org.eclipse.sensinact.studio.language.Sensinact.XtextEditor.opened" />
+ <iterate>
+ <adapt type="org.eclipse.xtext.ui.editor.outline.IOutlineNode" />
+ </iterate>
+ </and>
+ </activeWhen>
+ </handler>
+ </extension>
+ <extension point="org.eclipse.core.expressions.definitions">
+ <definition id="org.eclipse.sensinact.studio.language.Sensinact.Editor.opened">
+ <and>
+ <reference definitionId="isActiveEditorAnInstanceOfXtextEditor"/>
+ <with variable="activeEditor">
+ <test property="org.eclipse.xtext.ui.editor.XtextEditor.languageName"
+ value="org.eclipse.sensinact.studio.language.Sensinact"
+ forcePluginActivation="true"/>
+ </with>
+ </and>
+ </definition>
+ <definition id="org.eclipse.sensinact.studio.language.Sensinact.XtextEditor.opened">
+ <and>
+ <reference definitionId="isXtextEditorActive"/>
+ <with variable="activeEditor">
+ <test property="org.eclipse.xtext.ui.editor.XtextEditor.languageName"
+ value="org.eclipse.sensinact.studio.language.Sensinact"
+ forcePluginActivation="true"/>
+ </with>
+ </and>
+ </definition>
+ </extension>
+ <extension
+ point="org.eclipse.ui.preferencePages">
+ <page
+ class="org.eclipse.sensinact.studio.language.ui.SensinactExecutableExtensionFactory:org.eclipse.xtext.ui.editor.preferences.LanguageRootPreferencePage"
+ id="org.eclipse.sensinact.studio.language.Sensinact"
+ name="Sensinact">
+ <keywordReference id="org.eclipse.sensinact.studio.language.ui.keyword_Sensinact"/>
+ </page>
+ <page
+ category="org.eclipse.sensinact.studio.language.Sensinact"
+ class="org.eclipse.sensinact.studio.language.ui.SensinactExecutableExtensionFactory:org.eclipse.xtext.ui.editor.syntaxcoloring.SyntaxColoringPreferencePage"
+ id="org.eclipse.sensinact.studio.language.Sensinact.coloring"
+ name="Syntax Coloring">
+ <keywordReference id="org.eclipse.sensinact.studio.language.ui.keyword_Sensinact"/>
+ </page>
+ <page
+ category="org.eclipse.sensinact.studio.language.Sensinact"
+ class="org.eclipse.sensinact.studio.language.ui.SensinactExecutableExtensionFactory:org.eclipse.xtext.ui.editor.templates.XtextTemplatePreferencePage"
+ id="org.eclipse.sensinact.studio.language.Sensinact.templates"
+ name="Templates">
+ <keywordReference id="org.eclipse.sensinact.studio.language.ui.keyword_Sensinact"/>
+ </page>
+ </extension>
+ <extension
+ point="org.eclipse.ui.propertyPages">
+ <page
+ class="org.eclipse.sensinact.studio.language.ui.SensinactExecutableExtensionFactory:org.eclipse.xtext.ui.editor.preferences.LanguageRootPreferencePage"
+ id="org.eclipse.sensinact.studio.language.Sensinact"
+ name="Sensinact">
+ <keywordReference id="org.eclipse.sensinact.studio.language.ui.keyword_Sensinact"/>
+ <enabledWhen>
+ <adapt type="org.eclipse.core.resources.IProject"/>
+ </enabledWhen>
+ <filter name="projectNature" value="org.eclipse.xtext.ui.shared.xtextNature"/>
+ </page>
+ </extension>
+ <extension
+ point="org.eclipse.ui.keywords">
+ <keyword
+ id="org.eclipse.sensinact.studio.language.ui.keyword_Sensinact"
+ label="Sensinact"/>
+ </extension>
+ <extension
+ point="org.eclipse.ui.commands">
+ <command
+ description="Trigger expensive validation"
+ id="org.eclipse.sensinact.studio.language.Sensinact.validate"
+ name="Validate">
+ </command>
+ <!-- copy qualified name -->
+ <command
+ id="org.eclipse.xtext.ui.editor.copyqualifiedname.EditorCopyQualifiedName"
+ categoryId="org.eclipse.ui.category.edit"
+ description="Copy the qualified name for the selected element"
+ name="Copy Qualified Name">
+ </command>
+ <command
+ id="org.eclipse.xtext.ui.editor.copyqualifiedname.OutlineCopyQualifiedName"
+ categoryId="org.eclipse.ui.category.edit"
+ description="Copy the qualified name for the selected element"
+ name="Copy Qualified Name">
+ </command>
+ </extension>
+ <extension point="org.eclipse.ui.menus">
+ <menuContribution
+ locationURI="popup:#TextEditorContext?after=group.edit">
+ <command
+ commandId="org.eclipse.sensinact.studio.language.Sensinact.validate"
+ style="push"
+ tooltip="Trigger expensive validation">
+ <visibleWhen checkEnabled="false">
+ <reference
+ definitionId="org.eclipse.sensinact.studio.language.Sensinact.Editor.opened">
+ </reference>
+ </visibleWhen>
+ </command>
+ </menuContribution>
+ <!-- copy qualified name -->
+ <menuContribution locationURI="popup:#TextEditorContext?after=copy">
+ <command commandId="org.eclipse.xtext.ui.editor.copyqualifiedname.EditorCopyQualifiedName"
+ style="push" tooltip="Copy Qualified Name">
+ <visibleWhen checkEnabled="false">
+ <reference definitionId="org.eclipse.sensinact.studio.language.Sensinact.Editor.opened" />
+ </visibleWhen>
+ </command>
+ </menuContribution>
+ <menuContribution locationURI="menu:edit?after=copy">
+ <command commandId="org.eclipse.xtext.ui.editor.copyqualifiedname.EditorCopyQualifiedName"
+ style="push" tooltip="Copy Qualified Name">
+ <visibleWhen checkEnabled="false">
+ <reference definitionId="org.eclipse.sensinact.studio.language.Sensinact.Editor.opened" />
+ </visibleWhen>
+ </command>
+ </menuContribution>
+ <menuContribution locationURI="popup:org.eclipse.xtext.ui.outline?after=additions">
+ <command commandId="org.eclipse.xtext.ui.editor.copyqualifiedname.OutlineCopyQualifiedName"
+ style="push" tooltip="Copy Qualified Name">
+ <visibleWhen checkEnabled="false">
+ <and>
+ <reference definitionId="org.eclipse.sensinact.studio.language.Sensinact.XtextEditor.opened" />
+ <iterate>
+ <adapt type="org.eclipse.xtext.ui.editor.outline.IOutlineNode" />
+ </iterate>
+ </and>
+ </visibleWhen>
+ </command>
+ </menuContribution>
+ </extension>
+ <extension point="org.eclipse.ui.menus">
+ <menuContribution locationURI="popup:#TextEditorContext?endof=group.find">
+ <command commandId="org.eclipse.xtext.ui.editor.FindReferences">
+ <visibleWhen checkEnabled="false">
+ <reference definitionId="org.eclipse.sensinact.studio.language.Sensinact.Editor.opened">
+ </reference>
+ </visibleWhen>
+ </command>
+ </menuContribution>
+ </extension>
+ <extension point="org.eclipse.ui.handlers">
+ <handler
+ class="org.eclipse.sensinact.studio.language.ui.SensinactExecutableExtensionFactory:org.eclipse.xtext.ui.editor.findrefs.FindReferencesHandler"
+ commandId="org.eclipse.xtext.ui.editor.FindReferences">
+ <activeWhen>
+ <reference
+ definitionId="org.eclipse.sensinact.studio.language.Sensinact.Editor.opened">
+ </reference>
+ </activeWhen>
+ </handler>
+ </extension>
+ <!-- adding resource factories -->
+ <extension
+ point="org.eclipse.emf.ecore.extension_parser">
+ <parser
+ class="org.eclipse.sensinact.studio.language.ui.SensinactExecutableExtensionFactory:org.eclipse.xtext.resource.IResourceFactory"
+ type="sna">
+ </parser>
+ </extension>
+ <extension point="org.eclipse.xtext.extension_resourceServiceProvider">
+ <resourceServiceProvider
+ class="org.eclipse.sensinact.studio.language.ui.SensinactExecutableExtensionFactory:org.eclipse.xtext.ui.resource.IResourceUIServiceProvider"
+ uriExtension="sna">
+ </resourceServiceProvider>
+ </extension>
+ <!-- marker definitions for org.eclipse.sensinact.studio.language.Sensinact -->
+ <extension
+ id="sensinact.check.fast"
+ name="Sensinact Problem"
+ point="org.eclipse.core.resources.markers">
+ <super type="org.eclipse.xtext.ui.check.fast"/>
+ <persistent value="true"/>
+ </extension>
+ <extension
+ id="sensinact.check.normal"
+ name="Sensinact Problem"
+ point="org.eclipse.core.resources.markers">
+ <super type="org.eclipse.xtext.ui.check.normal"/>
+ <persistent value="true"/>
+ </extension>
+ <extension
+ id="sensinact.check.expensive"
+ name="Sensinact Problem"
+ point="org.eclipse.core.resources.markers">
+ <super type="org.eclipse.xtext.ui.check.expensive"/>
+ <persistent value="true"/>
+ </extension>
+ <extension point="org.eclipse.xtext.builder.participant">
+ <participant
+ class="org.eclipse.sensinact.studio.language.ui.SensinactExecutableExtensionFactory:org.eclipse.xtext.builder.IXtextBuilderParticipant"
+ fileExtensions="sna"/>
+ </extension>
+ <extension point="org.eclipse.ui.preferencePages">
+ <page
+ category="org.eclipse.sensinact.studio.language.Sensinact"
+ class="org.eclipse.sensinact.studio.language.ui.SensinactExecutableExtensionFactory:org.eclipse.xtext.builder.preferences.BuilderPreferencePage"
+ id="org.eclipse.sensinact.studio.language.Sensinact.compiler.preferencePage"
+ name="Compiler">
+ <keywordReference id="org.eclipse.sensinact.studio.language.ui.keyword_Sensinact"/>
+ </page>
+ </extension>
+ <extension point="org.eclipse.ui.propertyPages">
+ <page
+ category="org.eclipse.sensinact.studio.language.Sensinact"
+ class="org.eclipse.sensinact.studio.language.ui.SensinactExecutableExtensionFactory:org.eclipse.xtext.builder.preferences.BuilderPreferencePage"
+ id="org.eclipse.sensinact.studio.language.Sensinact.compiler.propertyPage"
+ name="Compiler">
+ <keywordReference id="org.eclipse.sensinact.studio.language.ui.keyword_Sensinact"/>
+ <enabledWhen>
+ <adapt type="org.eclipse.core.resources.IProject"/>
+ </enabledWhen>
+ <filter name="projectNature" value="org.eclipse.xtext.ui.shared.xtextNature"/>
+ </page>
+ </extension>
+ <extension point="org.eclipse.ui.menus">
+ <menuContribution locationURI="popup:#TextEditorContext?after=xtext.ui.openDeclaration">
+ <command
+ commandId="org.eclipse.xtext.ui.OpenGeneratedFileCommand"
+ id="org.eclipse.sensinact.studio.language.Sensinact.OpenGeneratedCode"
+ style="push">
+ <visibleWhen checkEnabled="false">
+ <reference definitionId="org.eclipse.sensinact.studio.language.Sensinact.Editor.opened" />
+ </visibleWhen>
+ </command>
+ </menuContribution>
+ </extension>
+ <extension point="org.eclipse.ui.handlers">
+ <handler
+ class="org.eclipse.sensinact.studio.language.ui.SensinactExecutableExtensionFactory:org.eclipse.xtext.ui.generator.trace.OpenGeneratedFileHandler"
+ commandId="org.eclipse.xtext.ui.OpenGeneratedFileCommand">
+ <activeWhen>
+ <reference definitionId="org.eclipse.sensinact.studio.language.Sensinact.Editor.opened" />
+ </activeWhen>
+ </handler>
+ </extension>
+ <!-- Quick Outline -->
+ <extension
+ point="org.eclipse.ui.handlers">
+ <handler
+ class="org.eclipse.sensinact.studio.language.ui.SensinactExecutableExtensionFactory:org.eclipse.xtext.ui.editor.outline.quickoutline.ShowQuickOutlineActionHandler"
+ commandId="org.eclipse.xtext.ui.editor.outline.QuickOutline">
+ <activeWhen>
+ <reference
+ definitionId="org.eclipse.sensinact.studio.language.Sensinact.Editor.opened">
+ </reference>
+ </activeWhen>
+ </handler>
+ </extension>
+ <extension
+ point="org.eclipse.ui.commands">
+ <command
+ description="Open the quick outline."
+ id="org.eclipse.xtext.ui.editor.outline.QuickOutline"
+ name="Quick Outline">
+ </command>
+ </extension>
+ <extension point="org.eclipse.ui.menus">
+ <menuContribution
+ locationURI="popup:#TextEditorContext?after=group.open">
+ <command commandId="org.eclipse.xtext.ui.editor.outline.QuickOutline"
+ style="push"
+ tooltip="Open Quick Outline">
+ <visibleWhen checkEnabled="false">
+ <reference definitionId="org.eclipse.sensinact.studio.language.Sensinact.Editor.opened"/>
+ </visibleWhen>
+ </command>
+ </menuContribution>
+ </extension>
+ <!-- quickfix marker resolution generator for org.eclipse.sensinact.studio.language.Sensinact -->
+ <extension
+ point="org.eclipse.ui.ide.markerResolution">
+ <markerResolutionGenerator
+ class="org.eclipse.sensinact.studio.language.ui.SensinactExecutableExtensionFactory:org.eclipse.xtext.ui.editor.quickfix.MarkerResolutionGenerator"
+ markerType="org.eclipse.sensinact.studio.language.sensinact.ui.sensinact.check.fast">
+ <attribute
+ name="FIXABLE_KEY"
+ value="true">
+ </attribute>
+ </markerResolutionGenerator>
+ <markerResolutionGenerator
+ class="org.eclipse.sensinact.studio.language.ui.SensinactExecutableExtensionFactory:org.eclipse.xtext.ui.editor.quickfix.MarkerResolutionGenerator"
+ markerType="org.eclipse.sensinact.studio.language.sensinact.ui.sensinact.check.normal">
+ <attribute
+ name="FIXABLE_KEY"
+ value="true">
+ </attribute>
+ </markerResolutionGenerator>
+ <markerResolutionGenerator
+ class="org.eclipse.sensinact.studio.language.ui.SensinactExecutableExtensionFactory:org.eclipse.xtext.ui.editor.quickfix.MarkerResolutionGenerator"
+ markerType="org.eclipse.sensinact.studio.language.sensinact.ui.sensinact.check.expensive">
+ <attribute
+ name="FIXABLE_KEY"
+ value="true">
+ </attribute>
+ </markerResolutionGenerator>
+ </extension>
+ <!-- Rename Refactoring -->
+ <extension point="org.eclipse.ui.handlers">
+ <handler
+ class="org.eclipse.sensinact.studio.language.ui.SensinactExecutableExtensionFactory:org.eclipse.xtext.ui.refactoring.ui.DefaultRenameElementHandler"
+ commandId="org.eclipse.xtext.ui.refactoring.RenameElement">
+ <activeWhen>
+ <reference
+ definitionId="org.eclipse.sensinact.studio.language.Sensinact.Editor.opened">
+ </reference>
+ </activeWhen>
+ </handler>
+ </extension>
+ <extension point="org.eclipse.ui.menus">
+ <menuContribution
+ locationURI="popup:#TextEditorContext?after=group.edit">
+ <command commandId="org.eclipse.xtext.ui.refactoring.RenameElement"
+ style="push">
+ <visibleWhen checkEnabled="false">
+ <reference
+ definitionId="org.eclipse.sensinact.studio.language.Sensinact.Editor.opened">
+ </reference>
+ </visibleWhen>
+ </command>
+ </menuContribution>
+ </extension>
+ <extension point="org.eclipse.ui.preferencePages">
+ <page
+ category="org.eclipse.sensinact.studio.language.Sensinact"
+ class="org.eclipse.sensinact.studio.language.ui.SensinactExecutableExtensionFactory:org.eclipse.xtext.ui.refactoring.ui.RefactoringPreferencePage"
+ id="org.eclipse.sensinact.studio.language.Sensinact.refactoring"
+ name="Refactoring">
+ <keywordReference id="org.eclipse.sensinact.studio.language.ui.keyword_Sensinact"/>
+ </page>
+ </extension>
+ <extension point="org.eclipse.compare.contentViewers">
+ <viewer id="org.eclipse.sensinact.studio.language.Sensinact.compare.contentViewers"
+ class="org.eclipse.sensinact.studio.language.ui.SensinactExecutableExtensionFactory:org.eclipse.xtext.ui.compare.InjectableViewerCreator"
+ extensions="sna">
+ </viewer>
+ </extension>
+ <extension point="org.eclipse.compare.contentMergeViewers">
+ <viewer id="org.eclipse.sensinact.studio.language.Sensinact.compare.contentMergeViewers"
+ class="org.eclipse.sensinact.studio.language.ui.SensinactExecutableExtensionFactory:org.eclipse.xtext.ui.compare.InjectableViewerCreator"
+ extensions="sna" label="Sensinact Compare">
+ </viewer>
+ </extension>
+ <extension point="org.eclipse.ui.editors.documentProviders">
+ <provider id="org.eclipse.sensinact.studio.language.Sensinact.editors.documentProviders"
+ class="org.eclipse.sensinact.studio.language.ui.SensinactExecutableExtensionFactory:org.eclipse.xtext.ui.editor.model.XtextDocumentProvider"
+ extensions="sna">
+ </provider>
+ </extension>
+ <extension point="org.eclipse.team.core.fileTypes">
+ <fileTypes
+ extension="sna"
+ type="text">
+ </fileTypes>
+ </extension>
+</plugin>
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/src-gen/org/eclipse/sensinact/studio/language/sensinact/ui/internal/SensinactActivator.java b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/src-gen/org/eclipse/sensinact/studio/language/sensinact/ui/internal/SensinactActivator.java
new file mode 100644
index 0000000..e3e7b59
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/src-gen/org/eclipse/sensinact/studio/language/sensinact/ui/internal/SensinactActivator.java
@@ -0,0 +1,103 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/*
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact.ui.internal;
+
+import com.google.common.collect.Maps;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import com.google.inject.Module;
+import java.util.Collections;
+import java.util.Map;
+import org.apache.log4j.Logger;
+import org.eclipse.sensinact.studio.language.SensinactRuntimeModule;
+import org.eclipse.sensinact.studio.language.ui.SensinactUiModule;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.eclipse.xtext.ui.shared.SharedStateModule;
+import org.eclipse.xtext.util.Modules2;
+import org.osgi.framework.BundleContext;
+
+/**
+ * This class was generated. Customizations should only happen in a newly
+ * introduced subclass.
+ */
+public class SensinactActivator extends AbstractUIPlugin {
+
+ public static final String ORG_ECLIPSE_SENSINACT_STUDIO_LANGUAGE_SENSINACT = "org.eclipse.sensinact.studio.language.Sensinact";
+
+ private static final Logger logger = Logger.getLogger(SensinactActivator.class);
+
+ private static SensinactActivator INSTANCE;
+
+ private Map<String, Injector> injectors = Collections.synchronizedMap(Maps.<String, Injector> newHashMapWithExpectedSize(1));
+
+ @Override
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ INSTANCE = this;
+ }
+
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ injectors.clear();
+ INSTANCE = null;
+ super.stop(context);
+ }
+
+ public static SensinactActivator getInstance() {
+ return INSTANCE;
+ }
+
+ public Injector getInjector(String language) {
+ synchronized (injectors) {
+ Injector injector = injectors.get(language);
+ if (injector == null) {
+ injectors.put(language, injector = createInjector(language));
+ }
+ return injector;
+ }
+ }
+
+ protected Injector createInjector(String language) {
+ try {
+ Module runtimeModule = getRuntimeModule(language);
+ Module sharedStateModule = getSharedStateModule();
+ Module uiModule = getUiModule(language);
+ Module mergedModule = Modules2.mixin(runtimeModule, sharedStateModule, uiModule);
+ return Guice.createInjector(mergedModule);
+ } catch (Exception e) {
+ logger.error("Failed to create injector for " + language);
+ logger.error(e.getMessage(), e);
+ throw new RuntimeException("Failed to create injector for " + language, e);
+ }
+ }
+
+ protected Module getRuntimeModule(String grammar) {
+ if (ORG_ECLIPSE_SENSINACT_STUDIO_LANGUAGE_SENSINACT.equals(grammar)) {
+ return new SensinactRuntimeModule();
+ }
+ throw new IllegalArgumentException(grammar);
+ }
+
+ protected Module getUiModule(String grammar) {
+ if (ORG_ECLIPSE_SENSINACT_STUDIO_LANGUAGE_SENSINACT.equals(grammar)) {
+ return new SensinactUiModule(this);
+ }
+ throw new IllegalArgumentException(grammar);
+ }
+
+ protected Module getSharedStateModule() {
+ return new SharedStateModule();
+ }
+
+}
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/src-gen/org/eclipse/sensinact/studio/language/ui/AbstractSensinactUiModule.java b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/src-gen/org/eclipse/sensinact/studio/language/ui/AbstractSensinactUiModule.java
new file mode 100644
index 0000000..861f9b3
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/src-gen/org/eclipse/sensinact/studio/language/ui/AbstractSensinactUiModule.java
@@ -0,0 +1,290 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/*
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.ui;
+
+import com.google.inject.Binder;
+import com.google.inject.Provider;
+import com.google.inject.name.Names;
+import org.eclipse.compare.IViewerCreator;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.sensinact.studio.language.ide.contentassist.antlr.PartialSensinactContentAssistParser;
+import org.eclipse.sensinact.studio.language.ide.contentassist.antlr.SensinactParser;
+import org.eclipse.sensinact.studio.language.ide.contentassist.antlr.internal.InternalSensinactLexer;
+import org.eclipse.sensinact.studio.language.ui.contentassist.SensinactProposalProvider;
+import org.eclipse.sensinact.studio.language.ui.labeling.SensinactDescriptionLabelProvider;
+import org.eclipse.sensinact.studio.language.ui.labeling.SensinactLabelProvider;
+import org.eclipse.sensinact.studio.language.ui.outline.SensinactOutlineTreeProvider;
+import org.eclipse.sensinact.studio.language.ui.quickfix.SensinactQuickfixProvider;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.eclipse.xtext.builder.BuilderParticipant;
+import org.eclipse.xtext.builder.EclipseOutputConfigurationProvider;
+import org.eclipse.xtext.builder.IXtextBuilderParticipant;
+import org.eclipse.xtext.builder.builderState.IBuilderState;
+import org.eclipse.xtext.builder.clustering.CurrentDescriptions;
+import org.eclipse.xtext.builder.impl.PersistentDataAwareDirtyResource;
+import org.eclipse.xtext.builder.nature.NatureAddingEditorCallback;
+import org.eclipse.xtext.builder.preferences.BuilderPreferenceAccess;
+import org.eclipse.xtext.generator.IContextualOutputConfigurationProvider;
+import org.eclipse.xtext.ide.LexerIdeBindings;
+import org.eclipse.xtext.ide.editor.contentassist.antlr.IContentAssistParser;
+import org.eclipse.xtext.ide.editor.contentassist.antlr.internal.Lexer;
+import org.eclipse.xtext.ide.editor.partialEditing.IPartialEditingContentAssistParser;
+import org.eclipse.xtext.parser.antlr.AntlrTokenDefProvider;
+import org.eclipse.xtext.parser.antlr.ITokenDefProvider;
+import org.eclipse.xtext.parser.antlr.LexerProvider;
+import org.eclipse.xtext.resource.IResourceDescriptions;
+import org.eclipse.xtext.resource.containers.IAllContainersState;
+import org.eclipse.xtext.resource.impl.ResourceDescriptionsProvider;
+import org.eclipse.xtext.service.SingletonBinding;
+import org.eclipse.xtext.ui.DefaultUiModule;
+import org.eclipse.xtext.ui.codetemplates.ui.AccessibleCodetemplatesActivator;
+import org.eclipse.xtext.ui.codetemplates.ui.partialEditing.IPartialEditingContentAssistContextFactory;
+import org.eclipse.xtext.ui.codetemplates.ui.partialEditing.PartialEditingContentAssistContextFactory;
+import org.eclipse.xtext.ui.codetemplates.ui.preferences.AdvancedTemplatesPreferencePage;
+import org.eclipse.xtext.ui.codetemplates.ui.preferences.TemplatesLanguageConfiguration;
+import org.eclipse.xtext.ui.codetemplates.ui.registry.LanguageRegistrar;
+import org.eclipse.xtext.ui.codetemplates.ui.registry.LanguageRegistry;
+import org.eclipse.xtext.ui.compare.DefaultViewerCreator;
+import org.eclipse.xtext.ui.editor.DocumentBasedDirtyResource;
+import org.eclipse.xtext.ui.editor.IXtextEditorCallback;
+import org.eclipse.xtext.ui.editor.contentassist.ContentAssistContext;
+import org.eclipse.xtext.ui.editor.contentassist.FQNPrefixMatcher;
+import org.eclipse.xtext.ui.editor.contentassist.IContentProposalProvider;
+import org.eclipse.xtext.ui.editor.contentassist.IProposalConflictHelper;
+import org.eclipse.xtext.ui.editor.contentassist.PrefixMatcher;
+import org.eclipse.xtext.ui.editor.contentassist.antlr.AntlrProposalConflictHelper;
+import org.eclipse.xtext.ui.editor.contentassist.antlr.DelegatingContentAssistContextFactory;
+import org.eclipse.xtext.ui.editor.outline.IOutlineTreeProvider;
+import org.eclipse.xtext.ui.editor.outline.impl.IOutlineTreeStructureProvider;
+import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreInitializer;
+import org.eclipse.xtext.ui.editor.quickfix.IssueResolutionProvider;
+import org.eclipse.xtext.ui.editor.templates.XtextTemplatePreferencePage;
+import org.eclipse.xtext.ui.refactoring.IDependentElementsCalculator;
+import org.eclipse.xtext.ui.refactoring.IReferenceUpdater;
+import org.eclipse.xtext.ui.refactoring.IRenameRefactoringProvider;
+import org.eclipse.xtext.ui.refactoring.IRenameStrategy;
+import org.eclipse.xtext.ui.refactoring.impl.DefaultDependentElementsCalculator;
+import org.eclipse.xtext.ui.refactoring.impl.DefaultReferenceUpdater;
+import org.eclipse.xtext.ui.refactoring.impl.DefaultRenameRefactoringProvider;
+import org.eclipse.xtext.ui.refactoring.impl.DefaultRenameStrategy;
+import org.eclipse.xtext.ui.refactoring.ui.DefaultRenameSupport;
+import org.eclipse.xtext.ui.refactoring.ui.IRenameSupport;
+import org.eclipse.xtext.ui.refactoring.ui.RefactoringPreferences;
+import org.eclipse.xtext.ui.resource.ResourceServiceDescriptionLabelProvider;
+import org.eclipse.xtext.ui.shared.Access;
+
+/**
+ * Manual modifications go to {@link SensinactUiModule}.
+ */
+@SuppressWarnings("all")
+public abstract class AbstractSensinactUiModule extends DefaultUiModule {
+
+ public AbstractSensinactUiModule(AbstractUIPlugin plugin) {
+ super(plugin);
+ }
+
+ // contributed by org.eclipse.xtext.xtext.generator.ImplicitFragment
+ public Provider<IAllContainersState> provideIAllContainersState() {
+ return Access.getJavaProjectsState();
+ }
+
+ // contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+ public Class<? extends IProposalConflictHelper> bindIProposalConflictHelper() {
+ return AntlrProposalConflictHelper.class;
+ }
+
+ // contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+ public void configureContentAssistLexer(Binder binder) {
+ binder.bind(Lexer.class)
+ .annotatedWith(Names.named(LexerIdeBindings.CONTENT_ASSIST))
+ .to(InternalSensinactLexer.class);
+ }
+
+ // contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+ public void configureHighlightingLexer(Binder binder) {
+ binder.bind(org.eclipse.xtext.parser.antlr.Lexer.class)
+ .annotatedWith(Names.named(LexerIdeBindings.HIGHLIGHTING))
+ .to(org.eclipse.sensinact.studio.language.parser.antlr.internal.InternalSensinactLexer.class);
+ }
+
+ // contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+ public void configureHighlightingTokenDefProvider(Binder binder) {
+ binder.bind(ITokenDefProvider.class)
+ .annotatedWith(Names.named(LexerIdeBindings.HIGHLIGHTING))
+ .to(AntlrTokenDefProvider.class);
+ }
+
+ // contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+ public Class<? extends ContentAssistContext.Factory> bindContentAssistContext$Factory() {
+ return DelegatingContentAssistContextFactory.class;
+ }
+
+ // contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+ public Class<? extends IContentAssistParser> bindIContentAssistParser() {
+ return SensinactParser.class;
+ }
+
+ // contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+ public void configureContentAssistLexerProvider(Binder binder) {
+ binder.bind(InternalSensinactLexer.class).toProvider(LexerProvider.create(InternalSensinactLexer.class));
+ }
+
+ // contributed by org.eclipse.xtext.xtext.generator.exporting.QualifiedNamesFragment2
+ public Class<? extends PrefixMatcher> bindPrefixMatcher() {
+ return FQNPrefixMatcher.class;
+ }
+
+ // contributed by org.eclipse.xtext.xtext.generator.exporting.QualifiedNamesFragment2
+ public Class<? extends IDependentElementsCalculator> bindIDependentElementsCalculator() {
+ return DefaultDependentElementsCalculator.class;
+ }
+
+ // contributed by org.eclipse.xtext.xtext.generator.builder.BuilderIntegrationFragment2
+ public void configureIResourceDescriptionsBuilderScope(Binder binder) {
+ binder.bind(IResourceDescriptions.class).annotatedWith(Names.named(ResourceDescriptionsProvider.NAMED_BUILDER_SCOPE)).to(CurrentDescriptions.ResourceSetAware.class);
+ }
+
+ // contributed by org.eclipse.xtext.xtext.generator.builder.BuilderIntegrationFragment2
+ public Class<? extends IXtextEditorCallback> bindIXtextEditorCallback() {
+ return NatureAddingEditorCallback.class;
+ }
+
+ // contributed by org.eclipse.xtext.xtext.generator.builder.BuilderIntegrationFragment2
+ public Class<? extends IContextualOutputConfigurationProvider> bindIContextualOutputConfigurationProvider() {
+ return EclipseOutputConfigurationProvider.class;
+ }
+
+ // contributed by org.eclipse.xtext.xtext.generator.builder.BuilderIntegrationFragment2
+ public void configureIResourceDescriptionsPersisted(Binder binder) {
+ binder.bind(IResourceDescriptions.class).annotatedWith(Names.named(ResourceDescriptionsProvider.PERSISTED_DESCRIPTIONS)).to(IBuilderState.class);
+ }
+
+ // contributed by org.eclipse.xtext.xtext.generator.builder.BuilderIntegrationFragment2
+ public Class<? extends DocumentBasedDirtyResource> bindDocumentBasedDirtyResource() {
+ return PersistentDataAwareDirtyResource.class;
+ }
+
+ // contributed by org.eclipse.xtext.xtext.generator.generator.GeneratorFragment2
+ public Class<? extends IXtextBuilderParticipant> bindIXtextBuilderParticipant() {
+ return BuilderParticipant.class;
+ }
+
+ // contributed by org.eclipse.xtext.xtext.generator.generator.GeneratorFragment2
+ public IWorkspaceRoot bindIWorkspaceRootToInstance() {
+ return ResourcesPlugin.getWorkspace().getRoot();
+ }
+
+ // contributed by org.eclipse.xtext.xtext.generator.generator.GeneratorFragment2
+ public void configureBuilderPreferenceStoreInitializer(Binder binder) {
+ binder.bind(IPreferenceStoreInitializer.class)
+ .annotatedWith(Names.named("builderPreferenceInitializer"))
+ .to(BuilderPreferenceAccess.Initializer.class);
+ }
+
+ // contributed by org.eclipse.xtext.xtext.generator.ui.labeling.LabelProviderFragment2
+ public Class<? extends ILabelProvider> bindILabelProvider() {
+ return SensinactLabelProvider.class;
+ }
+
+ // contributed by org.eclipse.xtext.xtext.generator.ui.labeling.LabelProviderFragment2
+ public void configureResourceUIServiceLabelProvider(Binder binder) {
+ binder.bind(ILabelProvider.class).annotatedWith(ResourceServiceDescriptionLabelProvider.class).to(SensinactDescriptionLabelProvider.class);
+ }
+
+ // contributed by org.eclipse.xtext.xtext.generator.ui.outline.OutlineTreeProviderFragment2
+ public Class<? extends IOutlineTreeProvider> bindIOutlineTreeProvider() {
+ return SensinactOutlineTreeProvider.class;
+ }
+
+ // contributed by org.eclipse.xtext.xtext.generator.ui.outline.OutlineTreeProviderFragment2
+ public Class<? extends IOutlineTreeStructureProvider> bindIOutlineTreeStructureProvider() {
+ return SensinactOutlineTreeProvider.class;
+ }
+
+ // contributed by org.eclipse.xtext.xtext.generator.ui.quickfix.QuickfixProviderFragment2
+ public Class<? extends IssueResolutionProvider> bindIssueResolutionProvider() {
+ return SensinactQuickfixProvider.class;
+ }
+
+ // contributed by org.eclipse.xtext.xtext.generator.ui.contentAssist.ContentAssistFragment2
+ public Class<? extends IContentProposalProvider> bindIContentProposalProvider() {
+ return SensinactProposalProvider.class;
+ }
+
+ // contributed by org.eclipse.xtext.xtext.generator.ui.refactoring.RefactorElementNameFragment2
+ public Class<? extends IRenameStrategy> bindIRenameStrategy() {
+ return DefaultRenameStrategy.class;
+ }
+
+ // contributed by org.eclipse.xtext.xtext.generator.ui.refactoring.RefactorElementNameFragment2
+ public Class<? extends IReferenceUpdater> bindIReferenceUpdater() {
+ return DefaultReferenceUpdater.class;
+ }
+
+ // contributed by org.eclipse.xtext.xtext.generator.ui.refactoring.RefactorElementNameFragment2
+ public void configureIPreferenceStoreInitializer(Binder binder) {
+ binder.bind(IPreferenceStoreInitializer.class)
+ .annotatedWith(Names.named("RefactoringPreferences"))
+ .to(RefactoringPreferences.Initializer.class);
+ }
+
+ // contributed by org.eclipse.xtext.xtext.generator.ui.refactoring.RefactorElementNameFragment2
+ public Class<? extends IRenameRefactoringProvider> bindIRenameRefactoringProvider() {
+ return DefaultRenameRefactoringProvider.class;
+ }
+
+ // contributed by org.eclipse.xtext.xtext.generator.ui.refactoring.RefactorElementNameFragment2
+ public Class<? extends IRenameSupport.Factory> bindIRenameSupport$Factory() {
+ return DefaultRenameSupport.Factory.class;
+ }
+
+ // contributed by org.eclipse.xtext.xtext.generator.ui.templates.CodetemplatesGeneratorFragment2
+ public Provider<TemplatesLanguageConfiguration> provideTemplatesLanguageConfiguration() {
+ return AccessibleCodetemplatesActivator.getTemplatesLanguageConfigurationProvider();
+ }
+
+ // contributed by org.eclipse.xtext.xtext.generator.ui.templates.CodetemplatesGeneratorFragment2
+ public Provider<LanguageRegistry> provideLanguageRegistry() {
+ return AccessibleCodetemplatesActivator.getLanguageRegistry();
+ }
+
+ // contributed by org.eclipse.xtext.xtext.generator.ui.templates.CodetemplatesGeneratorFragment2
+ @SingletonBinding(eager=true)
+ public Class<? extends LanguageRegistrar> bindLanguageRegistrar() {
+ return LanguageRegistrar.class;
+ }
+
+ // contributed by org.eclipse.xtext.xtext.generator.ui.templates.CodetemplatesGeneratorFragment2
+ public Class<? extends XtextTemplatePreferencePage> bindXtextTemplatePreferencePage() {
+ return AdvancedTemplatesPreferencePage.class;
+ }
+
+ // contributed by org.eclipse.xtext.xtext.generator.ui.templates.CodetemplatesGeneratorFragment2
+ public Class<? extends IPartialEditingContentAssistParser> bindIPartialEditingContentAssistParser() {
+ return PartialSensinactContentAssistParser.class;
+ }
+
+ // contributed by org.eclipse.xtext.xtext.generator.ui.templates.CodetemplatesGeneratorFragment2
+ public Class<? extends IPartialEditingContentAssistContextFactory> bindIPartialEditingContentAssistContextFactory() {
+ return PartialEditingContentAssistContextFactory.class;
+ }
+
+ // contributed by org.eclipse.xtext.xtext.generator.ui.compare.CompareFragment2
+ public Class<? extends IViewerCreator> bindIViewerCreator() {
+ return DefaultViewerCreator.class;
+ }
+
+}
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/src-gen/org/eclipse/sensinact/studio/language/ui/SensinactExecutableExtensionFactory.java b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/src-gen/org/eclipse/sensinact/studio/language/ui/SensinactExecutableExtensionFactory.java
new file mode 100644
index 0000000..a7652db
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/src-gen/org/eclipse/sensinact/studio/language/ui/SensinactExecutableExtensionFactory.java
@@ -0,0 +1,37 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/*
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.ui;
+
+import com.google.inject.Injector;
+import org.eclipse.sensinact.studio.language.sensinact.ui.internal.SensinactActivator;
+import org.eclipse.xtext.ui.guice.AbstractGuiceAwareExecutableExtensionFactory;
+import org.osgi.framework.Bundle;
+
+/**
+ * This class was generated. Customizations should only happen in a newly
+ * introduced subclass.
+ */
+public class SensinactExecutableExtensionFactory extends AbstractGuiceAwareExecutableExtensionFactory {
+
+ @Override
+ protected Bundle getBundle() {
+ return SensinactActivator.getInstance().getBundle();
+ }
+
+ @Override
+ protected Injector getInjector() {
+ return SensinactActivator.getInstance().getInjector(SensinactActivator.ORG_ECLIPSE_SENSINACT_STUDIO_LANGUAGE_SENSINACT);
+ }
+
+}
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/src-gen/org/eclipse/sensinact/studio/language/ui/contentassist/AbstractSensinactProposalProvider.java b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/src-gen/org/eclipse/sensinact/studio/language/ui/contentassist/AbstractSensinactProposalProvider.java
new file mode 100644
index 0000000..c5bec64
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/src-gen/org/eclipse/sensinact/studio/language/ui/contentassist/AbstractSensinactProposalProvider.java
@@ -0,0 +1,338 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/*
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.ui.contentassist;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.xtext.Alternatives;
+import org.eclipse.xtext.Assignment;
+import org.eclipse.xtext.CrossReference;
+import org.eclipse.xtext.RuleCall;
+import org.eclipse.xtext.common.ui.contentassist.TerminalsProposalProvider;
+import org.eclipse.xtext.ui.editor.contentassist.ContentAssistContext;
+import org.eclipse.xtext.ui.editor.contentassist.ICompletionProposalAcceptor;
+
+/**
+ * Represents a generated, default implementation of superclass {@link TerminalsProposalProvider}.
+ * Methods are dynamically dispatched on the first parameter, i.e., you can override them
+ * with a more concrete subtype.
+ */
+public abstract class AbstractSensinactProposalProvider extends TerminalsProposalProvider {
+
+ public void completeSensinact_Eca(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+ }
+ public void completeDSL_SENSINACT_Resources(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+ }
+ public void completeDSL_SENSINACT_Cep(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+ }
+ public void completeDSL_SENSINACT_On(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+ }
+ public void completeDSL_SENSINACT_Eca(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+ }
+ public void completeDSL_Resource_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+ }
+ public void completeDSL_Resource_GatewayID(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+ }
+ public void completeDSL_Resource_DeviceID(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+ }
+ public void completeDSL_Resource_ServiceID(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+ }
+ public void completeDSL_Resource_ResourceID(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+ }
+ public void completeDSL_On_Triggers(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+ }
+ public void completeDSL_ECA_STATEMENT_Ifdo(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+ }
+ public void completeDSL_ECA_STATEMENT_ElseIfdo(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+ }
+ public void completeDSL_ECA_STATEMENT_Elsedo(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+ }
+ public void completeDSL_IfDo_Condition(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+ }
+ public void completeDSL_IfDo_Actions(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+ }
+ public void completeDSL_ElseIfDo_Condition(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+ }
+ public void completeDSL_ElseIfDo_Actions(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+ }
+ public void completeDSL_ElseDo_Actions(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+ }
+ public void completeDSL_REF_CONDITION_Ref(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+ }
+ public void completeDSL_CEP_STATEMENT_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+ }
+ public void completeDSL_CEP_STATEMENT_Operation(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ completeRuleCall(((RuleCall)((Alternatives)assignment.getTerminal()).getElements().get(0)), context, acceptor);
+ completeRuleCall(((RuleCall)((Alternatives)assignment.getTerminal()).getElements().get(1)), context, acceptor);
+ completeRuleCall(((RuleCall)((Alternatives)assignment.getTerminal()).getElements().get(2)), context, acceptor);
+ completeRuleCall(((RuleCall)((Alternatives)assignment.getTerminal()).getElements().get(3)), context, acceptor);
+ completeRuleCall(((RuleCall)((Alternatives)assignment.getTerminal()).getElements().get(4)), context, acceptor);
+ completeRuleCall(((RuleCall)((Alternatives)assignment.getTerminal()).getElements().get(5)), context, acceptor);
+ completeRuleCall(((RuleCall)((Alternatives)assignment.getTerminal()).getElements().get(6)), context, acceptor);
+ completeRuleCall(((RuleCall)((Alternatives)assignment.getTerminal()).getElements().get(7)), context, acceptor);
+ }
+ public void completeDSL_CEP_AFTER_Ref1(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+ }
+ public void completeDSL_CEP_AFTER_Ref2(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+ }
+ public void completeDSL_CEP_AFTER_Start(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+ }
+ public void completeDSL_CEP_AFTER_End(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+ }
+ public void completeDSL_CEP_BEFORE_Ref1(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+ }
+ public void completeDSL_CEP_BEFORE_Ref2(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+ }
+ public void completeDSL_CEP_BEFORE_Start(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+ }
+ public void completeDSL_CEP_BEFORE_End(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+ }
+ public void completeDSL_CEP_COINCIDE_Ref1(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+ }
+ public void completeDSL_CEP_COINCIDE_Ref2(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+ }
+ public void completeDSL_CEP_COINCIDE_Window(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+ }
+ public void completeDSL_CEP_MIN_Ref(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+ }
+ public void completeDSL_CEP_MIN_Window(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+ }
+ public void completeDSL_CEP_MAX_Ref(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+ }
+ public void completeDSL_CEP_MAX_Window(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+ }
+ public void completeDSL_CEP_AVG_Ref(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+ }
+ public void completeDSL_CEP_AVG_Window(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+ }
+ public void completeDSL_CEP_SUM_Ref(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+ }
+ public void completeDSL_CEP_SUM_Window(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+ }
+ public void completeDSL_CEP_COUNT_Ref(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+ }
+ public void completeDSL_CEP_COUNT_Window(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+ }
+ public void completeDSL_CEP_DURATION_Units(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ completeRuleCall(((RuleCall)((Alternatives)assignment.getTerminal()).getElements().get(0)), context, acceptor);
+ completeRuleCall(((RuleCall)((Alternatives)assignment.getTerminal()).getElements().get(1)), context, acceptor);
+ }
+ public void completeDSL_CEP_DURATION_MIN_Min(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+ }
+ public void completeDSL_CEP_DURATION_SEC_Sec(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+ }
+ public void completeDSL_ListActions_ActionList(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+ }
+ public void completeDSL_ResourceAction_Variable(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+ }
+ public void completeDSL_ResourceAction_Ref(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+ }
+ public void completeDSL_ResourceAction_Actiontype(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ // subclasses may override
+ // subclasses may override
+ }
+ public void completeDSL_ResourceAction_ListParam(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+ }
+ public void completeDSL_ListParam_Param(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+ }
+ public void completeDSL_Expression_Or_Right(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+ }
+ public void completeDSL_Expression_And_Right(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+ }
+ public void completeDSL_Expression_DiffEqual_Right(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+ }
+ public void completeDSL_Expression_Compare_Right(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+ }
+ public void completeDSL_Expression_PlusMinus_Right(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+ }
+ public void completeDSL_Expression_MultiplicationDivision_Right(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+ }
+ public void completeDSL_Expression_Unary_Value(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ if (assignment.getTerminal() instanceof RuleCall) {
+ completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+ }
+ if (assignment.getTerminal() instanceof CrossReference) {
+ lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+ }
+ }
+ public void completeDSL_Expression_Unary_Exp(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+ }
+
+ public void complete_Sensinact(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ // subclasses may override
+ }
+ public void complete_DSL_SENSINACT(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ // subclasses may override
+ }
+ public void complete_DSL_Resource(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ // subclasses may override
+ }
+ public void complete_DSL_On(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ // subclasses may override
+ }
+ public void complete_DSL_ECA_STATEMENT(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ // subclasses may override
+ }
+ public void complete_DSL_IfDo(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ // subclasses may override
+ }
+ public void complete_DSL_ElseIfDo(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ // subclasses may override
+ }
+ public void complete_DSL_ElseDo(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ // subclasses may override
+ }
+ public void complete_BOOLEAN(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ // subclasses may override
+ }
+ public void complete_INT(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ // subclasses may override
+ }
+ public void complete_NUMBER(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ // subclasses may override
+ }
+ public void complete_ID(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ // subclasses may override
+ }
+ public void complete_EXTENDED_ID(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ // subclasses may override
+ }
+ public void complete_DSL_REF(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ // subclasses may override
+ }
+ public void complete_DSL_REF_CONDITION(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ // subclasses may override
+ }
+ public void complete_DSL_CEP_STATEMENT(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ // subclasses may override
+ }
+ public void complete_DSL_CEP_AFTER(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ // subclasses may override
+ }
+ public void complete_DSL_CEP_BEFORE(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ // subclasses may override
+ }
+ public void complete_DSL_CEP_COINCIDE(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ // subclasses may override
+ }
+ public void complete_DSL_CEP_MIN(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ // subclasses may override
+ }
+ public void complete_DSL_CEP_MAX(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ // subclasses may override
+ }
+ public void complete_DSL_CEP_AVG(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ // subclasses may override
+ }
+ public void complete_DSL_CEP_SUM(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ // subclasses may override
+ }
+ public void complete_DSL_CEP_COUNT(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ // subclasses may override
+ }
+ public void complete_DSL_CEP_DURATION(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ // subclasses may override
+ }
+ public void complete_DSL_CEP_DURATION_MIN(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ // subclasses may override
+ }
+ public void complete_DSL_CEP_DURATION_SEC(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ // subclasses may override
+ }
+ public void complete_DSL_ListActions(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ // subclasses may override
+ }
+ public void complete_DSL_ResourceAction(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ // subclasses may override
+ }
+ public void complete_DSL_ListParam(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ // subclasses may override
+ }
+ public void complete_DSL_Expression_Or(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ // subclasses may override
+ }
+ public void complete_DSL_Expression_And(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ // subclasses may override
+ }
+ public void complete_DSL_Expression_DiffEqual(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ // subclasses may override
+ }
+ public void complete_DSL_Expression_Compare(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ // subclasses may override
+ }
+ public void complete_DSL_Expression_PlusMinus(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ // subclasses may override
+ }
+ public void complete_DSL_Expression_MultiplicationDivision(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ // subclasses may override
+ }
+ public void complete_DSL_Expression_Unary(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+ // subclasses may override
+ }
+}
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/src/org/eclipse/sensinact/studio/language/ui/SensinactUiModule.xtend b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/src/org/eclipse/sensinact/studio/language/ui/SensinactUiModule.xtend
new file mode 100644
index 0000000..08f9cec
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/src/org/eclipse/sensinact/studio/language/ui/SensinactUiModule.xtend
@@ -0,0 +1,23 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/*
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.ui
+
+import org.eclipse.xtend.lib.annotations.FinalFieldsConstructor
+
+/**
+ * Use this class to register components to be used within the Eclipse IDE.
+ */
+@FinalFieldsConstructor
+class SensinactUiModule extends AbstractSensinactUiModule {
+}
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/src/org/eclipse/sensinact/studio/language/ui/contentassist/NullGlobalScopeProvider.xtend b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/src/org/eclipse/sensinact/studio/language/ui/contentassist/NullGlobalScopeProvider.xtend
new file mode 100644
index 0000000..6ce131a
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/src/org/eclipse/sensinact/studio/language/ui/contentassist/NullGlobalScopeProvider.xtend
@@ -0,0 +1,26 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.language.ui.contentassist
+
+import org.eclipse.emf.ecore.EReference
+import org.eclipse.xtext.scoping.IScope
+import org.eclipse.xtext.scoping.IScopeProvider
+import org.eclipse.emf.ecore.EObject
+
+/**
+ * This scope erase ALL available cross references.
+ */
+class NullGlobalScopeProvider implements IScopeProvider {
+
+ override getScope(EObject context, EReference reference) {
+ return IScope.NULLSCOPE;
+ }
+}
\ No newline at end of file
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/src/org/eclipse/sensinact/studio/language/ui/contentassist/SensinactProposalProvider.xtend b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/src/org/eclipse/sensinact/studio/language/ui/contentassist/SensinactProposalProvider.xtend
new file mode 100644
index 0000000..13d4f3a
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/src/org/eclipse/sensinact/studio/language/ui/contentassist/SensinactProposalProvider.xtend
@@ -0,0 +1,70 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.language.ui.contentassist
+
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Resource
+import org.eclipse.sensinact.studio.model.manager.modelupdater.ModelEditor
+import org.eclipse.emf.ecore.EObject
+import org.eclipse.xtext.Assignment
+import org.eclipse.xtext.RuleCall
+import org.eclipse.xtext.ui.editor.contentassist.ContentAssistContext
+import org.eclipse.xtext.ui.editor.contentassist.ICompletionProposalAcceptor
+import org.eclipse.sensinact.studio.model.manager.modelupdater.ModelUpdater
+
+/**
+ * @author Etienne Gandrille
+ */
+class SensinactProposalProvider extends AbstractSensinactProposalProvider {
+
+ override complete_EXTENDED_ID(EObject model, RuleCall ruleCall, ContentAssistContext context,
+ ICompletionProposalAcceptor acceptor) {
+
+ var rsrc = model as DSL_Resource;
+ var gatewayID = rsrc.gatewayID;
+ var deviceID = rsrc.deviceID;
+ var serviceID = rsrc.serviceID;
+
+ var container = ruleCall.eContainer as Assignment;
+ var feature = container.feature;
+
+ // gateway completion
+ if ("gatewayID".equals(feature)) {
+ var candidates = ModelEditor.getInstance().getGatewaysId;
+ for (candidate : candidates) {
+ acceptor.accept(createCompletionProposal(candidate + "/", context));
+ }
+ }
+
+ // device completion
+ if ("deviceID".equals(feature)) {
+ var candidates = ModelEditor.getInstance().getDevicesId(gatewayID);
+ for (candidate : candidates) {
+ acceptor.accept(createCompletionProposal(candidate + "/", context));
+ }
+ } // service completion
+ else if ("serviceID".equals(feature)) {
+ // Ensure to fetch the info during the code completion
+ ModelUpdater.getInstance().updateServices(gatewayID, deviceID);
+
+ var candidates = ModelEditor.getInstance().getServicesId(gatewayID, deviceID);
+ for (candidate : candidates) {
+ acceptor.accept(createCompletionProposal(candidate + "/", context));
+ }
+ } // resource completion
+ else if ("resourceID".equals(feature)) {
+ ModelUpdater.getInstance().updateResources(gatewayID, deviceID, serviceID);
+ var candidates = ModelEditor.getInstance().getResourcesId(gatewayID, deviceID, serviceID);
+ for (candidate : candidates) {
+ acceptor.accept(createCompletionProposal(candidate, context));
+ }
+ }
+ }
+}
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/src/org/eclipse/sensinact/studio/language/ui/labeling/SensinactDescriptionLabelProvider.xtend b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/src/org/eclipse/sensinact/studio/language/ui/labeling/SensinactDescriptionLabelProvider.xtend
new file mode 100644
index 0000000..22d1561
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/src/org/eclipse/sensinact/studio/language/ui/labeling/SensinactDescriptionLabelProvider.xtend
@@ -0,0 +1,34 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/*
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.ui.labeling
+
+import org.eclipse.xtext.ui.label.DefaultDescriptionLabelProvider
+
+/**
+ * Provides labels for IEObjectDescriptions and IResourceDescriptions.
+ *
+ * See https://www.eclipse.org/Xtext/documentation/304_ide_concepts.html#label-provider
+ */
+class SensinactDescriptionLabelProvider extends DefaultDescriptionLabelProvider {
+
+ // Labels and icons can be computed like this:
+
+// override text(IEObjectDescription ele) {
+// ele.name.toString
+// }
+//
+// override image(IEObjectDescription ele) {
+// ele.EClass.name + '.gif'
+// }
+}
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/src/org/eclipse/sensinact/studio/language/ui/labeling/SensinactLabelProvider.xtend b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/src/org/eclipse/sensinact/studio/language/ui/labeling/SensinactLabelProvider.xtend
new file mode 100644
index 0000000..1bd8d3d
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/src/org/eclipse/sensinact/studio/language/ui/labeling/SensinactLabelProvider.xtend
@@ -0,0 +1,41 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/*
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.ui.labeling
+
+import com.google.inject.Inject
+import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider
+import org.eclipse.xtext.ui.label.DefaultEObjectLabelProvider
+
+/**
+ * Provides labels for EObjects.
+ *
+ * See https://www.eclipse.org/Xtext/documentation/304_ide_concepts.html#label-provider
+ */
+class SensinactLabelProvider extends DefaultEObjectLabelProvider {
+
+ @Inject
+ new(AdapterFactoryLabelProvider delegate) {
+ super(delegate);
+ }
+
+ // Labels and icons can be computed like this:
+
+// def text(Greeting ele) {
+// 'A greeting to ' + ele.name
+// }
+//
+// def image(Greeting ele) {
+// 'Greeting.gif'
+// }
+}
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/src/org/eclipse/sensinact/studio/language/ui/outline/SensinactOutlineTreeProvider.xtend b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/src/org/eclipse/sensinact/studio/language/ui/outline/SensinactOutlineTreeProvider.xtend
new file mode 100644
index 0000000..6838621
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/src/org/eclipse/sensinact/studio/language/ui/outline/SensinactOutlineTreeProvider.xtend
@@ -0,0 +1,25 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/*
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.ui.outline
+
+import org.eclipse.xtext.ui.editor.outline.impl.DefaultOutlineTreeProvider
+
+/**
+ * Customization of the default outline structure.
+ *
+ * See https://www.eclipse.org/Xtext/documentation/304_ide_concepts.html#outline
+ */
+class SensinactOutlineTreeProvider extends DefaultOutlineTreeProvider {
+
+}
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/src/org/eclipse/sensinact/studio/language/ui/quickfix/SensinactQuickfixProvider.xtend b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/src/org/eclipse/sensinact/studio/language/ui/quickfix/SensinactQuickfixProvider.xtend
new file mode 100644
index 0000000..baa9699
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/src/org/eclipse/sensinact/studio/language/ui/quickfix/SensinactQuickfixProvider.xtend
@@ -0,0 +1,34 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/*
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.ui.quickfix
+
+import org.eclipse.xtext.ui.editor.quickfix.DefaultQuickfixProvider
+
+/**
+ * Custom quickfixes.
+ *
+ * See https://www.eclipse.org/Xtext/documentation/304_ide_concepts.html#quick-fixes
+ */
+class SensinactQuickfixProvider extends DefaultQuickfixProvider {
+
+// @Fix(SensinactValidator.INVALID_NAME)
+// def capitalizeName(Issue issue, IssueResolutionAcceptor acceptor) {
+// acceptor.accept(issue, 'Capitalize name', 'Capitalize the name.', 'upcase.png') [
+// context |
+// val xtextDocument = context.xtextDocument
+// val firstLetter = xtextDocument.get(issue.offset, 1)
+// xtextDocument.replace(issue.offset, 1, firstLetter.toUpperCase)
+// ]
+// }
+}
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/xtend-gen/org/eclipse/sensinact/studio/language/ui/.SensinactUiModule.java._trace b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/xtend-gen/org/eclipse/sensinact/studio/language/ui/.SensinactUiModule.java._trace
new file mode 100644
index 0000000..0662373
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/xtend-gen/org/eclipse/sensinact/studio/language/ui/.SensinactUiModule.java._trace
Binary files differ
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/xtend-gen/org/eclipse/sensinact/studio/language/ui/.SensinactUiModule.xtendbin b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/xtend-gen/org/eclipse/sensinact/studio/language/ui/.SensinactUiModule.xtendbin
new file mode 100644
index 0000000..94c304d
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/xtend-gen/org/eclipse/sensinact/studio/language/ui/.SensinactUiModule.xtendbin
Binary files differ
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/xtend-gen/org/eclipse/sensinact/studio/language/ui/SensinactUiModule.java b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/xtend-gen/org/eclipse/sensinact/studio/language/ui/SensinactUiModule.java
new file mode 100644
index 0000000..6a4e884
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/xtend-gen/org/eclipse/sensinact/studio/language/ui/SensinactUiModule.java
@@ -0,0 +1,26 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.language.ui;
+
+import org.eclipse.sensinact.studio.language.ui.AbstractSensinactUiModule;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.eclipse.xtend.lib.annotations.FinalFieldsConstructor;
+
+/**
+ * Use this class to register components to be used within the Eclipse IDE.
+ */
+@FinalFieldsConstructor
+@SuppressWarnings("all")
+public class SensinactUiModule extends AbstractSensinactUiModule {
+ public SensinactUiModule(final AbstractUIPlugin plugin) {
+ super(plugin);
+ }
+}
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/xtend-gen/org/eclipse/sensinact/studio/language/ui/contentassist/.NullGlobalScopeProvider.java._trace b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/xtend-gen/org/eclipse/sensinact/studio/language/ui/contentassist/.NullGlobalScopeProvider.java._trace
new file mode 100644
index 0000000..dccd8a0
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/xtend-gen/org/eclipse/sensinact/studio/language/ui/contentassist/.NullGlobalScopeProvider.java._trace
Binary files differ
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/xtend-gen/org/eclipse/sensinact/studio/language/ui/contentassist/.NullGlobalScopeProvider.xtendbin b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/xtend-gen/org/eclipse/sensinact/studio/language/ui/contentassist/.NullGlobalScopeProvider.xtendbin
new file mode 100644
index 0000000..4b6c082
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/xtend-gen/org/eclipse/sensinact/studio/language/ui/contentassist/.NullGlobalScopeProvider.xtendbin
Binary files differ
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/xtend-gen/org/eclipse/sensinact/studio/language/ui/contentassist/.SensinactProposalProvider.java._trace b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/xtend-gen/org/eclipse/sensinact/studio/language/ui/contentassist/.SensinactProposalProvider.java._trace
new file mode 100644
index 0000000..a78188f
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/xtend-gen/org/eclipse/sensinact/studio/language/ui/contentassist/.SensinactProposalProvider.java._trace
Binary files differ
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/xtend-gen/org/eclipse/sensinact/studio/language/ui/contentassist/.SensinactProposalProvider.xtendbin b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/xtend-gen/org/eclipse/sensinact/studio/language/ui/contentassist/.SensinactProposalProvider.xtendbin
new file mode 100644
index 0000000..08deba1
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/xtend-gen/org/eclipse/sensinact/studio/language/ui/contentassist/.SensinactProposalProvider.xtendbin
Binary files differ
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/xtend-gen/org/eclipse/sensinact/studio/language/ui/contentassist/NullGlobalScopeProvider.java b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/xtend-gen/org/eclipse/sensinact/studio/language/ui/contentassist/NullGlobalScopeProvider.java
new file mode 100644
index 0000000..cb10641
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/xtend-gen/org/eclipse/sensinact/studio/language/ui/contentassist/NullGlobalScopeProvider.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.language.ui.contentassist;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.xtext.scoping.IScope;
+import org.eclipse.xtext.scoping.IScopeProvider;
+
+/**
+ * This scope erase ALL available cross references.
+ */
+@SuppressWarnings("all")
+public class NullGlobalScopeProvider implements IScopeProvider {
+ @Override
+ public IScope getScope(final EObject context, final EReference reference) {
+ return IScope.NULLSCOPE;
+ }
+}
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/xtend-gen/org/eclipse/sensinact/studio/language/ui/contentassist/SensinactProposalProvider.java b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/xtend-gen/org/eclipse/sensinact/studio/language/ui/contentassist/SensinactProposalProvider.java
new file mode 100644
index 0000000..dde6b71
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/xtend-gen/org/eclipse/sensinact/studio/language/ui/contentassist/SensinactProposalProvider.java
@@ -0,0 +1,87 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.language.ui.contentassist;
+
+import java.util.List;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.jface.text.contentassist.ICompletionProposal;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Resource;
+import org.eclipse.sensinact.studio.language.ui.contentassist.AbstractSensinactProposalProvider;
+import org.eclipse.sensinact.studio.model.manager.modelupdater.ModelEditor;
+import org.eclipse.sensinact.studio.model.manager.modelupdater.ModelUpdater;
+import org.eclipse.xtext.Assignment;
+import org.eclipse.xtext.RuleCall;
+import org.eclipse.xtext.ui.editor.contentassist.ContentAssistContext;
+import org.eclipse.xtext.ui.editor.contentassist.ICompletionProposalAcceptor;
+import org.eclipse.xtext.xbase.lib.Exceptions;
+
+/**
+ * @author Etienne Gandrille
+ */
+@SuppressWarnings("all")
+public class SensinactProposalProvider extends AbstractSensinactProposalProvider {
+ @Override
+ public void complete_EXTENDED_ID(final EObject model, final RuleCall ruleCall, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
+ try {
+ DSL_Resource rsrc = ((DSL_Resource) model);
+ String gatewayID = rsrc.getGatewayID();
+ String deviceID = rsrc.getDeviceID();
+ String serviceID = rsrc.getServiceID();
+ EObject _eContainer = ruleCall.eContainer();
+ Assignment container = ((Assignment) _eContainer);
+ String feature = container.getFeature();
+ boolean _equals = "gatewayID".equals(feature);
+ if (_equals) {
+ ModelEditor _instance = ModelEditor.getInstance();
+ List<String> candidates = _instance.getGatewaysId();
+ for (final String candidate : candidates) {
+ ICompletionProposal _createCompletionProposal = this.createCompletionProposal((candidate + "/"), context);
+ acceptor.accept(_createCompletionProposal);
+ }
+ }
+ boolean _equals_1 = "deviceID".equals(feature);
+ if (_equals_1) {
+ ModelEditor _instance_1 = ModelEditor.getInstance();
+ List<String> candidates_1 = _instance_1.getDevicesId(gatewayID);
+ for (final String candidate_1 : candidates_1) {
+ ICompletionProposal _createCompletionProposal_1 = this.createCompletionProposal((candidate_1 + "/"), context);
+ acceptor.accept(_createCompletionProposal_1);
+ }
+ } else {
+ boolean _equals_2 = "serviceID".equals(feature);
+ if (_equals_2) {
+ ModelUpdater _instance_2 = ModelUpdater.getInstance();
+ _instance_2.updateServices(gatewayID, deviceID);
+ ModelEditor _instance_3 = ModelEditor.getInstance();
+ List<String> candidates_2 = _instance_3.getServicesId(gatewayID, deviceID);
+ for (final String candidate_2 : candidates_2) {
+ ICompletionProposal _createCompletionProposal_2 = this.createCompletionProposal((candidate_2 + "/"), context);
+ acceptor.accept(_createCompletionProposal_2);
+ }
+ } else {
+ boolean _equals_3 = "resourceID".equals(feature);
+ if (_equals_3) {
+ ModelUpdater _instance_4 = ModelUpdater.getInstance();
+ _instance_4.updateResources(gatewayID, deviceID, serviceID);
+ ModelEditor _instance_5 = ModelEditor.getInstance();
+ List<String> candidates_3 = _instance_5.getResourcesId(gatewayID, deviceID, serviceID);
+ for (final String candidate_3 : candidates_3) {
+ ICompletionProposal _createCompletionProposal_3 = this.createCompletionProposal(candidate_3, context);
+ acceptor.accept(_createCompletionProposal_3);
+ }
+ }
+ }
+ }
+ } catch (Throwable _e) {
+ throw Exceptions.sneakyThrow(_e);
+ }
+ }
+}
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/xtend-gen/org/eclipse/sensinact/studio/language/ui/labeling/.SensinactDescriptionLabelProvider.java._trace b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/xtend-gen/org/eclipse/sensinact/studio/language/ui/labeling/.SensinactDescriptionLabelProvider.java._trace
new file mode 100644
index 0000000..7508512
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/xtend-gen/org/eclipse/sensinact/studio/language/ui/labeling/.SensinactDescriptionLabelProvider.java._trace
Binary files differ
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/xtend-gen/org/eclipse/sensinact/studio/language/ui/labeling/.SensinactDescriptionLabelProvider.xtendbin b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/xtend-gen/org/eclipse/sensinact/studio/language/ui/labeling/.SensinactDescriptionLabelProvider.xtendbin
new file mode 100644
index 0000000..b9b2fc3
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/xtend-gen/org/eclipse/sensinact/studio/language/ui/labeling/.SensinactDescriptionLabelProvider.xtendbin
Binary files differ
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/xtend-gen/org/eclipse/sensinact/studio/language/ui/labeling/.SensinactLabelProvider.java._trace b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/xtend-gen/org/eclipse/sensinact/studio/language/ui/labeling/.SensinactLabelProvider.java._trace
new file mode 100644
index 0000000..e6d7da0
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/xtend-gen/org/eclipse/sensinact/studio/language/ui/labeling/.SensinactLabelProvider.java._trace
Binary files differ
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/xtend-gen/org/eclipse/sensinact/studio/language/ui/labeling/.SensinactLabelProvider.xtendbin b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/xtend-gen/org/eclipse/sensinact/studio/language/ui/labeling/.SensinactLabelProvider.xtendbin
new file mode 100644
index 0000000..2e6e314
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/xtend-gen/org/eclipse/sensinact/studio/language/ui/labeling/.SensinactLabelProvider.xtendbin
Binary files differ
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/xtend-gen/org/eclipse/sensinact/studio/language/ui/labeling/SensinactDescriptionLabelProvider.java b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/xtend-gen/org/eclipse/sensinact/studio/language/ui/labeling/SensinactDescriptionLabelProvider.java
new file mode 100644
index 0000000..6c4d41e
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/xtend-gen/org/eclipse/sensinact/studio/language/ui/labeling/SensinactDescriptionLabelProvider.java
@@ -0,0 +1,22 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.language.ui.labeling;
+
+import org.eclipse.xtext.ui.label.DefaultDescriptionLabelProvider;
+
+/**
+ * Provides labels for IEObjectDescriptions and IResourceDescriptions.
+ *
+ * See https://www.eclipse.org/Xtext/documentation/304_ide_concepts.html#label-provider
+ */
+@SuppressWarnings("all")
+public class SensinactDescriptionLabelProvider extends DefaultDescriptionLabelProvider {
+}
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/xtend-gen/org/eclipse/sensinact/studio/language/ui/labeling/SensinactLabelProvider.java b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/xtend-gen/org/eclipse/sensinact/studio/language/ui/labeling/SensinactLabelProvider.java
new file mode 100644
index 0000000..9b2ad58
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/xtend-gen/org/eclipse/sensinact/studio/language/ui/labeling/SensinactLabelProvider.java
@@ -0,0 +1,28 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.language.ui.labeling;
+
+import com.google.inject.Inject;
+import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
+import org.eclipse.xtext.ui.label.DefaultEObjectLabelProvider;
+
+/**
+ * Provides labels for EObjects.
+ *
+ * See https://www.eclipse.org/Xtext/documentation/304_ide_concepts.html#label-provider
+ */
+@SuppressWarnings("all")
+public class SensinactLabelProvider extends DefaultEObjectLabelProvider {
+ @Inject
+ public SensinactLabelProvider(final AdapterFactoryLabelProvider delegate) {
+ super(delegate);
+ }
+}
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/xtend-gen/org/eclipse/sensinact/studio/language/ui/outline/.SensinactOutlineTreeProvider.java._trace b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/xtend-gen/org/eclipse/sensinact/studio/language/ui/outline/.SensinactOutlineTreeProvider.java._trace
new file mode 100644
index 0000000..a7a6b70
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/xtend-gen/org/eclipse/sensinact/studio/language/ui/outline/.SensinactOutlineTreeProvider.java._trace
Binary files differ
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/xtend-gen/org/eclipse/sensinact/studio/language/ui/outline/.SensinactOutlineTreeProvider.xtendbin b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/xtend-gen/org/eclipse/sensinact/studio/language/ui/outline/.SensinactOutlineTreeProvider.xtendbin
new file mode 100644
index 0000000..30d59d1
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/xtend-gen/org/eclipse/sensinact/studio/language/ui/outline/.SensinactOutlineTreeProvider.xtendbin
Binary files differ
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/xtend-gen/org/eclipse/sensinact/studio/language/ui/outline/SensinactOutlineTreeProvider.java b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/xtend-gen/org/eclipse/sensinact/studio/language/ui/outline/SensinactOutlineTreeProvider.java
new file mode 100644
index 0000000..9f6f23e
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/xtend-gen/org/eclipse/sensinact/studio/language/ui/outline/SensinactOutlineTreeProvider.java
@@ -0,0 +1,22 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.language.ui.outline;
+
+import org.eclipse.xtext.ui.editor.outline.impl.DefaultOutlineTreeProvider;
+
+/**
+ * Customization of the default outline structure.
+ *
+ * See https://www.eclipse.org/Xtext/documentation/304_ide_concepts.html#outline
+ */
+@SuppressWarnings("all")
+public class SensinactOutlineTreeProvider extends DefaultOutlineTreeProvider {
+}
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/xtend-gen/org/eclipse/sensinact/studio/language/ui/quickfix/.SensinactQuickfixProvider.java._trace b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/xtend-gen/org/eclipse/sensinact/studio/language/ui/quickfix/.SensinactQuickfixProvider.java._trace
new file mode 100644
index 0000000..cbdb024
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/xtend-gen/org/eclipse/sensinact/studio/language/ui/quickfix/.SensinactQuickfixProvider.java._trace
Binary files differ
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/xtend-gen/org/eclipse/sensinact/studio/language/ui/quickfix/.SensinactQuickfixProvider.xtendbin b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/xtend-gen/org/eclipse/sensinact/studio/language/ui/quickfix/.SensinactQuickfixProvider.xtendbin
new file mode 100644
index 0000000..24e781e
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/xtend-gen/org/eclipse/sensinact/studio/language/ui/quickfix/.SensinactQuickfixProvider.xtendbin
Binary files differ
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/xtend-gen/org/eclipse/sensinact/studio/language/ui/quickfix/SensinactQuickfixProvider.java b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/xtend-gen/org/eclipse/sensinact/studio/language/ui/quickfix/SensinactQuickfixProvider.java
new file mode 100644
index 0000000..a0a17f9
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/xtend-gen/org/eclipse/sensinact/studio/language/ui/quickfix/SensinactQuickfixProvider.java
@@ -0,0 +1,22 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.language.ui.quickfix;
+
+import org.eclipse.xtext.ui.editor.quickfix.DefaultQuickfixProvider;
+
+/**
+ * Custom quickfixes.
+ *
+ * See https://www.eclipse.org/Xtext/documentation/304_ide_concepts.html#quick-fixes
+ */
+@SuppressWarnings("all")
+public class SensinactQuickfixProvider extends DefaultQuickfixProvider {
+}
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/.antlr-generator-3.2.0-patch.jar b/xtext/org.eclipse.sensinact.studio.language.sensinact/.antlr-generator-3.2.0-patch.jar
new file mode 100644
index 0000000..90516fd
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/.antlr-generator-3.2.0-patch.jar
Binary files differ
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/META-INF/MANIFEST.MF b/xtext/org.eclipse.sensinact.studio.language.sensinact/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..11c65bc
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/META-INF/MANIFEST.MF
@@ -0,0 +1,31 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: org.eclipse.sensinact.studio.language.sensinact
+Bundle-Vendor: My Company
+Bundle-Version: 1.0.0.qualifier
+Bundle-SymbolicName: org.eclipse.sensinact.studio.language.sensinact; singleton:=true
+Bundle-ActivationPolicy: lazy
+Require-Bundle: org.eclipse.xtext,
+ org.eclipse.xtext.xbase,
+ org.eclipse.equinox.common;bundle-version="3.5.0",
+ org.eclipse.emf.ecore,
+ org.eclipse.xtext.xbase.lib,
+ org.antlr.runtime,
+ org.eclipse.xtext.util,
+ org.eclipse.xtend.lib,
+ org.eclipse.emf.common,
+ org.eclipse.sensinact.studio.model.manager;bundle-version="1.0.0",
+ org.eclipse.sensinact.studio.model.resource;bundle-version="1.0.0"
+Bundle-RequiredExecutionEnvironment: JavaSE-1.7
+Export-Package: org.eclipse.sensinact.studio.language.validation,
+ org.eclipse.sensinact.studio.language.sensinact.impl,
+ org.eclipse.sensinact.studio.language.scoping,
+ org.eclipse.sensinact.studio.language.sensinact.util,
+ org.eclipse.sensinact.studio.language.parser.antlr.internal,
+ org.eclipse.sensinact.studio.language.parser.antlr,
+ org.eclipse.sensinact.studio.language,
+ org.eclipse.sensinact.studio.language.services,
+ org.eclipse.sensinact.studio.language.sensinact,
+ org.eclipse.sensinact.studio.language.serializer,
+ org.eclipse.sensinact.studio.language.generator
+Import-Package: org.apache.log4j
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/about.html b/xtext/org.eclipse.sensinact.studio.language.sensinact/about.html
new file mode 100644
index 0000000..3b39f88
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/about.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"><head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 5, 2006</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+
+</body></html>
\ No newline at end of file
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/build.properties b/xtext/org.eclipse.sensinact.studio.language.sensinact/build.properties
new file mode 100644
index 0000000..f3dce3d
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/build.properties
@@ -0,0 +1,29 @@
+#
+# Copyright (c) 2017 CEA.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+# CEA - initial API and implementation and/or initial documentation
+#
+
+source.. = src/,\
+ src-gen/,\
+ xtend-gen/
+bin.includes = model/generated/,\
+ .,\
+ META-INF/,\
+ plugin.xml
+additional.bundles = org.eclipse.xtext.xbase,\
+ org.eclipse.xtext.common.types,\
+ org.eclipse.xtext.xtext.generator,\
+ org.eclipse.emf.codegen.ecore,\
+ org.eclipse.emf.mwe.utils,\
+ org.eclipse.emf.mwe2.launch,\
+ org.eclipse.emf.mwe2.lib,\
+ org.objectweb.asm,\
+ org.apache.commons.logging,\
+ org.apache.log4j,\
+ com.ibm.icu
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/model/generated/Sensinact.ecore b/xtext/org.eclipse.sensinact.studio.language.sensinact/model/generated/Sensinact.ecore
new file mode 100644
index 0000000..0cba3a1
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/model/generated/Sensinact.ecore
@@ -0,0 +1,240 @@
+<?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="sensinact" nsURI="http://www.eclipse.org/sensinact/studio/language/Sensinact"
+ nsPrefix="sensinact">
+ <eClassifiers xsi:type="ecore:EClass" name="Sensinact">
+ <eStructuralFeatures xsi:type="ecore:EReference" name="eca" eType="#//DSL_SENSINACT"
+ containment="true"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EClass" name="DSL_SENSINACT">
+ <eStructuralFeatures xsi:type="ecore:EReference" name="resources" upperBound="-1"
+ eType="#//DSL_Resource" containment="true"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="cep" upperBound="-1" eType="#//DSL_CEP_STATEMENT"
+ containment="true"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="on" eType="#//DSL_On" containment="true"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="eca" eType="#//DSL_ECA_STATEMENT"
+ containment="true"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EClass" name="DSL_Resource" eSuperTypes="#//DSL_REF">
+ <eStructuralFeatures xsi:type="ecore:EAttribute" name="gatewayID" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+ <eStructuralFeatures xsi:type="ecore:EAttribute" name="deviceID" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+ <eStructuralFeatures xsi:type="ecore:EAttribute" name="serviceID" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+ <eStructuralFeatures xsi:type="ecore:EAttribute" name="resourceID" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EClass" name="DSL_On">
+ <eStructuralFeatures xsi:type="ecore:EReference" name="triggers" upperBound="-1"
+ eType="#//DSL_REF_CONDITION" containment="true"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EClass" name="DSL_ECA_STATEMENT">
+ <eStructuralFeatures xsi:type="ecore:EReference" name="ifdo" eType="#//DSL_IfDo"
+ containment="true"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="elseIfdo" upperBound="-1"
+ eType="#//DSL_ElseIfDo" containment="true"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="elsedo" eType="#//DSL_ElseDo"
+ containment="true"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EClass" name="DSL_IfDo">
+ <eStructuralFeatures xsi:type="ecore:EReference" name="condition" eType="#//DSL_Expression"
+ containment="true"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="actions" eType="#//DSL_ListActions"
+ containment="true"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EClass" name="DSL_ElseIfDo">
+ <eStructuralFeatures xsi:type="ecore:EReference" name="condition" eType="#//DSL_Expression"
+ containment="true"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="actions" eType="#//DSL_ListActions"
+ containment="true"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EClass" name="DSL_ElseDo">
+ <eStructuralFeatures xsi:type="ecore:EReference" name="actions" eType="#//DSL_ListActions"
+ containment="true"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EClass" name="DSL_REF">
+ <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="DSL_REF_CONDITION">
+ <eStructuralFeatures xsi:type="ecore:EReference" name="ref" eType="#//DSL_REF"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EClass" name="DSL_CEP_STATEMENT" eSuperTypes="#//DSL_REF">
+ <eStructuralFeatures xsi:type="ecore:EReference" name="operation" eType="ecore:EClass http://www.eclipse.org/emf/2002/Ecore#//EObject"
+ containment="true"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EClass" name="DSL_CEP_AFTER">
+ <eStructuralFeatures xsi:type="ecore:EReference" name="ref1" eType="#//DSL_REF_CONDITION"
+ containment="true"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="ref2" eType="#//DSL_REF_CONDITION"
+ containment="true"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="start" eType="#//DSL_CEP_DURATION"
+ containment="true"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="end" eType="#//DSL_CEP_DURATION"
+ containment="true"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EClass" name="DSL_CEP_BEFORE">
+ <eStructuralFeatures xsi:type="ecore:EReference" name="ref1" eType="#//DSL_REF_CONDITION"
+ containment="true"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="ref2" eType="#//DSL_REF_CONDITION"
+ containment="true"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="start" eType="#//DSL_CEP_DURATION"
+ containment="true"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="end" eType="#//DSL_CEP_DURATION"
+ containment="true"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EClass" name="DSL_CEP_COINCIDE">
+ <eStructuralFeatures xsi:type="ecore:EReference" name="ref1" eType="#//DSL_REF_CONDITION"
+ containment="true"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="ref2" eType="#//DSL_REF_CONDITION"
+ containment="true"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="window" eType="#//DSL_CEP_DURATION"
+ containment="true"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EClass" name="DSL_CEP_MIN">
+ <eStructuralFeatures xsi:type="ecore:EReference" name="ref" eType="#//DSL_REF_CONDITION"
+ containment="true"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="window" eType="#//DSL_CEP_DURATION"
+ containment="true"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EClass" name="DSL_CEP_MAX">
+ <eStructuralFeatures xsi:type="ecore:EReference" name="ref" eType="#//DSL_REF_CONDITION"
+ containment="true"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="window" eType="#//DSL_CEP_DURATION"
+ containment="true"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EClass" name="DSL_CEP_AVG">
+ <eStructuralFeatures xsi:type="ecore:EReference" name="ref" eType="#//DSL_REF_CONDITION"
+ containment="true"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="window" eType="#//DSL_CEP_DURATION"
+ containment="true"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EClass" name="DSL_CEP_SUM">
+ <eStructuralFeatures xsi:type="ecore:EReference" name="ref" eType="#//DSL_REF_CONDITION"
+ containment="true"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="window" eType="#//DSL_CEP_DURATION"
+ containment="true"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EClass" name="DSL_CEP_COUNT">
+ <eStructuralFeatures xsi:type="ecore:EReference" name="ref" eType="#//DSL_REF_CONDITION"
+ containment="true"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="window" eType="#//DSL_CEP_DURATION"
+ containment="true"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EClass" name="DSL_CEP_DURATION">
+ <eStructuralFeatures xsi:type="ecore:EReference" name="units" upperBound="-1"
+ eType="ecore:EClass http://www.eclipse.org/emf/2002/Ecore#//EObject" containment="true"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EClass" name="DSL_CEP_DURATION_MIN">
+ <eStructuralFeatures xsi:type="ecore:EAttribute" name="min" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBigDecimal"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EClass" name="DSL_CEP_DURATION_SEC">
+ <eStructuralFeatures xsi:type="ecore:EAttribute" name="sec" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBigDecimal"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EClass" name="DSL_ListActions">
+ <eStructuralFeatures xsi:type="ecore:EReference" name="actionList" upperBound="-1"
+ eType="#//DSL_ResourceAction" containment="true"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EClass" name="DSL_ResourceAction">
+ <eStructuralFeatures xsi:type="ecore:EAttribute" name="variable" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="ref" eType="#//DSL_REF"/>
+ <eStructuralFeatures xsi:type="ecore:EAttribute" name="actiontype" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="listParam" eType="#//DSL_ListParam"
+ containment="true"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EClass" name="DSL_ListParam">
+ <eStructuralFeatures xsi:type="ecore:EReference" name="param" upperBound="-1"
+ eType="#//DSL_Expression" containment="true"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EClass" name="DSL_Expression"/>
+ <eClassifiers xsi:type="ecore:EClass" name="DSL_Expression_Or" eSuperTypes="#//DSL_Expression">
+ <eStructuralFeatures xsi:type="ecore:EReference" name="left" eType="#//DSL_Expression"
+ containment="true"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="right" eType="#//DSL_Expression"
+ containment="true"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EClass" name="DSL_Expression_And" eSuperTypes="#//DSL_Expression">
+ <eStructuralFeatures xsi:type="ecore:EReference" name="left" eType="#//DSL_Expression"
+ containment="true"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="right" eType="#//DSL_Expression"
+ containment="true"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EClass" name="DSL_Expression_Diff" eSuperTypes="#//DSL_Expression">
+ <eStructuralFeatures xsi:type="ecore:EReference" name="left" eType="#//DSL_Expression"
+ containment="true"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="right" eType="#//DSL_Expression"
+ containment="true"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EClass" name="DSL_Expression_Equal" eSuperTypes="#//DSL_Expression">
+ <eStructuralFeatures xsi:type="ecore:EReference" name="left" eType="#//DSL_Expression"
+ containment="true"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="right" eType="#//DSL_Expression"
+ containment="true"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EClass" name="DSL_Expression_Larger" eSuperTypes="#//DSL_Expression">
+ <eStructuralFeatures xsi:type="ecore:EReference" name="left" eType="#//DSL_Expression"
+ containment="true"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="right" eType="#//DSL_Expression"
+ containment="true"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EClass" name="DSL_Expression_Larger_Equal" eSuperTypes="#//DSL_Expression">
+ <eStructuralFeatures xsi:type="ecore:EReference" name="left" eType="#//DSL_Expression"
+ containment="true"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="right" eType="#//DSL_Expression"
+ containment="true"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EClass" name="DSL_Expression_Smaller" eSuperTypes="#//DSL_Expression">
+ <eStructuralFeatures xsi:type="ecore:EReference" name="left" eType="#//DSL_Expression"
+ containment="true"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="right" eType="#//DSL_Expression"
+ containment="true"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EClass" name="DSL_Expression_Smaller_Equal" eSuperTypes="#//DSL_Expression">
+ <eStructuralFeatures xsi:type="ecore:EReference" name="left" eType="#//DSL_Expression"
+ containment="true"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="right" eType="#//DSL_Expression"
+ containment="true"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EClass" name="DSL_Expression_Plus" eSuperTypes="#//DSL_Expression">
+ <eStructuralFeatures xsi:type="ecore:EReference" name="left" eType="#//DSL_Expression"
+ containment="true"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="right" eType="#//DSL_Expression"
+ containment="true"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EClass" name="DSL_Expression_Minus" eSuperTypes="#//DSL_Expression">
+ <eStructuralFeatures xsi:type="ecore:EReference" name="left" eType="#//DSL_Expression"
+ containment="true"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="right" eType="#//DSL_Expression"
+ containment="true"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EClass" name="DSL_Expression_Multiplication" eSuperTypes="#//DSL_Expression">
+ <eStructuralFeatures xsi:type="ecore:EReference" name="left" eType="#//DSL_Expression"
+ containment="true"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="right" eType="#//DSL_Expression"
+ containment="true"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EClass" name="DSL_Expression_Division" eSuperTypes="#//DSL_Expression">
+ <eStructuralFeatures xsi:type="ecore:EReference" name="left" eType="#//DSL_Expression"
+ containment="true"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="right" eType="#//DSL_Expression"
+ containment="true"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EClass" name="DSL_Expression_Modulo" eSuperTypes="#//DSL_Expression">
+ <eStructuralFeatures xsi:type="ecore:EReference" name="left" eType="#//DSL_Expression"
+ containment="true"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="right" eType="#//DSL_Expression"
+ containment="true"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EClass" name="DSL_Object_Number" eSuperTypes="#//DSL_Expression">
+ <eStructuralFeatures xsi:type="ecore:EAttribute" name="value" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBigDecimal"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EClass" name="DSL_Object_String" eSuperTypes="#//DSL_Expression">
+ <eStructuralFeatures xsi:type="ecore:EAttribute" name="value" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EClass" name="DSL_Object_Boolean" eSuperTypes="#//DSL_Expression">
+ <eStructuralFeatures xsi:type="ecore:EAttribute" name="value" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EClass" name="DSL_Object_Ref" eSuperTypes="#//DSL_Expression">
+ <eStructuralFeatures xsi:type="ecore:EReference" name="value" eType="#//DSL_REF"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EClass" name="DSL_Expression_Negate" eSuperTypes="#//DSL_Expression">
+ <eStructuralFeatures xsi:type="ecore:EReference" name="exp" eType="#//DSL_Expression"
+ containment="true"/>
+ </eClassifiers>
+</ecore:EPackage>
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/model/generated/Sensinact.genmodel b/xtext/org.eclipse.sensinact.studio.language.sensinact/model/generated/Sensinact.genmodel
new file mode 100644
index 0000000..3f49a2d
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/model/generated/Sensinact.genmodel
@@ -0,0 +1,179 @@
+<?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="generated by Xtext 2.9.1" modelDirectory="/org.eclipse.sensinact.studio.language.sensinact/src-gen"
+ modelPluginID="org.eclipse.sensinact.studio.language.sensinact" forceOverwrite="true"
+ modelName="Sensinact" updateClasspath="false" rootExtendsClass="org.eclipse.emf.ecore.impl.MinimalEObjectImpl$Container"
+ complianceLevel="6.0" copyrightFields="false" runtimeVersion="2.11">
+ <genPackages prefix="Sensinact" basePackage="org.eclipse.sensinact.studio.language"
+ disposableProviderFactory="true" fileExtensions="sna" ecorePackage="Sensinact.ecore#/">
+ <genClasses ecoreClass="Sensinact.ecore#//Sensinact">
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Sensinact.ecore#//Sensinact/eca"/>
+ </genClasses>
+ <genClasses ecoreClass="Sensinact.ecore#//DSL_SENSINACT">
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Sensinact.ecore#//DSL_SENSINACT/resources"/>
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Sensinact.ecore#//DSL_SENSINACT/cep"/>
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Sensinact.ecore#//DSL_SENSINACT/on"/>
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Sensinact.ecore#//DSL_SENSINACT/eca"/>
+ </genClasses>
+ <genClasses ecoreClass="Sensinact.ecore#//DSL_Resource">
+ <genFeatures createChild="false" ecoreFeature="ecore:EAttribute Sensinact.ecore#//DSL_Resource/gatewayID"/>
+ <genFeatures createChild="false" ecoreFeature="ecore:EAttribute Sensinact.ecore#//DSL_Resource/deviceID"/>
+ <genFeatures createChild="false" ecoreFeature="ecore:EAttribute Sensinact.ecore#//DSL_Resource/serviceID"/>
+ <genFeatures createChild="false" ecoreFeature="ecore:EAttribute Sensinact.ecore#//DSL_Resource/resourceID"/>
+ </genClasses>
+ <genClasses ecoreClass="Sensinact.ecore#//DSL_On">
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Sensinact.ecore#//DSL_On/triggers"/>
+ </genClasses>
+ <genClasses ecoreClass="Sensinact.ecore#//DSL_ECA_STATEMENT">
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Sensinact.ecore#//DSL_ECA_STATEMENT/ifdo"/>
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Sensinact.ecore#//DSL_ECA_STATEMENT/elseIfdo"/>
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Sensinact.ecore#//DSL_ECA_STATEMENT/elsedo"/>
+ </genClasses>
+ <genClasses ecoreClass="Sensinact.ecore#//DSL_IfDo">
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Sensinact.ecore#//DSL_IfDo/condition"/>
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Sensinact.ecore#//DSL_IfDo/actions"/>
+ </genClasses>
+ <genClasses ecoreClass="Sensinact.ecore#//DSL_ElseIfDo">
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Sensinact.ecore#//DSL_ElseIfDo/condition"/>
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Sensinact.ecore#//DSL_ElseIfDo/actions"/>
+ </genClasses>
+ <genClasses ecoreClass="Sensinact.ecore#//DSL_ElseDo">
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Sensinact.ecore#//DSL_ElseDo/actions"/>
+ </genClasses>
+ <genClasses ecoreClass="Sensinact.ecore#//DSL_REF">
+ <genFeatures createChild="false" ecoreFeature="ecore:EAttribute Sensinact.ecore#//DSL_REF/name"/>
+ </genClasses>
+ <genClasses ecoreClass="Sensinact.ecore#//DSL_REF_CONDITION">
+ <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference Sensinact.ecore#//DSL_REF_CONDITION/ref"/>
+ </genClasses>
+ <genClasses ecoreClass="Sensinact.ecore#//DSL_CEP_STATEMENT">
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Sensinact.ecore#//DSL_CEP_STATEMENT/operation"/>
+ </genClasses>
+ <genClasses ecoreClass="Sensinact.ecore#//DSL_CEP_AFTER">
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Sensinact.ecore#//DSL_CEP_AFTER/ref1"/>
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Sensinact.ecore#//DSL_CEP_AFTER/ref2"/>
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Sensinact.ecore#//DSL_CEP_AFTER/start"/>
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Sensinact.ecore#//DSL_CEP_AFTER/end"/>
+ </genClasses>
+ <genClasses ecoreClass="Sensinact.ecore#//DSL_CEP_BEFORE">
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Sensinact.ecore#//DSL_CEP_BEFORE/ref1"/>
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Sensinact.ecore#//DSL_CEP_BEFORE/ref2"/>
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Sensinact.ecore#//DSL_CEP_BEFORE/start"/>
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Sensinact.ecore#//DSL_CEP_BEFORE/end"/>
+ </genClasses>
+ <genClasses ecoreClass="Sensinact.ecore#//DSL_CEP_COINCIDE">
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Sensinact.ecore#//DSL_CEP_COINCIDE/ref1"/>
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Sensinact.ecore#//DSL_CEP_COINCIDE/ref2"/>
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Sensinact.ecore#//DSL_CEP_COINCIDE/window"/>
+ </genClasses>
+ <genClasses ecoreClass="Sensinact.ecore#//DSL_CEP_MIN">
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Sensinact.ecore#//DSL_CEP_MIN/ref"/>
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Sensinact.ecore#//DSL_CEP_MIN/window"/>
+ </genClasses>
+ <genClasses ecoreClass="Sensinact.ecore#//DSL_CEP_MAX">
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Sensinact.ecore#//DSL_CEP_MAX/ref"/>
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Sensinact.ecore#//DSL_CEP_MAX/window"/>
+ </genClasses>
+ <genClasses ecoreClass="Sensinact.ecore#//DSL_CEP_AVG">
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Sensinact.ecore#//DSL_CEP_AVG/ref"/>
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Sensinact.ecore#//DSL_CEP_AVG/window"/>
+ </genClasses>
+ <genClasses ecoreClass="Sensinact.ecore#//DSL_CEP_SUM">
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Sensinact.ecore#//DSL_CEP_SUM/ref"/>
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Sensinact.ecore#//DSL_CEP_SUM/window"/>
+ </genClasses>
+ <genClasses ecoreClass="Sensinact.ecore#//DSL_CEP_COUNT">
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Sensinact.ecore#//DSL_CEP_COUNT/ref"/>
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Sensinact.ecore#//DSL_CEP_COUNT/window"/>
+ </genClasses>
+ <genClasses ecoreClass="Sensinact.ecore#//DSL_CEP_DURATION">
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Sensinact.ecore#//DSL_CEP_DURATION/units"/>
+ </genClasses>
+ <genClasses ecoreClass="Sensinact.ecore#//DSL_CEP_DURATION_MIN">
+ <genFeatures createChild="false" ecoreFeature="ecore:EAttribute Sensinact.ecore#//DSL_CEP_DURATION_MIN/min"/>
+ </genClasses>
+ <genClasses ecoreClass="Sensinact.ecore#//DSL_CEP_DURATION_SEC">
+ <genFeatures createChild="false" ecoreFeature="ecore:EAttribute Sensinact.ecore#//DSL_CEP_DURATION_SEC/sec"/>
+ </genClasses>
+ <genClasses ecoreClass="Sensinact.ecore#//DSL_ListActions">
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Sensinact.ecore#//DSL_ListActions/actionList"/>
+ </genClasses>
+ <genClasses ecoreClass="Sensinact.ecore#//DSL_ResourceAction">
+ <genFeatures createChild="false" ecoreFeature="ecore:EAttribute Sensinact.ecore#//DSL_ResourceAction/variable"/>
+ <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference Sensinact.ecore#//DSL_ResourceAction/ref"/>
+ <genFeatures createChild="false" ecoreFeature="ecore:EAttribute Sensinact.ecore#//DSL_ResourceAction/actiontype"/>
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Sensinact.ecore#//DSL_ResourceAction/listParam"/>
+ </genClasses>
+ <genClasses ecoreClass="Sensinact.ecore#//DSL_ListParam">
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Sensinact.ecore#//DSL_ListParam/param"/>
+ </genClasses>
+ <genClasses ecoreClass="Sensinact.ecore#//DSL_Expression"/>
+ <genClasses ecoreClass="Sensinact.ecore#//DSL_Expression_Or">
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Sensinact.ecore#//DSL_Expression_Or/left"/>
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Sensinact.ecore#//DSL_Expression_Or/right"/>
+ </genClasses>
+ <genClasses ecoreClass="Sensinact.ecore#//DSL_Expression_And">
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Sensinact.ecore#//DSL_Expression_And/left"/>
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Sensinact.ecore#//DSL_Expression_And/right"/>
+ </genClasses>
+ <genClasses ecoreClass="Sensinact.ecore#//DSL_Expression_Diff">
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Sensinact.ecore#//DSL_Expression_Diff/left"/>
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Sensinact.ecore#//DSL_Expression_Diff/right"/>
+ </genClasses>
+ <genClasses ecoreClass="Sensinact.ecore#//DSL_Expression_Equal">
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Sensinact.ecore#//DSL_Expression_Equal/left"/>
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Sensinact.ecore#//DSL_Expression_Equal/right"/>
+ </genClasses>
+ <genClasses ecoreClass="Sensinact.ecore#//DSL_Expression_Larger">
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Sensinact.ecore#//DSL_Expression_Larger/left"/>
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Sensinact.ecore#//DSL_Expression_Larger/right"/>
+ </genClasses>
+ <genClasses ecoreClass="Sensinact.ecore#//DSL_Expression_Larger_Equal">
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Sensinact.ecore#//DSL_Expression_Larger_Equal/left"/>
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Sensinact.ecore#//DSL_Expression_Larger_Equal/right"/>
+ </genClasses>
+ <genClasses ecoreClass="Sensinact.ecore#//DSL_Expression_Smaller">
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Sensinact.ecore#//DSL_Expression_Smaller/left"/>
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Sensinact.ecore#//DSL_Expression_Smaller/right"/>
+ </genClasses>
+ <genClasses ecoreClass="Sensinact.ecore#//DSL_Expression_Smaller_Equal">
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Sensinact.ecore#//DSL_Expression_Smaller_Equal/left"/>
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Sensinact.ecore#//DSL_Expression_Smaller_Equal/right"/>
+ </genClasses>
+ <genClasses ecoreClass="Sensinact.ecore#//DSL_Expression_Plus">
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Sensinact.ecore#//DSL_Expression_Plus/left"/>
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Sensinact.ecore#//DSL_Expression_Plus/right"/>
+ </genClasses>
+ <genClasses ecoreClass="Sensinact.ecore#//DSL_Expression_Minus">
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Sensinact.ecore#//DSL_Expression_Minus/left"/>
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Sensinact.ecore#//DSL_Expression_Minus/right"/>
+ </genClasses>
+ <genClasses ecoreClass="Sensinact.ecore#//DSL_Expression_Multiplication">
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Sensinact.ecore#//DSL_Expression_Multiplication/left"/>
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Sensinact.ecore#//DSL_Expression_Multiplication/right"/>
+ </genClasses>
+ <genClasses ecoreClass="Sensinact.ecore#//DSL_Expression_Division">
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Sensinact.ecore#//DSL_Expression_Division/left"/>
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Sensinact.ecore#//DSL_Expression_Division/right"/>
+ </genClasses>
+ <genClasses ecoreClass="Sensinact.ecore#//DSL_Expression_Modulo">
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Sensinact.ecore#//DSL_Expression_Modulo/left"/>
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Sensinact.ecore#//DSL_Expression_Modulo/right"/>
+ </genClasses>
+ <genClasses ecoreClass="Sensinact.ecore#//DSL_Object_Number">
+ <genFeatures createChild="false" ecoreFeature="ecore:EAttribute Sensinact.ecore#//DSL_Object_Number/value"/>
+ </genClasses>
+ <genClasses ecoreClass="Sensinact.ecore#//DSL_Object_String">
+ <genFeatures createChild="false" ecoreFeature="ecore:EAttribute Sensinact.ecore#//DSL_Object_String/value"/>
+ </genClasses>
+ <genClasses ecoreClass="Sensinact.ecore#//DSL_Object_Boolean">
+ <genFeatures createChild="false" ecoreFeature="ecore:EAttribute Sensinact.ecore#//DSL_Object_Boolean/value"/>
+ </genClasses>
+ <genClasses ecoreClass="Sensinact.ecore#//DSL_Object_Ref">
+ <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference Sensinact.ecore#//DSL_Object_Ref/value"/>
+ </genClasses>
+ <genClasses ecoreClass="Sensinact.ecore#//DSL_Expression_Negate">
+ <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Sensinact.ecore#//DSL_Expression_Negate/exp"/>
+ </genClasses>
+ </genPackages>
+</genmodel:GenModel>
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/plugin.xml b/xtext/org.eclipse.sensinact.studio.language.sensinact/plugin.xml
new file mode 100644
index 0000000..e285417
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/plugin.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Copyright (c) 2017 CEA.
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+
+ Contributors:
+ CEA - initial API and implementation and/or initial documentation
+
+-->
+<?eclipse version="3.0"?>
+
+<plugin>
+
+ <extension point="org.eclipse.emf.ecore.generated_package">
+ <package
+ uri = "http://www.eclipse.org/sensinact/studio/language/Sensinact"
+ class = "org.eclipse.sensinact.studio.language.sensinact.SensinactPackage"
+ genModel = "model/generated/Sensinact.genmodel" />
+
+ </extension>
+ <extension
+ id="sensinact"
+ point="org.eclipse.core.runtime.products">
+ <product
+ application="org.eclipse.ui.ide.workbench"
+ name="Sensinact Studio">
+ <property
+ name="aboutText"
+ value="Sensinact Studio">
+ </property>
+ <property
+ name="aboutImage"
+ value="platform:/plugin/org.eclipse.sensinact.studio.ui.common/images/icons/icon128.png">
+ </property>
+ <property
+ name="appName"
+ value="Sensinact Studio">
+ </property>
+ <property
+ name="windowImages"
+ value="platform:/plugin/org.eclipse.sensinact.studio.ui.common/images/icons/icon16.png,platform:/plugin/org.eclipse.sensinact.studio.ui.common/images/icons/icon32.png,platform:/plugin/org.eclipse.sensinact.studio.ui.common/images/icons/icon48.png,platform:/plugin/org.eclipse.sensinact.studio.ui.common/images/icons/icon64.png,platform:/plugin/org.eclipse.sensinact.studio.ui.common/images/icons/icon128.png,platform:/plugin/org.eclipse.sensinact.studio.ui.common/images/icons/icon256.png">
+ </property>
+ </product>
+ </extension>
+</plugin>
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/plugin_gen.xml b/xtext/org.eclipse.sensinact.studio.language.sensinact/plugin_gen.xml
new file mode 100644
index 0000000..c823b0c
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/plugin_gen.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Copyright (c) 2017 CEA.
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+
+ Contributors:
+ CEA - initial API and implementation and/or initial documentation
+
+-->
+<?eclipse version="3.0"?>
+<plugin>
+ <extension point="org.eclipse.emf.ecore.generated_package">
+ <package
+ uri = "http://www.eclipse.org/sensinact/studio/language/Sensinact"
+ class = "org.eclipse.sensinact.studio.language.sensinact.SensinactPackage"
+ genModel = "model/generated/Sensinact.genmodel" />
+ </extension>
+</plugin>
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/splash.bmp b/xtext/org.eclipse.sensinact.studio.language.sensinact/splash.bmp
new file mode 100644
index 0000000..464af41
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/splash.bmp
Binary files differ
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/splash.svg b/xtext/org.eclipse.sensinact.studio.language.sensinact/splash.svg
new file mode 100644
index 0000000..272ef2c
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/splash.svg
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="452"
+ height="302"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.4 r9939"
+ sodipodi:docname="splash.svg"
+ inkscape:export-filename="/home/nj246216/Bureau/dessin.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1.9707943"
+ inkscape:cx="221.58834"
+ inkscape:cy="167.29186"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1680"
+ inkscape:window-height="974"
+ inkscape:window-x="0"
+ inkscape:window-y="24"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Calque 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-750.36218)">
+ <image
+ y="751.83411"
+ x="0.29843709"
+ id="image2992"
+ xlink:href="data:image/png;base64,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 lk+M957lJ5zix93/HozosR34dyxPr1ixYsWKFStWrFjx/yn8/82cs2LFihUrVqxYsWLF3ydWeXrF ihUrVqxYsWLFiqfHKk+vWLFixYoVK1asWPH0WOXpFStWrFixYsWKFSueHqs8vWLFihUrVqxYsWLF 02OVp1esWLFixYoVK1aseHqs8vSKFStWrFixYsWKFU+PVZ5esWLFihUrVqxYseLpscrTK1asWLFi xYoVK1Y8PVZ5esWKFStWrFixYsWKp8cqT69YsWLFihUrVqxY8fRY5ekVK1asWLFixYoVK54eqzy9 YsWKFStWrFixYsXTY5WnV6xYsWLFihUrVqx4evArX/nKv+8+rFixYsWKFStWrFjxHyso6d93H1as WLFixYoVK1as+I8Va7zHihUrVqxYsWLFihVPj1WeXrFixYoVK1asWLHi6bHK0ytWrFixYsWKFStW PD1WeXrFihUrVqxYsWLFiqfHKk+vWLFixYoVK1asWPH0WOXpFStWrFixYsWKFSueHqs8vWLFihUr VqxYsWLF02OVp1esWLFixYoVK1aseHqs8vSKFStWrFixYsWKFU+PVZ5esWLFihUrVqxYseLpscrT K1asWLFixYoVK1Y8Pf5f4oNuhzMZVbgAAAAASUVORK5CYII= "
+ height="310.48569"
+ width="452.00153"
+ inkscape:export-filename="/home/nj246216/Bureau/image3015.bmp.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ style="opacity:0.82795697;fill:#f2f2f2;stroke:none"
+ id="rect2995"
+ width="455.18536"
+ height="290.78833"
+ x="-1.6019229"
+ y="749.92841"
+ inkscape:export-filename="/home/nj246216/Bureau/image3015.bmp.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <image
+ y="841.05444"
+ x="38.711227"
+ id="image3004"
+ xlink:href="data:image/png;base64,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 QyerZIMAAAAASUVORK5CYII= "
+ height="80"
+ width="390"
+ inkscape:export-filename="/home/nj246216/Bureau/image3015.bmp.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <image
+ y="957.52509"
+ x="2.1960022"
+ id="image3015"
+ xlink:href="data:image/png;base64,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 "
+ height="44.580276"
+ width="54.811813"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ </g>
+</svg>
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/AbstractSensinactRuntimeModule.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/AbstractSensinactRuntimeModule.java
new file mode 100644
index 0000000..0636cb6
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/AbstractSensinactRuntimeModule.java
@@ -0,0 +1,204 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/*
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language;
+
+import com.google.inject.Binder;
+import com.google.inject.Provider;
+import com.google.inject.name.Names;
+import java.util.Properties;
+import org.eclipse.sensinact.studio.language.generator.SensinactGenerator;
+import org.eclipse.sensinact.studio.language.parser.antlr.SensinactAntlrTokenFileProvider;
+import org.eclipse.sensinact.studio.language.parser.antlr.SensinactParser;
+import org.eclipse.sensinact.studio.language.parser.antlr.internal.InternalSensinactLexer;
+import org.eclipse.sensinact.studio.language.scoping.SensinactScopeProvider;
+import org.eclipse.sensinact.studio.language.serializer.SensinactSemanticSequencer;
+import org.eclipse.sensinact.studio.language.serializer.SensinactSyntacticSequencer;
+import org.eclipse.sensinact.studio.language.services.SensinactGrammarAccess;
+import org.eclipse.sensinact.studio.language.validation.SensinactValidator;
+import org.eclipse.xtext.Constants;
+import org.eclipse.xtext.IGrammarAccess;
+import org.eclipse.xtext.generator.IGenerator2;
+import org.eclipse.xtext.naming.DefaultDeclarativeQualifiedNameProvider;
+import org.eclipse.xtext.naming.IQualifiedNameProvider;
+import org.eclipse.xtext.parser.IParser;
+import org.eclipse.xtext.parser.ITokenToStringConverter;
+import org.eclipse.xtext.parser.antlr.AntlrTokenDefProvider;
+import org.eclipse.xtext.parser.antlr.AntlrTokenToStringConverter;
+import org.eclipse.xtext.parser.antlr.IAntlrTokenFileProvider;
+import org.eclipse.xtext.parser.antlr.ITokenDefProvider;
+import org.eclipse.xtext.parser.antlr.Lexer;
+import org.eclipse.xtext.parser.antlr.LexerBindings;
+import org.eclipse.xtext.parser.antlr.LexerProvider;
+import org.eclipse.xtext.resource.IContainer;
+import org.eclipse.xtext.resource.IResourceDescriptions;
+import org.eclipse.xtext.resource.containers.IAllContainersState;
+import org.eclipse.xtext.resource.containers.ResourceSetBasedAllContainersStateProvider;
+import org.eclipse.xtext.resource.containers.StateBasedContainerManager;
+import org.eclipse.xtext.resource.impl.ResourceDescriptionsProvider;
+import org.eclipse.xtext.resource.impl.ResourceSetBasedResourceDescriptions;
+import org.eclipse.xtext.scoping.IGlobalScopeProvider;
+import org.eclipse.xtext.scoping.IScopeProvider;
+import org.eclipse.xtext.scoping.IgnoreCaseLinking;
+import org.eclipse.xtext.scoping.impl.AbstractDeclarativeScopeProvider;
+import org.eclipse.xtext.scoping.impl.DefaultGlobalScopeProvider;
+import org.eclipse.xtext.scoping.impl.ImportedNamespaceAwareLocalScopeProvider;
+import org.eclipse.xtext.serializer.ISerializer;
+import org.eclipse.xtext.serializer.impl.Serializer;
+import org.eclipse.xtext.serializer.sequencer.ISemanticSequencer;
+import org.eclipse.xtext.serializer.sequencer.ISyntacticSequencer;
+import org.eclipse.xtext.service.DefaultRuntimeModule;
+import org.eclipse.xtext.service.SingletonBinding;
+
+/**
+ * Manual modifications go to {@link SensinactRuntimeModule}.
+ */
+@SuppressWarnings("all")
+public abstract class AbstractSensinactRuntimeModule extends DefaultRuntimeModule {
+
+ protected Properties properties = null;
+
+ @Override
+ public void configure(Binder binder) {
+ properties = tryBindProperties(binder, "org/eclipse/sensinact/studio/language/Sensinact.properties");
+ super.configure(binder);
+ }
+
+ public void configureLanguageName(Binder binder) {
+ binder.bind(String.class).annotatedWith(Names.named(Constants.LANGUAGE_NAME)).toInstance("org.eclipse.sensinact.studio.language.Sensinact");
+ }
+
+ public void configureFileExtensions(Binder binder) {
+ if (properties == null || properties.getProperty(Constants.FILE_EXTENSIONS) == null)
+ binder.bind(String.class).annotatedWith(Names.named(Constants.FILE_EXTENSIONS)).toInstance("sna");
+ }
+
+ // contributed by org.eclipse.xtext.xtext.generator.grammarAccess.GrammarAccessFragment2
+ public ClassLoader bindClassLoaderToInstance() {
+ return getClass().getClassLoader();
+ }
+
+ // contributed by org.eclipse.xtext.xtext.generator.grammarAccess.GrammarAccessFragment2
+ public Class<? extends IGrammarAccess> bindIGrammarAccess() {
+ return SensinactGrammarAccess.class;
+ }
+
+ // contributed by org.eclipse.xtext.xtext.generator.serializer.SerializerFragment2
+ public Class<? extends ISemanticSequencer> bindISemanticSequencer() {
+ return SensinactSemanticSequencer.class;
+ }
+
+ // contributed by org.eclipse.xtext.xtext.generator.serializer.SerializerFragment2
+ public Class<? extends ISyntacticSequencer> bindISyntacticSequencer() {
+ return SensinactSyntacticSequencer.class;
+ }
+
+ // contributed by org.eclipse.xtext.xtext.generator.serializer.SerializerFragment2
+ public Class<? extends ISerializer> bindISerializer() {
+ return Serializer.class;
+ }
+
+ // contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+ public Class<? extends IParser> bindIParser() {
+ return SensinactParser.class;
+ }
+
+ // contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+ public Class<? extends ITokenToStringConverter> bindITokenToStringConverter() {
+ return AntlrTokenToStringConverter.class;
+ }
+
+ // contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+ public Class<? extends IAntlrTokenFileProvider> bindIAntlrTokenFileProvider() {
+ return SensinactAntlrTokenFileProvider.class;
+ }
+
+ // contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+ public Class<? extends Lexer> bindLexer() {
+ return InternalSensinactLexer.class;
+ }
+
+ // contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+ public Class<? extends ITokenDefProvider> bindITokenDefProvider() {
+ return AntlrTokenDefProvider.class;
+ }
+
+ // contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+ public Provider<InternalSensinactLexer> provideInternalSensinactLexer() {
+ return LexerProvider.create(InternalSensinactLexer.class);
+ }
+
+ // contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+ public void configureRuntimeLexer(Binder binder) {
+ binder.bind(Lexer.class)
+ .annotatedWith(Names.named(LexerBindings.RUNTIME))
+ .to(InternalSensinactLexer.class);
+ }
+
+ // contributed by org.eclipse.xtext.xtext.generator.validation.ValidatorFragment2
+ @SingletonBinding(eager=true)
+ public Class<? extends SensinactValidator> bindSensinactValidator() {
+ return SensinactValidator.class;
+ }
+
+ // contributed by org.eclipse.xtext.xtext.generator.scoping.ImportNamespacesScopingFragment2
+ public Class<? extends IScopeProvider> bindIScopeProvider() {
+ return SensinactScopeProvider.class;
+ }
+
+ // contributed by org.eclipse.xtext.xtext.generator.scoping.ImportNamespacesScopingFragment2
+ public void configureIScopeProviderDelegate(Binder binder) {
+ binder.bind(IScopeProvider.class).annotatedWith(Names.named(AbstractDeclarativeScopeProvider.NAMED_DELEGATE)).to(ImportedNamespaceAwareLocalScopeProvider.class);
+ }
+
+ // contributed by org.eclipse.xtext.xtext.generator.scoping.ImportNamespacesScopingFragment2
+ public Class<? extends IGlobalScopeProvider> bindIGlobalScopeProvider() {
+ return DefaultGlobalScopeProvider.class;
+ }
+
+ // contributed by org.eclipse.xtext.xtext.generator.scoping.ImportNamespacesScopingFragment2
+ public void configureIgnoreCaseLinking(Binder binder) {
+ binder.bindConstant().annotatedWith(IgnoreCaseLinking.class).to(false);
+ }
+
+ // contributed by org.eclipse.xtext.xtext.generator.exporting.QualifiedNamesFragment2
+ public Class<? extends IQualifiedNameProvider> bindIQualifiedNameProvider() {
+ return DefaultDeclarativeQualifiedNameProvider.class;
+ }
+
+ // contributed by org.eclipse.xtext.xtext.generator.builder.BuilderIntegrationFragment2
+ public Class<? extends IContainer.Manager> bindIContainer$Manager() {
+ return StateBasedContainerManager.class;
+ }
+
+ // contributed by org.eclipse.xtext.xtext.generator.builder.BuilderIntegrationFragment2
+ public Class<? extends IAllContainersState.Provider> bindIAllContainersState$Provider() {
+ return ResourceSetBasedAllContainersStateProvider.class;
+ }
+
+ // contributed by org.eclipse.xtext.xtext.generator.builder.BuilderIntegrationFragment2
+ public void configureIResourceDescriptions(Binder binder) {
+ binder.bind(IResourceDescriptions.class).to(ResourceSetBasedResourceDescriptions.class);
+ }
+
+ // contributed by org.eclipse.xtext.xtext.generator.builder.BuilderIntegrationFragment2
+ public void configureIResourceDescriptionsPersisted(Binder binder) {
+ binder.bind(IResourceDescriptions.class).annotatedWith(Names.named(ResourceDescriptionsProvider.PERSISTED_DESCRIPTIONS)).to(ResourceSetBasedResourceDescriptions.class);
+ }
+
+ // contributed by org.eclipse.xtext.xtext.generator.generator.GeneratorFragment2
+ public Class<? extends IGenerator2> bindIGenerator2() {
+ return SensinactGenerator.class;
+ }
+
+}
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/Sensinact.xtextbin b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/Sensinact.xtextbin
new file mode 100644
index 0000000..819cbd6
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/Sensinact.xtextbin
Binary files differ
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/SensinactStandaloneSetupGenerated.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/SensinactStandaloneSetupGenerated.java
new file mode 100644
index 0000000..c17ed7e
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/SensinactStandaloneSetupGenerated.java
@@ -0,0 +1,52 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/*
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language;
+
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.sensinact.studio.language.sensinact.SensinactPackage;
+import org.eclipse.xtext.ISetup;
+import org.eclipse.xtext.common.TerminalsStandaloneSetup;
+import org.eclipse.xtext.resource.IResourceFactory;
+import org.eclipse.xtext.resource.IResourceServiceProvider;
+
+@SuppressWarnings("all")
+public class SensinactStandaloneSetupGenerated implements ISetup {
+
+ @Override
+ public Injector createInjectorAndDoEMFRegistration() {
+ TerminalsStandaloneSetup.doSetup();
+
+ Injector injector = createInjector();
+ register(injector);
+ return injector;
+ }
+
+ public Injector createInjector() {
+ return Guice.createInjector(new SensinactRuntimeModule());
+ }
+
+ public void register(Injector injector) {
+ if (!EPackage.Registry.INSTANCE.containsKey("http://www.eclipse.org/sensinact/studio/language/Sensinact")) {
+ EPackage.Registry.INSTANCE.put("http://www.eclipse.org/sensinact/studio/language/Sensinact", SensinactPackage.eINSTANCE);
+ }
+ IResourceFactory resourceFactory = injector.getInstance(IResourceFactory.class);
+ IResourceServiceProvider serviceProvider = injector.getInstance(IResourceServiceProvider.class);
+
+ Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put("sna", resourceFactory);
+ IResourceServiceProvider.Registry.INSTANCE.getExtensionToFactoryMap().put("sna", serviceProvider);
+ }
+}
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/parser/antlr/SensinactAntlrTokenFileProvider.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/parser/antlr/SensinactAntlrTokenFileProvider.java
new file mode 100644
index 0000000..9104f48
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/parser/antlr/SensinactAntlrTokenFileProvider.java
@@ -0,0 +1,26 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/*
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.parser.antlr;
+
+import java.io.InputStream;
+import org.eclipse.xtext.parser.antlr.IAntlrTokenFileProvider;
+
+public class SensinactAntlrTokenFileProvider implements IAntlrTokenFileProvider {
+
+ @Override
+ public InputStream getAntlrTokenFile() {
+ ClassLoader classLoader = getClass().getClassLoader();
+ return classLoader.getResourceAsStream("org/eclipse/sensinact/studio/language/parser/antlr/internal/InternalSensinact.tokens");
+ }
+}
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/parser/antlr/SensinactParser.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/parser/antlr/SensinactParser.java
new file mode 100644
index 0000000..df5558b
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/parser/antlr/SensinactParser.java
@@ -0,0 +1,50 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/*
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.parser.antlr;
+
+import com.google.inject.Inject;
+import org.eclipse.sensinact.studio.language.parser.antlr.internal.InternalSensinactParser;
+import org.eclipse.sensinact.studio.language.services.SensinactGrammarAccess;
+import org.eclipse.xtext.parser.antlr.AbstractAntlrParser;
+import org.eclipse.xtext.parser.antlr.XtextTokenStream;
+
+public class SensinactParser extends AbstractAntlrParser {
+
+ @Inject
+ private SensinactGrammarAccess grammarAccess;
+
+ @Override
+ protected void setInitialHiddenTokens(XtextTokenStream tokenStream) {
+ tokenStream.setInitialHiddenTokens("RULE_WS", "RULE_ML_COMMENT", "RULE_SL_COMMENT");
+ }
+
+
+ @Override
+ protected InternalSensinactParser createParser(XtextTokenStream stream) {
+ return new InternalSensinactParser(stream, getGrammarAccess());
+ }
+
+ @Override
+ protected String getDefaultRuleName() {
+ return "Sensinact";
+ }
+
+ public SensinactGrammarAccess getGrammarAccess() {
+ return this.grammarAccess;
+ }
+
+ public void setGrammarAccess(SensinactGrammarAccess grammarAccess) {
+ this.grammarAccess = grammarAccess;
+ }
+}
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/parser/antlr/internal/InternalSensinact.g b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/parser/antlr/internal/InternalSensinact.g
new file mode 100644
index 0000000..2b0be7c
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/parser/antlr/internal/InternalSensinact.g
@@ -0,0 +1,2847 @@
+/*
+ * generated by Xtext 2.9.1
+ */
+grammar InternalSensinact;
+
+options {
+ superClass=AbstractInternalAntlrParser;
+}
+
+@lexer::header {
+package org.eclipse.sensinact.studio.language.parser.antlr.internal;
+
+// Hack: Use our own Lexer superclass by means of import.
+// Currently there is no other way to specify the superclass for the lexer.
+import org.eclipse.xtext.parser.antlr.Lexer;
+}
+
+@parser::header {
+package org.eclipse.sensinact.studio.language.parser.antlr.internal;
+
+import org.eclipse.xtext.*;
+import org.eclipse.xtext.parser.*;
+import org.eclipse.xtext.parser.impl.*;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.xtext.parser.antlr.AbstractInternalAntlrParser;
+import org.eclipse.xtext.parser.antlr.XtextTokenStream;
+import org.eclipse.xtext.parser.antlr.XtextTokenStream.HiddenTokens;
+import org.eclipse.xtext.parser.antlr.AntlrDatatypeRuleToken;
+import org.eclipse.sensinact.studio.language.services.SensinactGrammarAccess;
+
+}
+
+@parser::members {
+
+ private SensinactGrammarAccess grammarAccess;
+
+ public InternalSensinactParser(TokenStream input, SensinactGrammarAccess grammarAccess) {
+ this(input);
+ this.grammarAccess = grammarAccess;
+ registerRules(grammarAccess.getGrammar());
+ }
+
+ @Override
+ protected String getFirstRuleName() {
+ return "Sensinact";
+ }
+
+ @Override
+ protected SensinactGrammarAccess getGrammarAccess() {
+ return grammarAccess;
+ }
+
+}
+
+@rulecatch {
+ catch (RecognitionException re) {
+ recover(input,re);
+ appendSkippedTokens();
+ }
+}
+
+// Entry rule entryRuleSensinact
+entryRuleSensinact returns [EObject current=null]:
+ { newCompositeNode(grammarAccess.getSensinactRule()); }
+ iv_ruleSensinact=ruleSensinact
+ { $current=$iv_ruleSensinact.current; }
+ EOF;
+
+// Rule Sensinact
+ruleSensinact returns [EObject current=null]
+@init {
+ enterRule();
+}
+@after {
+ leaveRule();
+}:
+ (
+ (
+ {
+ $current = forceCreateModelElement(
+ grammarAccess.getSensinactAccess().getSensinactAction_0(),
+ $current);
+ }
+ )
+ (
+ (
+ {
+ newCompositeNode(grammarAccess.getSensinactAccess().getEcaDSL_SENSINACTParserRuleCall_1_0());
+ }
+ lv_eca_1_0=ruleDSL_SENSINACT
+ {
+ if ($current==null) {
+ $current = createModelElementForParent(grammarAccess.getSensinactRule());
+ }
+ set(
+ $current,
+ "eca",
+ lv_eca_1_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_SENSINACT");
+ afterParserOrEnumRuleCall();
+ }
+ )
+ )
+ )
+;
+
+// Entry rule entryRuleDSL_SENSINACT
+entryRuleDSL_SENSINACT returns [EObject current=null]:
+ { newCompositeNode(grammarAccess.getDSL_SENSINACTRule()); }
+ iv_ruleDSL_SENSINACT=ruleDSL_SENSINACT
+ { $current=$iv_ruleDSL_SENSINACT.current; }
+ EOF;
+
+// Rule DSL_SENSINACT
+ruleDSL_SENSINACT returns [EObject current=null]
+@init {
+ enterRule();
+}
+@after {
+ leaveRule();
+}:
+ (
+ (
+ (
+ {
+ newCompositeNode(grammarAccess.getDSL_SENSINACTAccess().getResourcesDSL_ResourceParserRuleCall_0_0());
+ }
+ lv_resources_0_0=ruleDSL_Resource
+ {
+ if ($current==null) {
+ $current = createModelElementForParent(grammarAccess.getDSL_SENSINACTRule());
+ }
+ add(
+ $current,
+ "resources",
+ lv_resources_0_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_Resource");
+ afterParserOrEnumRuleCall();
+ }
+ )
+ )+
+ (
+ (
+ {
+ newCompositeNode(grammarAccess.getDSL_SENSINACTAccess().getCepDSL_CEP_STATEMENTParserRuleCall_1_0());
+ }
+ lv_cep_1_0=ruleDSL_CEP_STATEMENT
+ {
+ if ($current==null) {
+ $current = createModelElementForParent(grammarAccess.getDSL_SENSINACTRule());
+ }
+ add(
+ $current,
+ "cep",
+ lv_cep_1_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_CEP_STATEMENT");
+ afterParserOrEnumRuleCall();
+ }
+ )
+ )*
+ (
+ (
+ {
+ newCompositeNode(grammarAccess.getDSL_SENSINACTAccess().getOnDSL_OnParserRuleCall_2_0());
+ }
+ lv_on_2_0=ruleDSL_On
+ {
+ if ($current==null) {
+ $current = createModelElementForParent(grammarAccess.getDSL_SENSINACTRule());
+ }
+ set(
+ $current,
+ "on",
+ lv_on_2_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_On");
+ afterParserOrEnumRuleCall();
+ }
+ )
+ )
+ (
+ (
+ {
+ newCompositeNode(grammarAccess.getDSL_SENSINACTAccess().getEcaDSL_ECA_STATEMENTParserRuleCall_3_0());
+ }
+ lv_eca_3_0=ruleDSL_ECA_STATEMENT
+ {
+ if ($current==null) {
+ $current = createModelElementForParent(grammarAccess.getDSL_SENSINACTRule());
+ }
+ set(
+ $current,
+ "eca",
+ lv_eca_3_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_ECA_STATEMENT");
+ afterParserOrEnumRuleCall();
+ }
+ )
+ )
+ )
+;
+
+// Entry rule entryRuleDSL_Resource
+entryRuleDSL_Resource returns [EObject current=null]:
+ { newCompositeNode(grammarAccess.getDSL_ResourceRule()); }
+ iv_ruleDSL_Resource=ruleDSL_Resource
+ { $current=$iv_ruleDSL_Resource.current; }
+ EOF;
+
+// Rule DSL_Resource
+ruleDSL_Resource returns [EObject current=null]
+@init {
+ enterRule();
+}
+@after {
+ leaveRule();
+}:
+ (
+ otherlv_0='resource'
+ {
+ newLeafNode(otherlv_0, grammarAccess.getDSL_ResourceAccess().getResourceKeyword_0());
+ }
+ (
+ (
+ lv_name_1_0=RULE_ID
+ {
+ newLeafNode(lv_name_1_0, grammarAccess.getDSL_ResourceAccess().getNameIDTerminalRuleCall_1_0());
+ }
+ {
+ if ($current==null) {
+ $current = createModelElement(grammarAccess.getDSL_ResourceRule());
+ }
+ setWithLastConsumed(
+ $current,
+ "name",
+ lv_name_1_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.ID");
+ }
+ )
+ )
+ otherlv_2='='
+ {
+ newLeafNode(otherlv_2, grammarAccess.getDSL_ResourceAccess().getEqualsSignKeyword_2());
+ }
+ otherlv_3='['
+ {
+ newLeafNode(otherlv_3, grammarAccess.getDSL_ResourceAccess().getLeftSquareBracketKeyword_3());
+ }
+ (
+ (
+ {
+ newCompositeNode(grammarAccess.getDSL_ResourceAccess().getGatewayIDEXTENDED_IDParserRuleCall_4_0());
+ }
+ lv_gatewayID_4_0=ruleEXTENDED_ID
+ {
+ if ($current==null) {
+ $current = createModelElementForParent(grammarAccess.getDSL_ResourceRule());
+ }
+ set(
+ $current,
+ "gatewayID",
+ lv_gatewayID_4_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.EXTENDED_ID");
+ afterParserOrEnumRuleCall();
+ }
+ )
+ )
+ otherlv_5='/'
+ {
+ newLeafNode(otherlv_5, grammarAccess.getDSL_ResourceAccess().getSolidusKeyword_5());
+ }
+ (
+ (
+ {
+ newCompositeNode(grammarAccess.getDSL_ResourceAccess().getDeviceIDEXTENDED_IDParserRuleCall_6_0());
+ }
+ lv_deviceID_6_0=ruleEXTENDED_ID
+ {
+ if ($current==null) {
+ $current = createModelElementForParent(grammarAccess.getDSL_ResourceRule());
+ }
+ set(
+ $current,
+ "deviceID",
+ lv_deviceID_6_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.EXTENDED_ID");
+ afterParserOrEnumRuleCall();
+ }
+ )
+ )
+ otherlv_7='/'
+ {
+ newLeafNode(otherlv_7, grammarAccess.getDSL_ResourceAccess().getSolidusKeyword_7());
+ }
+ (
+ (
+ {
+ newCompositeNode(grammarAccess.getDSL_ResourceAccess().getServiceIDEXTENDED_IDParserRuleCall_8_0());
+ }
+ lv_serviceID_8_0=ruleEXTENDED_ID
+ {
+ if ($current==null) {
+ $current = createModelElementForParent(grammarAccess.getDSL_ResourceRule());
+ }
+ set(
+ $current,
+ "serviceID",
+ lv_serviceID_8_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.EXTENDED_ID");
+ afterParserOrEnumRuleCall();
+ }
+ )
+ )
+ otherlv_9='/'
+ {
+ newLeafNode(otherlv_9, grammarAccess.getDSL_ResourceAccess().getSolidusKeyword_9());
+ }
+ (
+ (
+ {
+ newCompositeNode(grammarAccess.getDSL_ResourceAccess().getResourceIDEXTENDED_IDParserRuleCall_10_0());
+ }
+ lv_resourceID_10_0=ruleEXTENDED_ID
+ {
+ if ($current==null) {
+ $current = createModelElementForParent(grammarAccess.getDSL_ResourceRule());
+ }
+ set(
+ $current,
+ "resourceID",
+ lv_resourceID_10_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.EXTENDED_ID");
+ afterParserOrEnumRuleCall();
+ }
+ )
+ )
+ otherlv_11=']'
+ {
+ newLeafNode(otherlv_11, grammarAccess.getDSL_ResourceAccess().getRightSquareBracketKeyword_11());
+ }
+ )
+;
+
+// Entry rule entryRuleDSL_On
+entryRuleDSL_On returns [EObject current=null]:
+ { newCompositeNode(grammarAccess.getDSL_OnRule()); }
+ iv_ruleDSL_On=ruleDSL_On
+ { $current=$iv_ruleDSL_On.current; }
+ EOF;
+
+// Rule DSL_On
+ruleDSL_On returns [EObject current=null]
+@init {
+ enterRule();
+}
+@after {
+ leaveRule();
+}:
+ (
+ otherlv_0='on'
+ {
+ newLeafNode(otherlv_0, grammarAccess.getDSL_OnAccess().getOnKeyword_0());
+ }
+ (
+ (
+ {
+ newCompositeNode(grammarAccess.getDSL_OnAccess().getTriggersDSL_REF_CONDITIONParserRuleCall_1_0());
+ }
+ lv_triggers_1_0=ruleDSL_REF_CONDITION
+ {
+ if ($current==null) {
+ $current = createModelElementForParent(grammarAccess.getDSL_OnRule());
+ }
+ add(
+ $current,
+ "triggers",
+ lv_triggers_1_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_REF_CONDITION");
+ afterParserOrEnumRuleCall();
+ }
+ )
+ )
+ (
+ otherlv_2=','
+ {
+ newLeafNode(otherlv_2, grammarAccess.getDSL_OnAccess().getCommaKeyword_2_0());
+ }
+ (
+ (
+ {
+ newCompositeNode(grammarAccess.getDSL_OnAccess().getTriggersDSL_REF_CONDITIONParserRuleCall_2_1_0());
+ }
+ lv_triggers_3_0=ruleDSL_REF_CONDITION
+ {
+ if ($current==null) {
+ $current = createModelElementForParent(grammarAccess.getDSL_OnRule());
+ }
+ add(
+ $current,
+ "triggers",
+ lv_triggers_3_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_REF_CONDITION");
+ afterParserOrEnumRuleCall();
+ }
+ )
+ )
+ )*
+ )
+;
+
+// Entry rule entryRuleDSL_ECA_STATEMENT
+entryRuleDSL_ECA_STATEMENT returns [EObject current=null]:
+ { newCompositeNode(grammarAccess.getDSL_ECA_STATEMENTRule()); }
+ iv_ruleDSL_ECA_STATEMENT=ruleDSL_ECA_STATEMENT
+ { $current=$iv_ruleDSL_ECA_STATEMENT.current; }
+ EOF;
+
+// Rule DSL_ECA_STATEMENT
+ruleDSL_ECA_STATEMENT returns [EObject current=null]
+@init {
+ enterRule();
+}
+@after {
+ leaveRule();
+}:
+ (
+ (
+ (
+ {
+ newCompositeNode(grammarAccess.getDSL_ECA_STATEMENTAccess().getIfdoDSL_IfDoParserRuleCall_0_0());
+ }
+ lv_ifdo_0_0=ruleDSL_IfDo
+ {
+ if ($current==null) {
+ $current = createModelElementForParent(grammarAccess.getDSL_ECA_STATEMENTRule());
+ }
+ set(
+ $current,
+ "ifdo",
+ lv_ifdo_0_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_IfDo");
+ afterParserOrEnumRuleCall();
+ }
+ )
+ )
+ (
+ (
+ {
+ newCompositeNode(grammarAccess.getDSL_ECA_STATEMENTAccess().getElseIfdoDSL_ElseIfDoParserRuleCall_1_0());
+ }
+ lv_elseIfdo_1_0=ruleDSL_ElseIfDo
+ {
+ if ($current==null) {
+ $current = createModelElementForParent(grammarAccess.getDSL_ECA_STATEMENTRule());
+ }
+ add(
+ $current,
+ "elseIfdo",
+ lv_elseIfdo_1_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_ElseIfDo");
+ afterParserOrEnumRuleCall();
+ }
+ )
+ )*
+ (
+ (
+ {
+ newCompositeNode(grammarAccess.getDSL_ECA_STATEMENTAccess().getElsedoDSL_ElseDoParserRuleCall_2_0());
+ }
+ lv_elsedo_2_0=ruleDSL_ElseDo
+ {
+ if ($current==null) {
+ $current = createModelElementForParent(grammarAccess.getDSL_ECA_STATEMENTRule());
+ }
+ set(
+ $current,
+ "elsedo",
+ lv_elsedo_2_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_ElseDo");
+ afterParserOrEnumRuleCall();
+ }
+ )
+ )?
+ otherlv_3='end if'
+ {
+ newLeafNode(otherlv_3, grammarAccess.getDSL_ECA_STATEMENTAccess().getEndIfKeyword_3());
+ }
+ )
+;
+
+// Entry rule entryRuleDSL_IfDo
+entryRuleDSL_IfDo returns [EObject current=null]:
+ { newCompositeNode(grammarAccess.getDSL_IfDoRule()); }
+ iv_ruleDSL_IfDo=ruleDSL_IfDo
+ { $current=$iv_ruleDSL_IfDo.current; }
+ EOF;
+
+// Rule DSL_IfDo
+ruleDSL_IfDo returns [EObject current=null]
+@init {
+ enterRule();
+}
+@after {
+ leaveRule();
+}:
+ (
+ otherlv_0='if'
+ {
+ newLeafNode(otherlv_0, grammarAccess.getDSL_IfDoAccess().getIfKeyword_0());
+ }
+ (
+ (
+ {
+ newCompositeNode(grammarAccess.getDSL_IfDoAccess().getConditionDSL_Expression_OrParserRuleCall_1_0());
+ }
+ lv_condition_1_0=ruleDSL_Expression_Or
+ {
+ if ($current==null) {
+ $current = createModelElementForParent(grammarAccess.getDSL_IfDoRule());
+ }
+ set(
+ $current,
+ "condition",
+ lv_condition_1_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_Expression_Or");
+ afterParserOrEnumRuleCall();
+ }
+ )
+ )
+ otherlv_2='do'
+ {
+ newLeafNode(otherlv_2, grammarAccess.getDSL_IfDoAccess().getDoKeyword_2());
+ }
+ (
+ (
+ {
+ newCompositeNode(grammarAccess.getDSL_IfDoAccess().getActionsDSL_ListActionsParserRuleCall_3_0());
+ }
+ lv_actions_3_0=ruleDSL_ListActions
+ {
+ if ($current==null) {
+ $current = createModelElementForParent(grammarAccess.getDSL_IfDoRule());
+ }
+ set(
+ $current,
+ "actions",
+ lv_actions_3_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_ListActions");
+ afterParserOrEnumRuleCall();
+ }
+ )
+ )
+ )
+;
+
+// Entry rule entryRuleDSL_ElseIfDo
+entryRuleDSL_ElseIfDo returns [EObject current=null]:
+ { newCompositeNode(grammarAccess.getDSL_ElseIfDoRule()); }
+ iv_ruleDSL_ElseIfDo=ruleDSL_ElseIfDo
+ { $current=$iv_ruleDSL_ElseIfDo.current; }
+ EOF;
+
+// Rule DSL_ElseIfDo
+ruleDSL_ElseIfDo returns [EObject current=null]
+@init {
+ enterRule();
+}
+@after {
+ leaveRule();
+}:
+ (
+ otherlv_0='else if'
+ {
+ newLeafNode(otherlv_0, grammarAccess.getDSL_ElseIfDoAccess().getElseIfKeyword_0());
+ }
+ (
+ (
+ {
+ newCompositeNode(grammarAccess.getDSL_ElseIfDoAccess().getConditionDSL_Expression_OrParserRuleCall_1_0());
+ }
+ lv_condition_1_0=ruleDSL_Expression_Or
+ {
+ if ($current==null) {
+ $current = createModelElementForParent(grammarAccess.getDSL_ElseIfDoRule());
+ }
+ set(
+ $current,
+ "condition",
+ lv_condition_1_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_Expression_Or");
+ afterParserOrEnumRuleCall();
+ }
+ )
+ )
+ otherlv_2='do'
+ {
+ newLeafNode(otherlv_2, grammarAccess.getDSL_ElseIfDoAccess().getDoKeyword_2());
+ }
+ (
+ (
+ {
+ newCompositeNode(grammarAccess.getDSL_ElseIfDoAccess().getActionsDSL_ListActionsParserRuleCall_3_0());
+ }
+ lv_actions_3_0=ruleDSL_ListActions
+ {
+ if ($current==null) {
+ $current = createModelElementForParent(grammarAccess.getDSL_ElseIfDoRule());
+ }
+ set(
+ $current,
+ "actions",
+ lv_actions_3_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_ListActions");
+ afterParserOrEnumRuleCall();
+ }
+ )
+ )
+ )
+;
+
+// Entry rule entryRuleDSL_ElseDo
+entryRuleDSL_ElseDo returns [EObject current=null]:
+ { newCompositeNode(grammarAccess.getDSL_ElseDoRule()); }
+ iv_ruleDSL_ElseDo=ruleDSL_ElseDo
+ { $current=$iv_ruleDSL_ElseDo.current; }
+ EOF;
+
+// Rule DSL_ElseDo
+ruleDSL_ElseDo returns [EObject current=null]
+@init {
+ enterRule();
+}
+@after {
+ leaveRule();
+}:
+ (
+ otherlv_0='else do'
+ {
+ newLeafNode(otherlv_0, grammarAccess.getDSL_ElseDoAccess().getElseDoKeyword_0());
+ }
+ (
+ (
+ {
+ newCompositeNode(grammarAccess.getDSL_ElseDoAccess().getActionsDSL_ListActionsParserRuleCall_1_0());
+ }
+ lv_actions_1_0=ruleDSL_ListActions
+ {
+ if ($current==null) {
+ $current = createModelElementForParent(grammarAccess.getDSL_ElseDoRule());
+ }
+ set(
+ $current,
+ "actions",
+ lv_actions_1_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_ListActions");
+ afterParserOrEnumRuleCall();
+ }
+ )
+ )
+ )
+;
+
+// Entry rule entryRuleNUMBER
+entryRuleNUMBER returns [String current=null]:
+ { newCompositeNode(grammarAccess.getNUMBERRule()); }
+ iv_ruleNUMBER=ruleNUMBER
+ { $current=$iv_ruleNUMBER.current.getText(); }
+ EOF;
+
+// Rule NUMBER
+ruleNUMBER returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
+@init {
+ enterRule();
+}
+@after {
+ leaveRule();
+}:
+ (
+ this_INT_0=RULE_INT
+ {
+ $current.merge(this_INT_0);
+ }
+ {
+ newLeafNode(this_INT_0, grammarAccess.getNUMBERAccess().getINTTerminalRuleCall_0());
+ }
+ |
+ (
+ this_INT_1=RULE_INT
+ {
+ $current.merge(this_INT_1);
+ }
+ {
+ newLeafNode(this_INT_1, grammarAccess.getNUMBERAccess().getINTTerminalRuleCall_1_0());
+ }
+ kw='.'
+ {
+ $current.merge(kw);
+ newLeafNode(kw, grammarAccess.getNUMBERAccess().getFullStopKeyword_1_1());
+ }
+ this_INT_3=RULE_INT
+ {
+ $current.merge(this_INT_3);
+ }
+ {
+ newLeafNode(this_INT_3, grammarAccess.getNUMBERAccess().getINTTerminalRuleCall_1_2());
+ }
+ )
+ )
+;
+
+// Entry rule entryRuleEXTENDED_ID
+entryRuleEXTENDED_ID returns [String current=null]:
+ { newCompositeNode(grammarAccess.getEXTENDED_IDRule()); }
+ iv_ruleEXTENDED_ID=ruleEXTENDED_ID
+ { $current=$iv_ruleEXTENDED_ID.current.getText(); }
+ EOF;
+
+// Rule EXTENDED_ID
+ruleEXTENDED_ID returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
+@init {
+ enterRule();
+}
+@after {
+ leaveRule();
+}:
+ (
+ this_ID_0=RULE_ID
+ {
+ $current.merge(this_ID_0);
+ }
+ {
+ newLeafNode(this_ID_0, grammarAccess.getEXTENDED_IDAccess().getIDTerminalRuleCall_0());
+ }
+ (
+ kw='.'
+ {
+ $current.merge(kw);
+ newLeafNode(kw, grammarAccess.getEXTENDED_IDAccess().getFullStopKeyword_1_0());
+ }
+ this_ID_2=RULE_ID
+ {
+ $current.merge(this_ID_2);
+ }
+ {
+ newLeafNode(this_ID_2, grammarAccess.getEXTENDED_IDAccess().getIDTerminalRuleCall_1_1());
+ }
+ )*
+ )
+;
+
+// Entry rule entryRuleDSL_REF_CONDITION
+entryRuleDSL_REF_CONDITION returns [EObject current=null]:
+ { newCompositeNode(grammarAccess.getDSL_REF_CONDITIONRule()); }
+ iv_ruleDSL_REF_CONDITION=ruleDSL_REF_CONDITION
+ { $current=$iv_ruleDSL_REF_CONDITION.current; }
+ EOF;
+
+// Rule DSL_REF_CONDITION
+ruleDSL_REF_CONDITION returns [EObject current=null]
+@init {
+ enterRule();
+}
+@after {
+ leaveRule();
+}:
+ (
+ (
+ (
+ {
+ if ($current==null) {
+ $current = createModelElement(grammarAccess.getDSL_REF_CONDITIONRule());
+ }
+ }
+ otherlv_0=RULE_ID
+ {
+ newLeafNode(otherlv_0, grammarAccess.getDSL_REF_CONDITIONAccess().getRefDSL_REFCrossReference_0_0());
+ }
+ )
+ )
+ otherlv_1='.'
+ {
+ newLeafNode(otherlv_1, grammarAccess.getDSL_REF_CONDITIONAccess().getFullStopKeyword_1());
+ }
+ otherlv_2='subscribe'
+ {
+ newLeafNode(otherlv_2, grammarAccess.getDSL_REF_CONDITIONAccess().getSubscribeKeyword_2());
+ }
+ otherlv_3='('
+ {
+ newLeafNode(otherlv_3, grammarAccess.getDSL_REF_CONDITIONAccess().getLeftParenthesisKeyword_3());
+ }
+ otherlv_4=')'
+ {
+ newLeafNode(otherlv_4, grammarAccess.getDSL_REF_CONDITIONAccess().getRightParenthesisKeyword_4());
+ }
+ )
+;
+
+// Entry rule entryRuleDSL_CEP_STATEMENT
+entryRuleDSL_CEP_STATEMENT returns [EObject current=null]:
+ { newCompositeNode(grammarAccess.getDSL_CEP_STATEMENTRule()); }
+ iv_ruleDSL_CEP_STATEMENT=ruleDSL_CEP_STATEMENT
+ { $current=$iv_ruleDSL_CEP_STATEMENT.current; }
+ EOF;
+
+// Rule DSL_CEP_STATEMENT
+ruleDSL_CEP_STATEMENT returns [EObject current=null]
+@init {
+ enterRule();
+}
+@after {
+ leaveRule();
+}:
+ (
+ otherlv_0='define'
+ {
+ newLeafNode(otherlv_0, grammarAccess.getDSL_CEP_STATEMENTAccess().getDefineKeyword_0());
+ }
+ (
+ (
+ lv_name_1_0=RULE_ID
+ {
+ newLeafNode(lv_name_1_0, grammarAccess.getDSL_CEP_STATEMENTAccess().getNameIDTerminalRuleCall_1_0());
+ }
+ {
+ if ($current==null) {
+ $current = createModelElement(grammarAccess.getDSL_CEP_STATEMENTRule());
+ }
+ setWithLastConsumed(
+ $current,
+ "name",
+ lv_name_1_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.ID");
+ }
+ )
+ )
+ otherlv_2='='
+ {
+ newLeafNode(otherlv_2, grammarAccess.getDSL_CEP_STATEMENTAccess().getEqualsSignKeyword_2());
+ }
+ (
+ (
+ (
+ {
+ newCompositeNode(grammarAccess.getDSL_CEP_STATEMENTAccess().getOperationDSL_CEP_AFTERParserRuleCall_3_0_0());
+ }
+ lv_operation_3_1=ruleDSL_CEP_AFTER
+ {
+ if ($current==null) {
+ $current = createModelElementForParent(grammarAccess.getDSL_CEP_STATEMENTRule());
+ }
+ set(
+ $current,
+ "operation",
+ lv_operation_3_1,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_CEP_AFTER");
+ afterParserOrEnumRuleCall();
+ }
+ |
+ {
+ newCompositeNode(grammarAccess.getDSL_CEP_STATEMENTAccess().getOperationDSL_CEP_BEFOREParserRuleCall_3_0_1());
+ }
+ lv_operation_3_2=ruleDSL_CEP_BEFORE
+ {
+ if ($current==null) {
+ $current = createModelElementForParent(grammarAccess.getDSL_CEP_STATEMENTRule());
+ }
+ set(
+ $current,
+ "operation",
+ lv_operation_3_2,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_CEP_BEFORE");
+ afterParserOrEnumRuleCall();
+ }
+ |
+ {
+ newCompositeNode(grammarAccess.getDSL_CEP_STATEMENTAccess().getOperationDSL_CEP_COINCIDEParserRuleCall_3_0_2());
+ }
+ lv_operation_3_3=ruleDSL_CEP_COINCIDE
+ {
+ if ($current==null) {
+ $current = createModelElementForParent(grammarAccess.getDSL_CEP_STATEMENTRule());
+ }
+ set(
+ $current,
+ "operation",
+ lv_operation_3_3,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_CEP_COINCIDE");
+ afterParserOrEnumRuleCall();
+ }
+ |
+ {
+ newCompositeNode(grammarAccess.getDSL_CEP_STATEMENTAccess().getOperationDSL_CEP_MINParserRuleCall_3_0_3());
+ }
+ lv_operation_3_4=ruleDSL_CEP_MIN
+ {
+ if ($current==null) {
+ $current = createModelElementForParent(grammarAccess.getDSL_CEP_STATEMENTRule());
+ }
+ set(
+ $current,
+ "operation",
+ lv_operation_3_4,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_CEP_MIN");
+ afterParserOrEnumRuleCall();
+ }
+ |
+ {
+ newCompositeNode(grammarAccess.getDSL_CEP_STATEMENTAccess().getOperationDSL_CEP_MAXParserRuleCall_3_0_4());
+ }
+ lv_operation_3_5=ruleDSL_CEP_MAX
+ {
+ if ($current==null) {
+ $current = createModelElementForParent(grammarAccess.getDSL_CEP_STATEMENTRule());
+ }
+ set(
+ $current,
+ "operation",
+ lv_operation_3_5,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_CEP_MAX");
+ afterParserOrEnumRuleCall();
+ }
+ |
+ {
+ newCompositeNode(grammarAccess.getDSL_CEP_STATEMENTAccess().getOperationDSL_CEP_AVGParserRuleCall_3_0_5());
+ }
+ lv_operation_3_6=ruleDSL_CEP_AVG
+ {
+ if ($current==null) {
+ $current = createModelElementForParent(grammarAccess.getDSL_CEP_STATEMENTRule());
+ }
+ set(
+ $current,
+ "operation",
+ lv_operation_3_6,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_CEP_AVG");
+ afterParserOrEnumRuleCall();
+ }
+ |
+ {
+ newCompositeNode(grammarAccess.getDSL_CEP_STATEMENTAccess().getOperationDSL_CEP_SUMParserRuleCall_3_0_6());
+ }
+ lv_operation_3_7=ruleDSL_CEP_SUM
+ {
+ if ($current==null) {
+ $current = createModelElementForParent(grammarAccess.getDSL_CEP_STATEMENTRule());
+ }
+ set(
+ $current,
+ "operation",
+ lv_operation_3_7,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_CEP_SUM");
+ afterParserOrEnumRuleCall();
+ }
+ |
+ {
+ newCompositeNode(grammarAccess.getDSL_CEP_STATEMENTAccess().getOperationDSL_CEP_COUNTParserRuleCall_3_0_7());
+ }
+ lv_operation_3_8=ruleDSL_CEP_COUNT
+ {
+ if ($current==null) {
+ $current = createModelElementForParent(grammarAccess.getDSL_CEP_STATEMENTRule());
+ }
+ set(
+ $current,
+ "operation",
+ lv_operation_3_8,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_CEP_COUNT");
+ afterParserOrEnumRuleCall();
+ }
+ )
+ )
+ )
+ )
+;
+
+// Entry rule entryRuleDSL_CEP_AFTER
+entryRuleDSL_CEP_AFTER returns [EObject current=null]:
+ { newCompositeNode(grammarAccess.getDSL_CEP_AFTERRule()); }
+ iv_ruleDSL_CEP_AFTER=ruleDSL_CEP_AFTER
+ { $current=$iv_ruleDSL_CEP_AFTER.current; }
+ EOF;
+
+// Rule DSL_CEP_AFTER
+ruleDSL_CEP_AFTER returns [EObject current=null]
+@init {
+ enterRule();
+}
+@after {
+ leaveRule();
+}:
+ (
+ otherlv_0='after'
+ {
+ newLeafNode(otherlv_0, grammarAccess.getDSL_CEP_AFTERAccess().getAfterKeyword_0());
+ }
+ otherlv_1='('
+ {
+ newLeafNode(otherlv_1, grammarAccess.getDSL_CEP_AFTERAccess().getLeftParenthesisKeyword_1());
+ }
+ (
+ (
+ {
+ newCompositeNode(grammarAccess.getDSL_CEP_AFTERAccess().getRef1DSL_REF_CONDITIONParserRuleCall_2_0());
+ }
+ lv_ref1_2_0=ruleDSL_REF_CONDITION
+ {
+ if ($current==null) {
+ $current = createModelElementForParent(grammarAccess.getDSL_CEP_AFTERRule());
+ }
+ set(
+ $current,
+ "ref1",
+ lv_ref1_2_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_REF_CONDITION");
+ afterParserOrEnumRuleCall();
+ }
+ )
+ )
+ otherlv_3=','
+ {
+ newLeafNode(otherlv_3, grammarAccess.getDSL_CEP_AFTERAccess().getCommaKeyword_3());
+ }
+ (
+ (
+ {
+ newCompositeNode(grammarAccess.getDSL_CEP_AFTERAccess().getRef2DSL_REF_CONDITIONParserRuleCall_4_0());
+ }
+ lv_ref2_4_0=ruleDSL_REF_CONDITION
+ {
+ if ($current==null) {
+ $current = createModelElementForParent(grammarAccess.getDSL_CEP_AFTERRule());
+ }
+ set(
+ $current,
+ "ref2",
+ lv_ref2_4_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_REF_CONDITION");
+ afterParserOrEnumRuleCall();
+ }
+ )
+ )
+ otherlv_5=','
+ {
+ newLeafNode(otherlv_5, grammarAccess.getDSL_CEP_AFTERAccess().getCommaKeyword_5());
+ }
+ (
+ (
+ (
+ {
+ newCompositeNode(grammarAccess.getDSL_CEP_AFTERAccess().getStartDSL_CEP_DURATIONParserRuleCall_6_0_0());
+ }
+ lv_start_6_0=ruleDSL_CEP_DURATION
+ {
+ if ($current==null) {
+ $current = createModelElementForParent(grammarAccess.getDSL_CEP_AFTERRule());
+ }
+ set(
+ $current,
+ "start",
+ lv_start_6_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_CEP_DURATION");
+ afterParserOrEnumRuleCall();
+ }
+ )
+ )
+ otherlv_7=','
+ {
+ newLeafNode(otherlv_7, grammarAccess.getDSL_CEP_AFTERAccess().getCommaKeyword_6_1());
+ }
+ )?
+ (
+ (
+ {
+ newCompositeNode(grammarAccess.getDSL_CEP_AFTERAccess().getEndDSL_CEP_DURATIONParserRuleCall_7_0());
+ }
+ lv_end_8_0=ruleDSL_CEP_DURATION
+ {
+ if ($current==null) {
+ $current = createModelElementForParent(grammarAccess.getDSL_CEP_AFTERRule());
+ }
+ set(
+ $current,
+ "end",
+ lv_end_8_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_CEP_DURATION");
+ afterParserOrEnumRuleCall();
+ }
+ )
+ )
+ otherlv_9=')'
+ {
+ newLeafNode(otherlv_9, grammarAccess.getDSL_CEP_AFTERAccess().getRightParenthesisKeyword_8());
+ }
+ )
+;
+
+// Entry rule entryRuleDSL_CEP_BEFORE
+entryRuleDSL_CEP_BEFORE returns [EObject current=null]:
+ { newCompositeNode(grammarAccess.getDSL_CEP_BEFORERule()); }
+ iv_ruleDSL_CEP_BEFORE=ruleDSL_CEP_BEFORE
+ { $current=$iv_ruleDSL_CEP_BEFORE.current; }
+ EOF;
+
+// Rule DSL_CEP_BEFORE
+ruleDSL_CEP_BEFORE returns [EObject current=null]
+@init {
+ enterRule();
+}
+@after {
+ leaveRule();
+}:
+ (
+ otherlv_0='before'
+ {
+ newLeafNode(otherlv_0, grammarAccess.getDSL_CEP_BEFOREAccess().getBeforeKeyword_0());
+ }
+ otherlv_1='('
+ {
+ newLeafNode(otherlv_1, grammarAccess.getDSL_CEP_BEFOREAccess().getLeftParenthesisKeyword_1());
+ }
+ (
+ (
+ {
+ newCompositeNode(grammarAccess.getDSL_CEP_BEFOREAccess().getRef1DSL_REF_CONDITIONParserRuleCall_2_0());
+ }
+ lv_ref1_2_0=ruleDSL_REF_CONDITION
+ {
+ if ($current==null) {
+ $current = createModelElementForParent(grammarAccess.getDSL_CEP_BEFORERule());
+ }
+ set(
+ $current,
+ "ref1",
+ lv_ref1_2_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_REF_CONDITION");
+ afterParserOrEnumRuleCall();
+ }
+ )
+ )
+ otherlv_3=','
+ {
+ newLeafNode(otherlv_3, grammarAccess.getDSL_CEP_BEFOREAccess().getCommaKeyword_3());
+ }
+ (
+ (
+ {
+ newCompositeNode(grammarAccess.getDSL_CEP_BEFOREAccess().getRef2DSL_REF_CONDITIONParserRuleCall_4_0());
+ }
+ lv_ref2_4_0=ruleDSL_REF_CONDITION
+ {
+ if ($current==null) {
+ $current = createModelElementForParent(grammarAccess.getDSL_CEP_BEFORERule());
+ }
+ set(
+ $current,
+ "ref2",
+ lv_ref2_4_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_REF_CONDITION");
+ afterParserOrEnumRuleCall();
+ }
+ )
+ )
+ otherlv_5=','
+ {
+ newLeafNode(otherlv_5, grammarAccess.getDSL_CEP_BEFOREAccess().getCommaKeyword_5());
+ }
+ (
+ (
+ (
+ {
+ newCompositeNode(grammarAccess.getDSL_CEP_BEFOREAccess().getStartDSL_CEP_DURATIONParserRuleCall_6_0_0());
+ }
+ lv_start_6_0=ruleDSL_CEP_DURATION
+ {
+ if ($current==null) {
+ $current = createModelElementForParent(grammarAccess.getDSL_CEP_BEFORERule());
+ }
+ set(
+ $current,
+ "start",
+ lv_start_6_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_CEP_DURATION");
+ afterParserOrEnumRuleCall();
+ }
+ )
+ )
+ otherlv_7=','
+ {
+ newLeafNode(otherlv_7, grammarAccess.getDSL_CEP_BEFOREAccess().getCommaKeyword_6_1());
+ }
+ )?
+ (
+ (
+ {
+ newCompositeNode(grammarAccess.getDSL_CEP_BEFOREAccess().getEndDSL_CEP_DURATIONParserRuleCall_7_0());
+ }
+ lv_end_8_0=ruleDSL_CEP_DURATION
+ {
+ if ($current==null) {
+ $current = createModelElementForParent(grammarAccess.getDSL_CEP_BEFORERule());
+ }
+ set(
+ $current,
+ "end",
+ lv_end_8_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_CEP_DURATION");
+ afterParserOrEnumRuleCall();
+ }
+ )
+ )
+ otherlv_9=')'
+ {
+ newLeafNode(otherlv_9, grammarAccess.getDSL_CEP_BEFOREAccess().getRightParenthesisKeyword_8());
+ }
+ )
+;
+
+// Entry rule entryRuleDSL_CEP_COINCIDE
+entryRuleDSL_CEP_COINCIDE returns [EObject current=null]:
+ { newCompositeNode(grammarAccess.getDSL_CEP_COINCIDERule()); }
+ iv_ruleDSL_CEP_COINCIDE=ruleDSL_CEP_COINCIDE
+ { $current=$iv_ruleDSL_CEP_COINCIDE.current; }
+ EOF;
+
+// Rule DSL_CEP_COINCIDE
+ruleDSL_CEP_COINCIDE returns [EObject current=null]
+@init {
+ enterRule();
+}
+@after {
+ leaveRule();
+}:
+ (
+ otherlv_0='coincide'
+ {
+ newLeafNode(otherlv_0, grammarAccess.getDSL_CEP_COINCIDEAccess().getCoincideKeyword_0());
+ }
+ otherlv_1='('
+ {
+ newLeafNode(otherlv_1, grammarAccess.getDSL_CEP_COINCIDEAccess().getLeftParenthesisKeyword_1());
+ }
+ (
+ (
+ {
+ newCompositeNode(grammarAccess.getDSL_CEP_COINCIDEAccess().getRef1DSL_REF_CONDITIONParserRuleCall_2_0());
+ }
+ lv_ref1_2_0=ruleDSL_REF_CONDITION
+ {
+ if ($current==null) {
+ $current = createModelElementForParent(grammarAccess.getDSL_CEP_COINCIDERule());
+ }
+ set(
+ $current,
+ "ref1",
+ lv_ref1_2_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_REF_CONDITION");
+ afterParserOrEnumRuleCall();
+ }
+ )
+ )
+ otherlv_3=','
+ {
+ newLeafNode(otherlv_3, grammarAccess.getDSL_CEP_COINCIDEAccess().getCommaKeyword_3());
+ }
+ (
+ (
+ {
+ newCompositeNode(grammarAccess.getDSL_CEP_COINCIDEAccess().getRef2DSL_REF_CONDITIONParserRuleCall_4_0());
+ }
+ lv_ref2_4_0=ruleDSL_REF_CONDITION
+ {
+ if ($current==null) {
+ $current = createModelElementForParent(grammarAccess.getDSL_CEP_COINCIDERule());
+ }
+ set(
+ $current,
+ "ref2",
+ lv_ref2_4_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_REF_CONDITION");
+ afterParserOrEnumRuleCall();
+ }
+ )
+ )
+ otherlv_5=','
+ {
+ newLeafNode(otherlv_5, grammarAccess.getDSL_CEP_COINCIDEAccess().getCommaKeyword_5());
+ }
+ (
+ (
+ {
+ newCompositeNode(grammarAccess.getDSL_CEP_COINCIDEAccess().getWindowDSL_CEP_DURATIONParserRuleCall_6_0());
+ }
+ lv_window_6_0=ruleDSL_CEP_DURATION
+ {
+ if ($current==null) {
+ $current = createModelElementForParent(grammarAccess.getDSL_CEP_COINCIDERule());
+ }
+ set(
+ $current,
+ "window",
+ lv_window_6_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_CEP_DURATION");
+ afterParserOrEnumRuleCall();
+ }
+ )
+ )
+ otherlv_7=')'
+ {
+ newLeafNode(otherlv_7, grammarAccess.getDSL_CEP_COINCIDEAccess().getRightParenthesisKeyword_7());
+ }
+ )
+;
+
+// Entry rule entryRuleDSL_CEP_MIN
+entryRuleDSL_CEP_MIN returns [EObject current=null]:
+ { newCompositeNode(grammarAccess.getDSL_CEP_MINRule()); }
+ iv_ruleDSL_CEP_MIN=ruleDSL_CEP_MIN
+ { $current=$iv_ruleDSL_CEP_MIN.current; }
+ EOF;
+
+// Rule DSL_CEP_MIN
+ruleDSL_CEP_MIN returns [EObject current=null]
+@init {
+ enterRule();
+}
+@after {
+ leaveRule();
+}:
+ (
+ otherlv_0='min'
+ {
+ newLeafNode(otherlv_0, grammarAccess.getDSL_CEP_MINAccess().getMinKeyword_0());
+ }
+ otherlv_1='('
+ {
+ newLeafNode(otherlv_1, grammarAccess.getDSL_CEP_MINAccess().getLeftParenthesisKeyword_1());
+ }
+ (
+ (
+ {
+ newCompositeNode(grammarAccess.getDSL_CEP_MINAccess().getRefDSL_REF_CONDITIONParserRuleCall_2_0());
+ }
+ lv_ref_2_0=ruleDSL_REF_CONDITION
+ {
+ if ($current==null) {
+ $current = createModelElementForParent(grammarAccess.getDSL_CEP_MINRule());
+ }
+ set(
+ $current,
+ "ref",
+ lv_ref_2_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_REF_CONDITION");
+ afterParserOrEnumRuleCall();
+ }
+ )
+ )
+ otherlv_3=','
+ {
+ newLeafNode(otherlv_3, grammarAccess.getDSL_CEP_MINAccess().getCommaKeyword_3());
+ }
+ (
+ (
+ {
+ newCompositeNode(grammarAccess.getDSL_CEP_MINAccess().getWindowDSL_CEP_DURATIONParserRuleCall_4_0());
+ }
+ lv_window_4_0=ruleDSL_CEP_DURATION
+ {
+ if ($current==null) {
+ $current = createModelElementForParent(grammarAccess.getDSL_CEP_MINRule());
+ }
+ set(
+ $current,
+ "window",
+ lv_window_4_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_CEP_DURATION");
+ afterParserOrEnumRuleCall();
+ }
+ )
+ )
+ otherlv_5=')'
+ {
+ newLeafNode(otherlv_5, grammarAccess.getDSL_CEP_MINAccess().getRightParenthesisKeyword_5());
+ }
+ )
+;
+
+// Entry rule entryRuleDSL_CEP_MAX
+entryRuleDSL_CEP_MAX returns [EObject current=null]:
+ { newCompositeNode(grammarAccess.getDSL_CEP_MAXRule()); }
+ iv_ruleDSL_CEP_MAX=ruleDSL_CEP_MAX
+ { $current=$iv_ruleDSL_CEP_MAX.current; }
+ EOF;
+
+// Rule DSL_CEP_MAX
+ruleDSL_CEP_MAX returns [EObject current=null]
+@init {
+ enterRule();
+}
+@after {
+ leaveRule();
+}:
+ (
+ otherlv_0='max'
+ {
+ newLeafNode(otherlv_0, grammarAccess.getDSL_CEP_MAXAccess().getMaxKeyword_0());
+ }
+ otherlv_1='('
+ {
+ newLeafNode(otherlv_1, grammarAccess.getDSL_CEP_MAXAccess().getLeftParenthesisKeyword_1());
+ }
+ (
+ (
+ {
+ newCompositeNode(grammarAccess.getDSL_CEP_MAXAccess().getRefDSL_REF_CONDITIONParserRuleCall_2_0());
+ }
+ lv_ref_2_0=ruleDSL_REF_CONDITION
+ {
+ if ($current==null) {
+ $current = createModelElementForParent(grammarAccess.getDSL_CEP_MAXRule());
+ }
+ set(
+ $current,
+ "ref",
+ lv_ref_2_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_REF_CONDITION");
+ afterParserOrEnumRuleCall();
+ }
+ )
+ )
+ otherlv_3=','
+ {
+ newLeafNode(otherlv_3, grammarAccess.getDSL_CEP_MAXAccess().getCommaKeyword_3());
+ }
+ (
+ (
+ {
+ newCompositeNode(grammarAccess.getDSL_CEP_MAXAccess().getWindowDSL_CEP_DURATIONParserRuleCall_4_0());
+ }
+ lv_window_4_0=ruleDSL_CEP_DURATION
+ {
+ if ($current==null) {
+ $current = createModelElementForParent(grammarAccess.getDSL_CEP_MAXRule());
+ }
+ set(
+ $current,
+ "window",
+ lv_window_4_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_CEP_DURATION");
+ afterParserOrEnumRuleCall();
+ }
+ )
+ )
+ otherlv_5=')'
+ {
+ newLeafNode(otherlv_5, grammarAccess.getDSL_CEP_MAXAccess().getRightParenthesisKeyword_5());
+ }
+ )
+;
+
+// Entry rule entryRuleDSL_CEP_AVG
+entryRuleDSL_CEP_AVG returns [EObject current=null]:
+ { newCompositeNode(grammarAccess.getDSL_CEP_AVGRule()); }
+ iv_ruleDSL_CEP_AVG=ruleDSL_CEP_AVG
+ { $current=$iv_ruleDSL_CEP_AVG.current; }
+ EOF;
+
+// Rule DSL_CEP_AVG
+ruleDSL_CEP_AVG returns [EObject current=null]
+@init {
+ enterRule();
+}
+@after {
+ leaveRule();
+}:
+ (
+ otherlv_0='avg'
+ {
+ newLeafNode(otherlv_0, grammarAccess.getDSL_CEP_AVGAccess().getAvgKeyword_0());
+ }
+ otherlv_1='('
+ {
+ newLeafNode(otherlv_1, grammarAccess.getDSL_CEP_AVGAccess().getLeftParenthesisKeyword_1());
+ }
+ (
+ (
+ {
+ newCompositeNode(grammarAccess.getDSL_CEP_AVGAccess().getRefDSL_REF_CONDITIONParserRuleCall_2_0());
+ }
+ lv_ref_2_0=ruleDSL_REF_CONDITION
+ {
+ if ($current==null) {
+ $current = createModelElementForParent(grammarAccess.getDSL_CEP_AVGRule());
+ }
+ set(
+ $current,
+ "ref",
+ lv_ref_2_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_REF_CONDITION");
+ afterParserOrEnumRuleCall();
+ }
+ )
+ )
+ otherlv_3=','
+ {
+ newLeafNode(otherlv_3, grammarAccess.getDSL_CEP_AVGAccess().getCommaKeyword_3());
+ }
+ (
+ (
+ {
+ newCompositeNode(grammarAccess.getDSL_CEP_AVGAccess().getWindowDSL_CEP_DURATIONParserRuleCall_4_0());
+ }
+ lv_window_4_0=ruleDSL_CEP_DURATION
+ {
+ if ($current==null) {
+ $current = createModelElementForParent(grammarAccess.getDSL_CEP_AVGRule());
+ }
+ set(
+ $current,
+ "window",
+ lv_window_4_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_CEP_DURATION");
+ afterParserOrEnumRuleCall();
+ }
+ )
+ )
+ otherlv_5=')'
+ {
+ newLeafNode(otherlv_5, grammarAccess.getDSL_CEP_AVGAccess().getRightParenthesisKeyword_5());
+ }
+ )
+;
+
+// Entry rule entryRuleDSL_CEP_SUM
+entryRuleDSL_CEP_SUM returns [EObject current=null]:
+ { newCompositeNode(grammarAccess.getDSL_CEP_SUMRule()); }
+ iv_ruleDSL_CEP_SUM=ruleDSL_CEP_SUM
+ { $current=$iv_ruleDSL_CEP_SUM.current; }
+ EOF;
+
+// Rule DSL_CEP_SUM
+ruleDSL_CEP_SUM returns [EObject current=null]
+@init {
+ enterRule();
+}
+@after {
+ leaveRule();
+}:
+ (
+ otherlv_0='sum'
+ {
+ newLeafNode(otherlv_0, grammarAccess.getDSL_CEP_SUMAccess().getSumKeyword_0());
+ }
+ otherlv_1='('
+ {
+ newLeafNode(otherlv_1, grammarAccess.getDSL_CEP_SUMAccess().getLeftParenthesisKeyword_1());
+ }
+ (
+ (
+ {
+ newCompositeNode(grammarAccess.getDSL_CEP_SUMAccess().getRefDSL_REF_CONDITIONParserRuleCall_2_0());
+ }
+ lv_ref_2_0=ruleDSL_REF_CONDITION
+ {
+ if ($current==null) {
+ $current = createModelElementForParent(grammarAccess.getDSL_CEP_SUMRule());
+ }
+ set(
+ $current,
+ "ref",
+ lv_ref_2_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_REF_CONDITION");
+ afterParserOrEnumRuleCall();
+ }
+ )
+ )
+ otherlv_3=','
+ {
+ newLeafNode(otherlv_3, grammarAccess.getDSL_CEP_SUMAccess().getCommaKeyword_3());
+ }
+ (
+ (
+ {
+ newCompositeNode(grammarAccess.getDSL_CEP_SUMAccess().getWindowDSL_CEP_DURATIONParserRuleCall_4_0());
+ }
+ lv_window_4_0=ruleDSL_CEP_DURATION
+ {
+ if ($current==null) {
+ $current = createModelElementForParent(grammarAccess.getDSL_CEP_SUMRule());
+ }
+ set(
+ $current,
+ "window",
+ lv_window_4_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_CEP_DURATION");
+ afterParserOrEnumRuleCall();
+ }
+ )
+ )
+ otherlv_5=')'
+ {
+ newLeafNode(otherlv_5, grammarAccess.getDSL_CEP_SUMAccess().getRightParenthesisKeyword_5());
+ }
+ )
+;
+
+// Entry rule entryRuleDSL_CEP_COUNT
+entryRuleDSL_CEP_COUNT returns [EObject current=null]:
+ { newCompositeNode(grammarAccess.getDSL_CEP_COUNTRule()); }
+ iv_ruleDSL_CEP_COUNT=ruleDSL_CEP_COUNT
+ { $current=$iv_ruleDSL_CEP_COUNT.current; }
+ EOF;
+
+// Rule DSL_CEP_COUNT
+ruleDSL_CEP_COUNT returns [EObject current=null]
+@init {
+ enterRule();
+}
+@after {
+ leaveRule();
+}:
+ (
+ otherlv_0='count'
+ {
+ newLeafNode(otherlv_0, grammarAccess.getDSL_CEP_COUNTAccess().getCountKeyword_0());
+ }
+ otherlv_1='('
+ {
+ newLeafNode(otherlv_1, grammarAccess.getDSL_CEP_COUNTAccess().getLeftParenthesisKeyword_1());
+ }
+ (
+ (
+ {
+ newCompositeNode(grammarAccess.getDSL_CEP_COUNTAccess().getRefDSL_REF_CONDITIONParserRuleCall_2_0());
+ }
+ lv_ref_2_0=ruleDSL_REF_CONDITION
+ {
+ if ($current==null) {
+ $current = createModelElementForParent(grammarAccess.getDSL_CEP_COUNTRule());
+ }
+ set(
+ $current,
+ "ref",
+ lv_ref_2_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_REF_CONDITION");
+ afterParserOrEnumRuleCall();
+ }
+ )
+ )
+ otherlv_3=','
+ {
+ newLeafNode(otherlv_3, grammarAccess.getDSL_CEP_COUNTAccess().getCommaKeyword_3());
+ }
+ (
+ (
+ {
+ newCompositeNode(grammarAccess.getDSL_CEP_COUNTAccess().getWindowDSL_CEP_DURATIONParserRuleCall_4_0());
+ }
+ lv_window_4_0=ruleDSL_CEP_DURATION
+ {
+ if ($current==null) {
+ $current = createModelElementForParent(grammarAccess.getDSL_CEP_COUNTRule());
+ }
+ set(
+ $current,
+ "window",
+ lv_window_4_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_CEP_DURATION");
+ afterParserOrEnumRuleCall();
+ }
+ )
+ )
+ otherlv_5=')'
+ {
+ newLeafNode(otherlv_5, grammarAccess.getDSL_CEP_COUNTAccess().getRightParenthesisKeyword_5());
+ }
+ )
+;
+
+// Entry rule entryRuleDSL_CEP_DURATION
+entryRuleDSL_CEP_DURATION returns [EObject current=null]:
+ { newCompositeNode(grammarAccess.getDSL_CEP_DURATIONRule()); }
+ iv_ruleDSL_CEP_DURATION=ruleDSL_CEP_DURATION
+ { $current=$iv_ruleDSL_CEP_DURATION.current; }
+ EOF;
+
+// Rule DSL_CEP_DURATION
+ruleDSL_CEP_DURATION returns [EObject current=null]
+@init {
+ enterRule();
+}
+@after {
+ leaveRule();
+}:
+ (
+ (
+ (
+ {
+ newCompositeNode(grammarAccess.getDSL_CEP_DURATIONAccess().getUnitsDSL_CEP_DURATION_MINParserRuleCall_0_0());
+ }
+ lv_units_0_1=ruleDSL_CEP_DURATION_MIN
+ {
+ if ($current==null) {
+ $current = createModelElementForParent(grammarAccess.getDSL_CEP_DURATIONRule());
+ }
+ add(
+ $current,
+ "units",
+ lv_units_0_1,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_CEP_DURATION_MIN");
+ afterParserOrEnumRuleCall();
+ }
+ |
+ {
+ newCompositeNode(grammarAccess.getDSL_CEP_DURATIONAccess().getUnitsDSL_CEP_DURATION_SECParserRuleCall_0_1());
+ }
+ lv_units_0_2=ruleDSL_CEP_DURATION_SEC
+ {
+ if ($current==null) {
+ $current = createModelElementForParent(grammarAccess.getDSL_CEP_DURATIONRule());
+ }
+ add(
+ $current,
+ "units",
+ lv_units_0_2,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_CEP_DURATION_SEC");
+ afterParserOrEnumRuleCall();
+ }
+ )
+ )
+ )+
+;
+
+// Entry rule entryRuleDSL_CEP_DURATION_MIN
+entryRuleDSL_CEP_DURATION_MIN returns [EObject current=null]:
+ { newCompositeNode(grammarAccess.getDSL_CEP_DURATION_MINRule()); }
+ iv_ruleDSL_CEP_DURATION_MIN=ruleDSL_CEP_DURATION_MIN
+ { $current=$iv_ruleDSL_CEP_DURATION_MIN.current; }
+ EOF;
+
+// Rule DSL_CEP_DURATION_MIN
+ruleDSL_CEP_DURATION_MIN returns [EObject current=null]
+@init {
+ enterRule();
+}
+@after {
+ leaveRule();
+}:
+ (
+ (
+ (
+ {
+ newCompositeNode(grammarAccess.getDSL_CEP_DURATION_MINAccess().getMinNUMBERParserRuleCall_0_0());
+ }
+ lv_min_0_0=ruleNUMBER
+ {
+ if ($current==null) {
+ $current = createModelElementForParent(grammarAccess.getDSL_CEP_DURATION_MINRule());
+ }
+ set(
+ $current,
+ "min",
+ lv_min_0_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.NUMBER");
+ afterParserOrEnumRuleCall();
+ }
+ )
+ )
+ otherlv_1='min'
+ {
+ newLeafNode(otherlv_1, grammarAccess.getDSL_CEP_DURATION_MINAccess().getMinKeyword_1());
+ }
+ )
+;
+
+// Entry rule entryRuleDSL_CEP_DURATION_SEC
+entryRuleDSL_CEP_DURATION_SEC returns [EObject current=null]:
+ { newCompositeNode(grammarAccess.getDSL_CEP_DURATION_SECRule()); }
+ iv_ruleDSL_CEP_DURATION_SEC=ruleDSL_CEP_DURATION_SEC
+ { $current=$iv_ruleDSL_CEP_DURATION_SEC.current; }
+ EOF;
+
+// Rule DSL_CEP_DURATION_SEC
+ruleDSL_CEP_DURATION_SEC returns [EObject current=null]
+@init {
+ enterRule();
+}
+@after {
+ leaveRule();
+}:
+ (
+ (
+ (
+ {
+ newCompositeNode(grammarAccess.getDSL_CEP_DURATION_SECAccess().getSecNUMBERParserRuleCall_0_0());
+ }
+ lv_sec_0_0=ruleNUMBER
+ {
+ if ($current==null) {
+ $current = createModelElementForParent(grammarAccess.getDSL_CEP_DURATION_SECRule());
+ }
+ set(
+ $current,
+ "sec",
+ lv_sec_0_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.NUMBER");
+ afterParserOrEnumRuleCall();
+ }
+ )
+ )
+ otherlv_1='sec'
+ {
+ newLeafNode(otherlv_1, grammarAccess.getDSL_CEP_DURATION_SECAccess().getSecKeyword_1());
+ }
+ )
+;
+
+// Entry rule entryRuleDSL_ListActions
+entryRuleDSL_ListActions returns [EObject current=null]:
+ { newCompositeNode(grammarAccess.getDSL_ListActionsRule()); }
+ iv_ruleDSL_ListActions=ruleDSL_ListActions
+ { $current=$iv_ruleDSL_ListActions.current; }
+ EOF;
+
+// Rule DSL_ListActions
+ruleDSL_ListActions returns [EObject current=null]
+@init {
+ enterRule();
+}
+@after {
+ leaveRule();
+}:
+ (
+ (
+ (
+ {
+ newCompositeNode(grammarAccess.getDSL_ListActionsAccess().getActionListDSL_ResourceActionParserRuleCall_0_0());
+ }
+ lv_actionList_0_0=ruleDSL_ResourceAction
+ {
+ if ($current==null) {
+ $current = createModelElementForParent(grammarAccess.getDSL_ListActionsRule());
+ }
+ add(
+ $current,
+ "actionList",
+ lv_actionList_0_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_ResourceAction");
+ afterParserOrEnumRuleCall();
+ }
+ )
+ )
+ (
+ otherlv_1=','
+ {
+ newLeafNode(otherlv_1, grammarAccess.getDSL_ListActionsAccess().getCommaKeyword_1_0());
+ }
+ (
+ (
+ {
+ newCompositeNode(grammarAccess.getDSL_ListActionsAccess().getActionListDSL_ResourceActionParserRuleCall_1_1_0());
+ }
+ lv_actionList_2_0=ruleDSL_ResourceAction
+ {
+ if ($current==null) {
+ $current = createModelElementForParent(grammarAccess.getDSL_ListActionsRule());
+ }
+ add(
+ $current,
+ "actionList",
+ lv_actionList_2_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_ResourceAction");
+ afterParserOrEnumRuleCall();
+ }
+ )
+ )
+ )*
+ )
+;
+
+// Entry rule entryRuleDSL_ResourceAction
+entryRuleDSL_ResourceAction returns [EObject current=null]:
+ { newCompositeNode(grammarAccess.getDSL_ResourceActionRule()); }
+ iv_ruleDSL_ResourceAction=ruleDSL_ResourceAction
+ { $current=$iv_ruleDSL_ResourceAction.current; }
+ EOF;
+
+// Rule DSL_ResourceAction
+ruleDSL_ResourceAction returns [EObject current=null]
+@init {
+ enterRule();
+}
+@after {
+ leaveRule();
+}:
+ (
+ (
+ (
+ (
+ lv_variable_0_0=RULE_ID
+ {
+ newLeafNode(lv_variable_0_0, grammarAccess.getDSL_ResourceActionAccess().getVariableIDTerminalRuleCall_0_0_0());
+ }
+ {
+ if ($current==null) {
+ $current = createModelElement(grammarAccess.getDSL_ResourceActionRule());
+ }
+ setWithLastConsumed(
+ $current,
+ "variable",
+ lv_variable_0_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.ID");
+ }
+ )
+ )
+ otherlv_1='='
+ {
+ newLeafNode(otherlv_1, grammarAccess.getDSL_ResourceActionAccess().getEqualsSignKeyword_0_1());
+ }
+ )?
+ (
+ (
+ {
+ if ($current==null) {
+ $current = createModelElement(grammarAccess.getDSL_ResourceActionRule());
+ }
+ }
+ otherlv_2=RULE_ID
+ {
+ newLeafNode(otherlv_2, grammarAccess.getDSL_ResourceActionAccess().getRefDSL_REFCrossReference_1_0());
+ }
+ )
+ )
+ otherlv_3='.'
+ {
+ newLeafNode(otherlv_3, grammarAccess.getDSL_ResourceActionAccess().getFullStopKeyword_2());
+ }
+ (
+ (
+ (
+ lv_actiontype_4_1='act'
+ {
+ newLeafNode(lv_actiontype_4_1, grammarAccess.getDSL_ResourceActionAccess().getActiontypeActKeyword_3_0_0());
+ }
+ {
+ if ($current==null) {
+ $current = createModelElement(grammarAccess.getDSL_ResourceActionRule());
+ }
+ setWithLastConsumed($current, "actiontype", lv_actiontype_4_1, null);
+ }
+ |
+ lv_actiontype_4_2='set'
+ {
+ newLeafNode(lv_actiontype_4_2, grammarAccess.getDSL_ResourceActionAccess().getActiontypeSetKeyword_3_0_1());
+ }
+ {
+ if ($current==null) {
+ $current = createModelElement(grammarAccess.getDSL_ResourceActionRule());
+ }
+ setWithLastConsumed($current, "actiontype", lv_actiontype_4_2, null);
+ }
+ )
+ )
+ )
+ otherlv_5='('
+ {
+ newLeafNode(otherlv_5, grammarAccess.getDSL_ResourceActionAccess().getLeftParenthesisKeyword_4());
+ }
+ (
+ (
+ {
+ newCompositeNode(grammarAccess.getDSL_ResourceActionAccess().getListParamDSL_ListParamParserRuleCall_5_0());
+ }
+ lv_listParam_6_0=ruleDSL_ListParam
+ {
+ if ($current==null) {
+ $current = createModelElementForParent(grammarAccess.getDSL_ResourceActionRule());
+ }
+ set(
+ $current,
+ "listParam",
+ lv_listParam_6_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_ListParam");
+ afterParserOrEnumRuleCall();
+ }
+ )
+ )?
+ otherlv_7=')'
+ {
+ newLeafNode(otherlv_7, grammarAccess.getDSL_ResourceActionAccess().getRightParenthesisKeyword_6());
+ }
+ )
+;
+
+// Entry rule entryRuleDSL_ListParam
+entryRuleDSL_ListParam returns [EObject current=null]:
+ { newCompositeNode(grammarAccess.getDSL_ListParamRule()); }
+ iv_ruleDSL_ListParam=ruleDSL_ListParam
+ { $current=$iv_ruleDSL_ListParam.current; }
+ EOF;
+
+// Rule DSL_ListParam
+ruleDSL_ListParam returns [EObject current=null]
+@init {
+ enterRule();
+}
+@after {
+ leaveRule();
+}:
+ (
+ (
+ (
+ {
+ newCompositeNode(grammarAccess.getDSL_ListParamAccess().getParamDSL_Expression_OrParserRuleCall_0_0());
+ }
+ lv_param_0_0=ruleDSL_Expression_Or
+ {
+ if ($current==null) {
+ $current = createModelElementForParent(grammarAccess.getDSL_ListParamRule());
+ }
+ add(
+ $current,
+ "param",
+ lv_param_0_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_Expression_Or");
+ afterParserOrEnumRuleCall();
+ }
+ )
+ )
+ (
+ otherlv_1=','
+ {
+ newLeafNode(otherlv_1, grammarAccess.getDSL_ListParamAccess().getCommaKeyword_1_0());
+ }
+ (
+ (
+ {
+ newCompositeNode(grammarAccess.getDSL_ListParamAccess().getParamDSL_Expression_OrParserRuleCall_1_1_0());
+ }
+ lv_param_2_0=ruleDSL_Expression_Or
+ {
+ if ($current==null) {
+ $current = createModelElementForParent(grammarAccess.getDSL_ListParamRule());
+ }
+ add(
+ $current,
+ "param",
+ lv_param_2_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_Expression_Or");
+ afterParserOrEnumRuleCall();
+ }
+ )
+ )
+ )*
+ )
+;
+
+// Entry rule entryRuleDSL_Expression_Or
+entryRuleDSL_Expression_Or returns [EObject current=null]:
+ { newCompositeNode(grammarAccess.getDSL_Expression_OrRule()); }
+ iv_ruleDSL_Expression_Or=ruleDSL_Expression_Or
+ { $current=$iv_ruleDSL_Expression_Or.current; }
+ EOF;
+
+// Rule DSL_Expression_Or
+ruleDSL_Expression_Or returns [EObject current=null]
+@init {
+ enterRule();
+}
+@after {
+ leaveRule();
+}:
+ (
+ {
+ newCompositeNode(grammarAccess.getDSL_Expression_OrAccess().getDSL_Expression_AndParserRuleCall_0());
+ }
+ this_DSL_Expression_And_0=ruleDSL_Expression_And
+ {
+ $current = $this_DSL_Expression_And_0.current;
+ afterParserOrEnumRuleCall();
+ }
+ (
+ otherlv_1='or'
+ {
+ newLeafNode(otherlv_1, grammarAccess.getDSL_Expression_OrAccess().getOrKeyword_1_0());
+ }
+ (
+ {
+ $current = forceCreateModelElementAndSet(
+ grammarAccess.getDSL_Expression_OrAccess().getDSL_Expression_OrLeftAction_1_1(),
+ $current);
+ }
+ )
+ (
+ (
+ {
+ newCompositeNode(grammarAccess.getDSL_Expression_OrAccess().getRightDSL_Expression_AndParserRuleCall_1_2_0());
+ }
+ lv_right_3_0=ruleDSL_Expression_And
+ {
+ if ($current==null) {
+ $current = createModelElementForParent(grammarAccess.getDSL_Expression_OrRule());
+ }
+ set(
+ $current,
+ "right",
+ lv_right_3_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_Expression_And");
+ afterParserOrEnumRuleCall();
+ }
+ )
+ )
+ )*
+ )
+;
+
+// Entry rule entryRuleDSL_Expression_And
+entryRuleDSL_Expression_And returns [EObject current=null]:
+ { newCompositeNode(grammarAccess.getDSL_Expression_AndRule()); }
+ iv_ruleDSL_Expression_And=ruleDSL_Expression_And
+ { $current=$iv_ruleDSL_Expression_And.current; }
+ EOF;
+
+// Rule DSL_Expression_And
+ruleDSL_Expression_And returns [EObject current=null]
+@init {
+ enterRule();
+}
+@after {
+ leaveRule();
+}:
+ (
+ {
+ newCompositeNode(grammarAccess.getDSL_Expression_AndAccess().getDSL_Expression_DiffEqualParserRuleCall_0());
+ }
+ this_DSL_Expression_DiffEqual_0=ruleDSL_Expression_DiffEqual
+ {
+ $current = $this_DSL_Expression_DiffEqual_0.current;
+ afterParserOrEnumRuleCall();
+ }
+ (
+ otherlv_1='and'
+ {
+ newLeafNode(otherlv_1, grammarAccess.getDSL_Expression_AndAccess().getAndKeyword_1_0());
+ }
+ (
+ {
+ $current = forceCreateModelElementAndSet(
+ grammarAccess.getDSL_Expression_AndAccess().getDSL_Expression_AndLeftAction_1_1(),
+ $current);
+ }
+ )
+ (
+ (
+ {
+ newCompositeNode(grammarAccess.getDSL_Expression_AndAccess().getRightDSL_Expression_DiffEqualParserRuleCall_1_2_0());
+ }
+ lv_right_3_0=ruleDSL_Expression_DiffEqual
+ {
+ if ($current==null) {
+ $current = createModelElementForParent(grammarAccess.getDSL_Expression_AndRule());
+ }
+ set(
+ $current,
+ "right",
+ lv_right_3_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_Expression_DiffEqual");
+ afterParserOrEnumRuleCall();
+ }
+ )
+ )
+ )*
+ )
+;
+
+// Entry rule entryRuleDSL_Expression_DiffEqual
+entryRuleDSL_Expression_DiffEqual returns [EObject current=null]:
+ { newCompositeNode(grammarAccess.getDSL_Expression_DiffEqualRule()); }
+ iv_ruleDSL_Expression_DiffEqual=ruleDSL_Expression_DiffEqual
+ { $current=$iv_ruleDSL_Expression_DiffEqual.current; }
+ EOF;
+
+// Rule DSL_Expression_DiffEqual
+ruleDSL_Expression_DiffEqual returns [EObject current=null]
+@init {
+ enterRule();
+}
+@after {
+ leaveRule();
+}:
+ (
+ {
+ newCompositeNode(grammarAccess.getDSL_Expression_DiffEqualAccess().getDSL_Expression_CompareParserRuleCall_0());
+ }
+ this_DSL_Expression_Compare_0=ruleDSL_Expression_Compare
+ {
+ $current = $this_DSL_Expression_Compare_0.current;
+ afterParserOrEnumRuleCall();
+ }
+ (
+ (
+ otherlv_1='!='
+ {
+ newLeafNode(otherlv_1, grammarAccess.getDSL_Expression_DiffEqualAccess().getExclamationMarkEqualsSignKeyword_1_0_0());
+ }
+ (
+ {
+ $current = forceCreateModelElementAndSet(
+ grammarAccess.getDSL_Expression_DiffEqualAccess().getDSL_Expression_DiffLeftAction_1_0_1(),
+ $current);
+ }
+ )
+ (
+ (
+ {
+ newCompositeNode(grammarAccess.getDSL_Expression_DiffEqualAccess().getRightDSL_Expression_CompareParserRuleCall_1_0_2_0());
+ }
+ lv_right_3_0=ruleDSL_Expression_Compare
+ {
+ if ($current==null) {
+ $current = createModelElementForParent(grammarAccess.getDSL_Expression_DiffEqualRule());
+ }
+ set(
+ $current,
+ "right",
+ lv_right_3_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_Expression_Compare");
+ afterParserOrEnumRuleCall();
+ }
+ )
+ )
+ )
+ |
+ (
+ otherlv_4='=='
+ {
+ newLeafNode(otherlv_4, grammarAccess.getDSL_Expression_DiffEqualAccess().getEqualsSignEqualsSignKeyword_1_1_0());
+ }
+ (
+ {
+ $current = forceCreateModelElementAndSet(
+ grammarAccess.getDSL_Expression_DiffEqualAccess().getDSL_Expression_EqualLeftAction_1_1_1(),
+ $current);
+ }
+ )
+ (
+ (
+ {
+ newCompositeNode(grammarAccess.getDSL_Expression_DiffEqualAccess().getRightDSL_Expression_CompareParserRuleCall_1_1_2_0());
+ }
+ lv_right_6_0=ruleDSL_Expression_Compare
+ {
+ if ($current==null) {
+ $current = createModelElementForParent(grammarAccess.getDSL_Expression_DiffEqualRule());
+ }
+ set(
+ $current,
+ "right",
+ lv_right_6_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_Expression_Compare");
+ afterParserOrEnumRuleCall();
+ }
+ )
+ )
+ )
+ )*
+ )
+;
+
+// Entry rule entryRuleDSL_Expression_Compare
+entryRuleDSL_Expression_Compare returns [EObject current=null]:
+ { newCompositeNode(grammarAccess.getDSL_Expression_CompareRule()); }
+ iv_ruleDSL_Expression_Compare=ruleDSL_Expression_Compare
+ { $current=$iv_ruleDSL_Expression_Compare.current; }
+ EOF;
+
+// Rule DSL_Expression_Compare
+ruleDSL_Expression_Compare returns [EObject current=null]
+@init {
+ enterRule();
+}
+@after {
+ leaveRule();
+}:
+ (
+ {
+ newCompositeNode(grammarAccess.getDSL_Expression_CompareAccess().getDSL_Expression_PlusMinusParserRuleCall_0());
+ }
+ this_DSL_Expression_PlusMinus_0=ruleDSL_Expression_PlusMinus
+ {
+ $current = $this_DSL_Expression_PlusMinus_0.current;
+ afterParserOrEnumRuleCall();
+ }
+ (
+ (
+ otherlv_1='>'
+ {
+ newLeafNode(otherlv_1, grammarAccess.getDSL_Expression_CompareAccess().getGreaterThanSignKeyword_1_0_0());
+ }
+ (
+ {
+ $current = forceCreateModelElementAndSet(
+ grammarAccess.getDSL_Expression_CompareAccess().getDSL_Expression_LargerLeftAction_1_0_1(),
+ $current);
+ }
+ )
+ (
+ (
+ {
+ newCompositeNode(grammarAccess.getDSL_Expression_CompareAccess().getRightDSL_Expression_PlusMinusParserRuleCall_1_0_2_0());
+ }
+ lv_right_3_0=ruleDSL_Expression_PlusMinus
+ {
+ if ($current==null) {
+ $current = createModelElementForParent(grammarAccess.getDSL_Expression_CompareRule());
+ }
+ set(
+ $current,
+ "right",
+ lv_right_3_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_Expression_PlusMinus");
+ afterParserOrEnumRuleCall();
+ }
+ )
+ )
+ )
+ |
+ (
+ otherlv_4='>='
+ {
+ newLeafNode(otherlv_4, grammarAccess.getDSL_Expression_CompareAccess().getGreaterThanSignEqualsSignKeyword_1_1_0());
+ }
+ (
+ {
+ $current = forceCreateModelElementAndSet(
+ grammarAccess.getDSL_Expression_CompareAccess().getDSL_Expression_Larger_EqualLeftAction_1_1_1(),
+ $current);
+ }
+ )
+ (
+ (
+ {
+ newCompositeNode(grammarAccess.getDSL_Expression_CompareAccess().getRightDSL_Expression_PlusMinusParserRuleCall_1_1_2_0());
+ }
+ lv_right_6_0=ruleDSL_Expression_PlusMinus
+ {
+ if ($current==null) {
+ $current = createModelElementForParent(grammarAccess.getDSL_Expression_CompareRule());
+ }
+ set(
+ $current,
+ "right",
+ lv_right_6_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_Expression_PlusMinus");
+ afterParserOrEnumRuleCall();
+ }
+ )
+ )
+ )
+ |
+ (
+ otherlv_7='<'
+ {
+ newLeafNode(otherlv_7, grammarAccess.getDSL_Expression_CompareAccess().getLessThanSignKeyword_1_2_0());
+ }
+ (
+ {
+ $current = forceCreateModelElementAndSet(
+ grammarAccess.getDSL_Expression_CompareAccess().getDSL_Expression_SmallerLeftAction_1_2_1(),
+ $current);
+ }
+ )
+ (
+ (
+ {
+ newCompositeNode(grammarAccess.getDSL_Expression_CompareAccess().getRightDSL_Expression_PlusMinusParserRuleCall_1_2_2_0());
+ }
+ lv_right_9_0=ruleDSL_Expression_PlusMinus
+ {
+ if ($current==null) {
+ $current = createModelElementForParent(grammarAccess.getDSL_Expression_CompareRule());
+ }
+ set(
+ $current,
+ "right",
+ lv_right_9_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_Expression_PlusMinus");
+ afterParserOrEnumRuleCall();
+ }
+ )
+ )
+ )
+ |
+ (
+ otherlv_10='<='
+ {
+ newLeafNode(otherlv_10, grammarAccess.getDSL_Expression_CompareAccess().getLessThanSignEqualsSignKeyword_1_3_0());
+ }
+ (
+ {
+ $current = forceCreateModelElementAndSet(
+ grammarAccess.getDSL_Expression_CompareAccess().getDSL_Expression_Smaller_EqualLeftAction_1_3_1(),
+ $current);
+ }
+ )
+ (
+ (
+ {
+ newCompositeNode(grammarAccess.getDSL_Expression_CompareAccess().getRightDSL_Expression_PlusMinusParserRuleCall_1_3_2_0());
+ }
+ lv_right_12_0=ruleDSL_Expression_PlusMinus
+ {
+ if ($current==null) {
+ $current = createModelElementForParent(grammarAccess.getDSL_Expression_CompareRule());
+ }
+ set(
+ $current,
+ "right",
+ lv_right_12_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_Expression_PlusMinus");
+ afterParserOrEnumRuleCall();
+ }
+ )
+ )
+ )
+ )*
+ )
+;
+
+// Entry rule entryRuleDSL_Expression_PlusMinus
+entryRuleDSL_Expression_PlusMinus returns [EObject current=null]:
+ { newCompositeNode(grammarAccess.getDSL_Expression_PlusMinusRule()); }
+ iv_ruleDSL_Expression_PlusMinus=ruleDSL_Expression_PlusMinus
+ { $current=$iv_ruleDSL_Expression_PlusMinus.current; }
+ EOF;
+
+// Rule DSL_Expression_PlusMinus
+ruleDSL_Expression_PlusMinus returns [EObject current=null]
+@init {
+ enterRule();
+}
+@after {
+ leaveRule();
+}:
+ (
+ {
+ newCompositeNode(grammarAccess.getDSL_Expression_PlusMinusAccess().getDSL_Expression_MultiplicationDivisionParserRuleCall_0());
+ }
+ this_DSL_Expression_MultiplicationDivision_0=ruleDSL_Expression_MultiplicationDivision
+ {
+ $current = $this_DSL_Expression_MultiplicationDivision_0.current;
+ afterParserOrEnumRuleCall();
+ }
+ (
+ (
+ otherlv_1='+'
+ {
+ newLeafNode(otherlv_1, grammarAccess.getDSL_Expression_PlusMinusAccess().getPlusSignKeyword_1_0_0());
+ }
+ (
+ {
+ $current = forceCreateModelElementAndSet(
+ grammarAccess.getDSL_Expression_PlusMinusAccess().getDSL_Expression_PlusLeftAction_1_0_1(),
+ $current);
+ }
+ )
+ (
+ (
+ {
+ newCompositeNode(grammarAccess.getDSL_Expression_PlusMinusAccess().getRightDSL_Expression_MultiplicationDivisionParserRuleCall_1_0_2_0());
+ }
+ lv_right_3_0=ruleDSL_Expression_MultiplicationDivision
+ {
+ if ($current==null) {
+ $current = createModelElementForParent(grammarAccess.getDSL_Expression_PlusMinusRule());
+ }
+ set(
+ $current,
+ "right",
+ lv_right_3_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_Expression_MultiplicationDivision");
+ afterParserOrEnumRuleCall();
+ }
+ )
+ )
+ )
+ |
+ (
+ otherlv_4='-'
+ {
+ newLeafNode(otherlv_4, grammarAccess.getDSL_Expression_PlusMinusAccess().getHyphenMinusKeyword_1_1_0());
+ }
+ (
+ {
+ $current = forceCreateModelElementAndSet(
+ grammarAccess.getDSL_Expression_PlusMinusAccess().getDSL_Expression_MinusLeftAction_1_1_1(),
+ $current);
+ }
+ )
+ (
+ (
+ {
+ newCompositeNode(grammarAccess.getDSL_Expression_PlusMinusAccess().getRightDSL_Expression_MultiplicationDivisionParserRuleCall_1_1_2_0());
+ }
+ lv_right_6_0=ruleDSL_Expression_MultiplicationDivision
+ {
+ if ($current==null) {
+ $current = createModelElementForParent(grammarAccess.getDSL_Expression_PlusMinusRule());
+ }
+ set(
+ $current,
+ "right",
+ lv_right_6_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_Expression_MultiplicationDivision");
+ afterParserOrEnumRuleCall();
+ }
+ )
+ )
+ )
+ )*
+ )
+;
+
+// Entry rule entryRuleDSL_Expression_MultiplicationDivision
+entryRuleDSL_Expression_MultiplicationDivision returns [EObject current=null]:
+ { newCompositeNode(grammarAccess.getDSL_Expression_MultiplicationDivisionRule()); }
+ iv_ruleDSL_Expression_MultiplicationDivision=ruleDSL_Expression_MultiplicationDivision
+ { $current=$iv_ruleDSL_Expression_MultiplicationDivision.current; }
+ EOF;
+
+// Rule DSL_Expression_MultiplicationDivision
+ruleDSL_Expression_MultiplicationDivision returns [EObject current=null]
+@init {
+ enterRule();
+}
+@after {
+ leaveRule();
+}:
+ (
+ {
+ newCompositeNode(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getDSL_Expression_UnaryParserRuleCall_0());
+ }
+ this_DSL_Expression_Unary_0=ruleDSL_Expression_Unary
+ {
+ $current = $this_DSL_Expression_Unary_0.current;
+ afterParserOrEnumRuleCall();
+ }
+ (
+ (
+ otherlv_1='*'
+ {
+ newLeafNode(otherlv_1, grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getAsteriskKeyword_1_0_0());
+ }
+ (
+ {
+ $current = forceCreateModelElementAndSet(
+ grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getDSL_Expression_MultiplicationLeftAction_1_0_1(),
+ $current);
+ }
+ )
+ (
+ (
+ {
+ newCompositeNode(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getRightDSL_Expression_UnaryParserRuleCall_1_0_2_0());
+ }
+ lv_right_3_0=ruleDSL_Expression_Unary
+ {
+ if ($current==null) {
+ $current = createModelElementForParent(grammarAccess.getDSL_Expression_MultiplicationDivisionRule());
+ }
+ set(
+ $current,
+ "right",
+ lv_right_3_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_Expression_Unary");
+ afterParserOrEnumRuleCall();
+ }
+ )
+ )
+ )
+ |
+ (
+ otherlv_4='/'
+ {
+ newLeafNode(otherlv_4, grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getSolidusKeyword_1_1_0());
+ }
+ (
+ {
+ $current = forceCreateModelElementAndSet(
+ grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getDSL_Expression_DivisionLeftAction_1_1_1(),
+ $current);
+ }
+ )
+ (
+ (
+ {
+ newCompositeNode(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getRightDSL_Expression_UnaryParserRuleCall_1_1_2_0());
+ }
+ lv_right_6_0=ruleDSL_Expression_Unary
+ {
+ if ($current==null) {
+ $current = createModelElementForParent(grammarAccess.getDSL_Expression_MultiplicationDivisionRule());
+ }
+ set(
+ $current,
+ "right",
+ lv_right_6_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_Expression_Unary");
+ afterParserOrEnumRuleCall();
+ }
+ )
+ )
+ )
+ |
+ (
+ otherlv_7='%'
+ {
+ newLeafNode(otherlv_7, grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getPercentSignKeyword_1_2_0());
+ }
+ (
+ {
+ $current = forceCreateModelElementAndSet(
+ grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getDSL_Expression_ModuloLeftAction_1_2_1(),
+ $current);
+ }
+ )
+ (
+ (
+ {
+ newCompositeNode(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getRightDSL_Expression_UnaryParserRuleCall_1_2_2_0());
+ }
+ lv_right_9_0=ruleDSL_Expression_Unary
+ {
+ if ($current==null) {
+ $current = createModelElementForParent(grammarAccess.getDSL_Expression_MultiplicationDivisionRule());
+ }
+ set(
+ $current,
+ "right",
+ lv_right_9_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_Expression_Unary");
+ afterParserOrEnumRuleCall();
+ }
+ )
+ )
+ )
+ )*
+ )
+;
+
+// Entry rule entryRuleDSL_Expression_Unary
+entryRuleDSL_Expression_Unary returns [EObject current=null]:
+ { newCompositeNode(grammarAccess.getDSL_Expression_UnaryRule()); }
+ iv_ruleDSL_Expression_Unary=ruleDSL_Expression_Unary
+ { $current=$iv_ruleDSL_Expression_Unary.current; }
+ EOF;
+
+// Rule DSL_Expression_Unary
+ruleDSL_Expression_Unary returns [EObject current=null]
+@init {
+ enterRule();
+}
+@after {
+ leaveRule();
+}:
+ (
+ (
+ (
+ {
+ $current = forceCreateModelElement(
+ grammarAccess.getDSL_Expression_UnaryAccess().getDSL_Object_NumberAction_0_0(),
+ $current);
+ }
+ )
+ (
+ (
+ {
+ newCompositeNode(grammarAccess.getDSL_Expression_UnaryAccess().getValueNUMBERParserRuleCall_0_1_0());
+ }
+ lv_value_1_0=ruleNUMBER
+ {
+ if ($current==null) {
+ $current = createModelElementForParent(grammarAccess.getDSL_Expression_UnaryRule());
+ }
+ set(
+ $current,
+ "value",
+ lv_value_1_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.NUMBER");
+ afterParserOrEnumRuleCall();
+ }
+ )
+ )
+ )
+ |
+ (
+ (
+ {
+ $current = forceCreateModelElement(
+ grammarAccess.getDSL_Expression_UnaryAccess().getDSL_Object_StringAction_1_0(),
+ $current);
+ }
+ )
+ (
+ (
+ lv_value_3_0=RULE_STRING
+ {
+ newLeafNode(lv_value_3_0, grammarAccess.getDSL_Expression_UnaryAccess().getValueSTRINGTerminalRuleCall_1_1_0());
+ }
+ {
+ if ($current==null) {
+ $current = createModelElement(grammarAccess.getDSL_Expression_UnaryRule());
+ }
+ setWithLastConsumed(
+ $current,
+ "value",
+ lv_value_3_0,
+ "org.eclipse.xtext.common.Terminals.STRING");
+ }
+ )
+ )
+ )
+ |
+ (
+ (
+ {
+ $current = forceCreateModelElement(
+ grammarAccess.getDSL_Expression_UnaryAccess().getDSL_Object_BooleanAction_2_0(),
+ $current);
+ }
+ )
+ (
+ (
+ lv_value_5_0=RULE_BOOLEAN
+ {
+ newLeafNode(lv_value_5_0, grammarAccess.getDSL_Expression_UnaryAccess().getValueBOOLEANTerminalRuleCall_2_1_0());
+ }
+ {
+ if ($current==null) {
+ $current = createModelElement(grammarAccess.getDSL_Expression_UnaryRule());
+ }
+ setWithLastConsumed(
+ $current,
+ "value",
+ lv_value_5_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.BOOLEAN");
+ }
+ )
+ )
+ )
+ |
+ (
+ (
+ {
+ $current = forceCreateModelElement(
+ grammarAccess.getDSL_Expression_UnaryAccess().getDSL_Object_RefAction_3_0(),
+ $current);
+ }
+ )
+ (
+ (
+ {
+ if ($current==null) {
+ $current = createModelElement(grammarAccess.getDSL_Expression_UnaryRule());
+ }
+ }
+ otherlv_7=RULE_ID
+ {
+ newLeafNode(otherlv_7, grammarAccess.getDSL_Expression_UnaryAccess().getValueDSL_REFCrossReference_3_1_0());
+ }
+ )
+ )
+ otherlv_8='.get()'
+ {
+ newLeafNode(otherlv_8, grammarAccess.getDSL_Expression_UnaryAccess().getGetKeyword_3_2());
+ }
+ )
+ |
+ (
+ otherlv_9='('
+ {
+ newLeafNode(otherlv_9, grammarAccess.getDSL_Expression_UnaryAccess().getLeftParenthesisKeyword_4_0());
+ }
+ {
+ newCompositeNode(grammarAccess.getDSL_Expression_UnaryAccess().getDSL_Expression_OrParserRuleCall_4_1());
+ }
+ this_DSL_Expression_Or_10=ruleDSL_Expression_Or
+ {
+ $current = $this_DSL_Expression_Or_10.current;
+ afterParserOrEnumRuleCall();
+ }
+ otherlv_11=')'
+ {
+ newLeafNode(otherlv_11, grammarAccess.getDSL_Expression_UnaryAccess().getRightParenthesisKeyword_4_2());
+ }
+ )
+ |
+ (
+ otherlv_12='not'
+ {
+ newLeafNode(otherlv_12, grammarAccess.getDSL_Expression_UnaryAccess().getNotKeyword_5_0());
+ }
+ (
+ {
+ $current = forceCreateModelElement(
+ grammarAccess.getDSL_Expression_UnaryAccess().getDSL_Expression_NegateAction_5_1(),
+ $current);
+ }
+ )
+ (
+ (
+ {
+ newCompositeNode(grammarAccess.getDSL_Expression_UnaryAccess().getExpDSL_Expression_UnaryParserRuleCall_5_2_0());
+ }
+ lv_exp_14_0=ruleDSL_Expression_Unary
+ {
+ if ($current==null) {
+ $current = createModelElementForParent(grammarAccess.getDSL_Expression_UnaryRule());
+ }
+ set(
+ $current,
+ "exp",
+ lv_exp_14_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_Expression_Unary");
+ afterParserOrEnumRuleCall();
+ }
+ )
+ )
+ )
+ )
+;
+
+RULE_BOOLEAN : ('true'|'false');
+
+RULE_INT : ('0'..'9')+;
+
+RULE_ID : ('a'..'z'|'A'..'Z'|'_'|'0'..'9'|':'|'-')+;
+
+RULE_STRING : ('"' ('\\' .|~(('\\'|'"')))* '"'|'\'' ('\\' .|~(('\\'|'\'')))* '\'');
+
+RULE_ML_COMMENT : '/*' ( options {greedy=false;} : . )*'*/';
+
+RULE_SL_COMMENT : '//' ~(('\n'|'\r'))* ('\r'? '\n')?;
+
+RULE_WS : (' '|'\t'|'\r'|'\n')+;
+
+RULE_ANY_OTHER : .;
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/parser/antlr/internal/InternalSensinact.tokens b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/parser/antlr/internal/InternalSensinact.tokens
new file mode 100644
index 0000000..34b7da4
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/parser/antlr/internal/InternalSensinact.tokens
@@ -0,0 +1,92 @@
+'!='=42
+'%'=51
+'('=26
+')'=27
+'*'=50
+'+'=48
+','=18
+'-'=49
+'.'=24
+'.get()'=52
+'/'=15
+'<'=46
+'<='=47
+'='=13
+'=='=43
+'>'=44
+'>='=45
+'['=14
+']'=16
+'act'=38
+'after'=29
+'and'=41
+'avg'=34
+'before'=30
+'coincide'=31
+'count'=36
+'define'=28
+'do'=21
+'else do'=23
+'else if'=22
+'end if'=19
+'if'=20
+'max'=33
+'min'=32
+'not'=53
+'on'=17
+'or'=40
+'resource'=12
+'sec'=37
+'set'=39
+'subscribe'=25
+'sum'=35
+RULE_ANY_OTHER=11
+RULE_BOOLEAN=7
+RULE_ID=4
+RULE_INT=5
+RULE_ML_COMMENT=8
+RULE_SL_COMMENT=9
+RULE_STRING=6
+RULE_WS=10
+T__12=12
+T__13=13
+T__14=14
+T__15=15
+T__16=16
+T__17=17
+T__18=18
+T__19=19
+T__20=20
+T__21=21
+T__22=22
+T__23=23
+T__24=24
+T__25=25
+T__26=26
+T__27=27
+T__28=28
+T__29=29
+T__30=30
+T__31=31
+T__32=32
+T__33=33
+T__34=34
+T__35=35
+T__36=36
+T__37=37
+T__38=38
+T__39=39
+T__40=40
+T__41=41
+T__42=42
+T__43=43
+T__44=44
+T__45=45
+T__46=46
+T__47=47
+T__48=48
+T__49=49
+T__50=50
+T__51=51
+T__52=52
+T__53=53
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/parser/antlr/internal/InternalSensinactLexer.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/parser/antlr/internal/InternalSensinactLexer.java
new file mode 100644
index 0000000..e7874dc
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/parser/antlr/internal/InternalSensinactLexer.java
@@ -0,0 +1,2162 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.language.parser.antlr.internal;
+
+// Hack: Use our own Lexer superclass by means of import.
+// Currently there is no other way to specify the superclass for the lexer.
+import org.eclipse.xtext.parser.antlr.Lexer;
+
+
+import org.antlr.runtime.*;
+import java.util.Stack;
+import java.util.List;
+import java.util.ArrayList;
+
+@SuppressWarnings("all")
+public class InternalSensinactLexer extends Lexer {
+ public static final int T__50=50;
+ public static final int RULE_BOOLEAN=7;
+ public static final int T__19=19;
+ public static final int T__15=15;
+ public static final int T__16=16;
+ public static final int T__17=17;
+ public static final int T__18=18;
+ public static final int T__12=12;
+ public static final int T__13=13;
+ public static final int T__14=14;
+ public static final int T__51=51;
+ public static final int T__52=52;
+ public static final int T__53=53;
+ public static final int RULE_ID=4;
+ public static final int T__26=26;
+ public static final int T__27=27;
+ public static final int T__28=28;
+ public static final int RULE_INT=5;
+ public static final int T__29=29;
+ public static final int T__22=22;
+ public static final int RULE_ML_COMMENT=8;
+ public static final int T__23=23;
+ public static final int T__24=24;
+ public static final int T__25=25;
+ public static final int T__20=20;
+ public static final int T__21=21;
+ public static final int RULE_STRING=6;
+ public static final int RULE_SL_COMMENT=9;
+ public static final int T__37=37;
+ public static final int T__38=38;
+ public static final int T__39=39;
+ public static final int T__33=33;
+ public static final int T__34=34;
+ public static final int T__35=35;
+ public static final int T__36=36;
+ public static final int EOF=-1;
+ public static final int T__30=30;
+ public static final int T__31=31;
+ public static final int T__32=32;
+ public static final int RULE_WS=10;
+ public static final int RULE_ANY_OTHER=11;
+ public static final int T__48=48;
+ public static final int T__49=49;
+ public static final int T__44=44;
+ public static final int T__45=45;
+ public static final int T__46=46;
+ public static final int T__47=47;
+ public static final int T__40=40;
+ public static final int T__41=41;
+ public static final int T__42=42;
+ public static final int T__43=43;
+
+ // delegates
+ // delegators
+
+ public InternalSensinactLexer() {;}
+ public InternalSensinactLexer(CharStream input) {
+ this(input, new RecognizerSharedState());
+ }
+ public InternalSensinactLexer(CharStream input, RecognizerSharedState state) {
+ super(input,state);
+
+ }
+ public String getGrammarFileName() { return "InternalSensinact.g"; }
+
+ // $ANTLR start "T__12"
+ public final void mT__12() throws RecognitionException {
+ try {
+ int _type = T__12;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:11:7: ( 'resource' )
+ // InternalSensinact.g:11:9: 'resource'
+ {
+ match("resource");
+
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__12"
+
+ // $ANTLR start "T__13"
+ public final void mT__13() throws RecognitionException {
+ try {
+ int _type = T__13;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:12:7: ( '=' )
+ // InternalSensinact.g:12:9: '='
+ {
+ match('=');
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__13"
+
+ // $ANTLR start "T__14"
+ public final void mT__14() throws RecognitionException {
+ try {
+ int _type = T__14;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:13:7: ( '[' )
+ // InternalSensinact.g:13:9: '['
+ {
+ match('[');
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__14"
+
+ // $ANTLR start "T__15"
+ public final void mT__15() throws RecognitionException {
+ try {
+ int _type = T__15;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:14:7: ( '/' )
+ // InternalSensinact.g:14:9: '/'
+ {
+ match('/');
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__15"
+
+ // $ANTLR start "T__16"
+ public final void mT__16() throws RecognitionException {
+ try {
+ int _type = T__16;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:15:7: ( ']' )
+ // InternalSensinact.g:15:9: ']'
+ {
+ match(']');
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__16"
+
+ // $ANTLR start "T__17"
+ public final void mT__17() throws RecognitionException {
+ try {
+ int _type = T__17;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:16:7: ( 'on' )
+ // InternalSensinact.g:16:9: 'on'
+ {
+ match("on");
+
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__17"
+
+ // $ANTLR start "T__18"
+ public final void mT__18() throws RecognitionException {
+ try {
+ int _type = T__18;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:17:7: ( ',' )
+ // InternalSensinact.g:17:9: ','
+ {
+ match(',');
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__18"
+
+ // $ANTLR start "T__19"
+ public final void mT__19() throws RecognitionException {
+ try {
+ int _type = T__19;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:18:7: ( 'end if' )
+ // InternalSensinact.g:18:9: 'end if'
+ {
+ match("end if");
+
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__19"
+
+ // $ANTLR start "T__20"
+ public final void mT__20() throws RecognitionException {
+ try {
+ int _type = T__20;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:19:7: ( 'if' )
+ // InternalSensinact.g:19:9: 'if'
+ {
+ match("if");
+
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__20"
+
+ // $ANTLR start "T__21"
+ public final void mT__21() throws RecognitionException {
+ try {
+ int _type = T__21;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:20:7: ( 'do' )
+ // InternalSensinact.g:20:9: 'do'
+ {
+ match("do");
+
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__21"
+
+ // $ANTLR start "T__22"
+ public final void mT__22() throws RecognitionException {
+ try {
+ int _type = T__22;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:21:7: ( 'else if' )
+ // InternalSensinact.g:21:9: 'else if'
+ {
+ match("else if");
+
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__22"
+
+ // $ANTLR start "T__23"
+ public final void mT__23() throws RecognitionException {
+ try {
+ int _type = T__23;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:22:7: ( 'else do' )
+ // InternalSensinact.g:22:9: 'else do'
+ {
+ match("else do");
+
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__23"
+
+ // $ANTLR start "T__24"
+ public final void mT__24() throws RecognitionException {
+ try {
+ int _type = T__24;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:23:7: ( '.' )
+ // InternalSensinact.g:23:9: '.'
+ {
+ match('.');
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__24"
+
+ // $ANTLR start "T__25"
+ public final void mT__25() throws RecognitionException {
+ try {
+ int _type = T__25;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:24:7: ( 'subscribe' )
+ // InternalSensinact.g:24:9: 'subscribe'
+ {
+ match("subscribe");
+
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__25"
+
+ // $ANTLR start "T__26"
+ public final void mT__26() throws RecognitionException {
+ try {
+ int _type = T__26;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:25:7: ( '(' )
+ // InternalSensinact.g:25:9: '('
+ {
+ match('(');
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__26"
+
+ // $ANTLR start "T__27"
+ public final void mT__27() throws RecognitionException {
+ try {
+ int _type = T__27;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:26:7: ( ')' )
+ // InternalSensinact.g:26:9: ')'
+ {
+ match(')');
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__27"
+
+ // $ANTLR start "T__28"
+ public final void mT__28() throws RecognitionException {
+ try {
+ int _type = T__28;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:27:7: ( 'define' )
+ // InternalSensinact.g:27:9: 'define'
+ {
+ match("define");
+
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__28"
+
+ // $ANTLR start "T__29"
+ public final void mT__29() throws RecognitionException {
+ try {
+ int _type = T__29;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:28:7: ( 'after' )
+ // InternalSensinact.g:28:9: 'after'
+ {
+ match("after");
+
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__29"
+
+ // $ANTLR start "T__30"
+ public final void mT__30() throws RecognitionException {
+ try {
+ int _type = T__30;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:29:7: ( 'before' )
+ // InternalSensinact.g:29:9: 'before'
+ {
+ match("before");
+
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__30"
+
+ // $ANTLR start "T__31"
+ public final void mT__31() throws RecognitionException {
+ try {
+ int _type = T__31;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:30:7: ( 'coincide' )
+ // InternalSensinact.g:30:9: 'coincide'
+ {
+ match("coincide");
+
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__31"
+
+ // $ANTLR start "T__32"
+ public final void mT__32() throws RecognitionException {
+ try {
+ int _type = T__32;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:31:7: ( 'min' )
+ // InternalSensinact.g:31:9: 'min'
+ {
+ match("min");
+
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__32"
+
+ // $ANTLR start "T__33"
+ public final void mT__33() throws RecognitionException {
+ try {
+ int _type = T__33;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:32:7: ( 'max' )
+ // InternalSensinact.g:32:9: 'max'
+ {
+ match("max");
+
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__33"
+
+ // $ANTLR start "T__34"
+ public final void mT__34() throws RecognitionException {
+ try {
+ int _type = T__34;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:33:7: ( 'avg' )
+ // InternalSensinact.g:33:9: 'avg'
+ {
+ match("avg");
+
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__34"
+
+ // $ANTLR start "T__35"
+ public final void mT__35() throws RecognitionException {
+ try {
+ int _type = T__35;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:34:7: ( 'sum' )
+ // InternalSensinact.g:34:9: 'sum'
+ {
+ match("sum");
+
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__35"
+
+ // $ANTLR start "T__36"
+ public final void mT__36() throws RecognitionException {
+ try {
+ int _type = T__36;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:35:7: ( 'count' )
+ // InternalSensinact.g:35:9: 'count'
+ {
+ match("count");
+
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__36"
+
+ // $ANTLR start "T__37"
+ public final void mT__37() throws RecognitionException {
+ try {
+ int _type = T__37;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:36:7: ( 'sec' )
+ // InternalSensinact.g:36:9: 'sec'
+ {
+ match("sec");
+
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__37"
+
+ // $ANTLR start "T__38"
+ public final void mT__38() throws RecognitionException {
+ try {
+ int _type = T__38;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:37:7: ( 'act' )
+ // InternalSensinact.g:37:9: 'act'
+ {
+ match("act");
+
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__38"
+
+ // $ANTLR start "T__39"
+ public final void mT__39() throws RecognitionException {
+ try {
+ int _type = T__39;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:38:7: ( 'set' )
+ // InternalSensinact.g:38:9: 'set'
+ {
+ match("set");
+
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__39"
+
+ // $ANTLR start "T__40"
+ public final void mT__40() throws RecognitionException {
+ try {
+ int _type = T__40;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:39:7: ( 'or' )
+ // InternalSensinact.g:39:9: 'or'
+ {
+ match("or");
+
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__40"
+
+ // $ANTLR start "T__41"
+ public final void mT__41() throws RecognitionException {
+ try {
+ int _type = T__41;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:40:7: ( 'and' )
+ // InternalSensinact.g:40:9: 'and'
+ {
+ match("and");
+
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__41"
+
+ // $ANTLR start "T__42"
+ public final void mT__42() throws RecognitionException {
+ try {
+ int _type = T__42;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:41:7: ( '!=' )
+ // InternalSensinact.g:41:9: '!='
+ {
+ match("!=");
+
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__42"
+
+ // $ANTLR start "T__43"
+ public final void mT__43() throws RecognitionException {
+ try {
+ int _type = T__43;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:42:7: ( '==' )
+ // InternalSensinact.g:42:9: '=='
+ {
+ match("==");
+
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__43"
+
+ // $ANTLR start "T__44"
+ public final void mT__44() throws RecognitionException {
+ try {
+ int _type = T__44;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:43:7: ( '>' )
+ // InternalSensinact.g:43:9: '>'
+ {
+ match('>');
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__44"
+
+ // $ANTLR start "T__45"
+ public final void mT__45() throws RecognitionException {
+ try {
+ int _type = T__45;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:44:7: ( '>=' )
+ // InternalSensinact.g:44:9: '>='
+ {
+ match(">=");
+
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__45"
+
+ // $ANTLR start "T__46"
+ public final void mT__46() throws RecognitionException {
+ try {
+ int _type = T__46;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:45:7: ( '<' )
+ // InternalSensinact.g:45:9: '<'
+ {
+ match('<');
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__46"
+
+ // $ANTLR start "T__47"
+ public final void mT__47() throws RecognitionException {
+ try {
+ int _type = T__47;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:46:7: ( '<=' )
+ // InternalSensinact.g:46:9: '<='
+ {
+ match("<=");
+
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__47"
+
+ // $ANTLR start "T__48"
+ public final void mT__48() throws RecognitionException {
+ try {
+ int _type = T__48;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:47:7: ( '+' )
+ // InternalSensinact.g:47:9: '+'
+ {
+ match('+');
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__48"
+
+ // $ANTLR start "T__49"
+ public final void mT__49() throws RecognitionException {
+ try {
+ int _type = T__49;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:48:7: ( '-' )
+ // InternalSensinact.g:48:9: '-'
+ {
+ match('-');
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__49"
+
+ // $ANTLR start "T__50"
+ public final void mT__50() throws RecognitionException {
+ try {
+ int _type = T__50;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:49:7: ( '*' )
+ // InternalSensinact.g:49:9: '*'
+ {
+ match('*');
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__50"
+
+ // $ANTLR start "T__51"
+ public final void mT__51() throws RecognitionException {
+ try {
+ int _type = T__51;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:50:7: ( '%' )
+ // InternalSensinact.g:50:9: '%'
+ {
+ match('%');
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__51"
+
+ // $ANTLR start "T__52"
+ public final void mT__52() throws RecognitionException {
+ try {
+ int _type = T__52;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:51:7: ( '.get()' )
+ // InternalSensinact.g:51:9: '.get()'
+ {
+ match(".get()");
+
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__52"
+
+ // $ANTLR start "T__53"
+ public final void mT__53() throws RecognitionException {
+ try {
+ int _type = T__53;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:52:7: ( 'not' )
+ // InternalSensinact.g:52:9: 'not'
+ {
+ match("not");
+
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "T__53"
+
+ // $ANTLR start "RULE_BOOLEAN"
+ public final void mRULE_BOOLEAN() throws RecognitionException {
+ try {
+ int _type = RULE_BOOLEAN;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:2833:14: ( ( 'true' | 'false' ) )
+ // InternalSensinact.g:2833:16: ( 'true' | 'false' )
+ {
+ // InternalSensinact.g:2833:16: ( 'true' | 'false' )
+ int alt1=2;
+ int LA1_0 = input.LA(1);
+
+ if ( (LA1_0=='t') ) {
+ alt1=1;
+ }
+ else if ( (LA1_0=='f') ) {
+ alt1=2;
+ }
+ else {
+ NoViableAltException nvae =
+ new NoViableAltException("", 1, 0, input);
+
+ throw nvae;
+ }
+ switch (alt1) {
+ case 1 :
+ // InternalSensinact.g:2833:17: 'true'
+ {
+ match("true");
+
+
+ }
+ break;
+ case 2 :
+ // InternalSensinact.g:2833:24: 'false'
+ {
+ match("false");
+
+
+ }
+ break;
+
+ }
+
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "RULE_BOOLEAN"
+
+ // $ANTLR start "RULE_INT"
+ public final void mRULE_INT() throws RecognitionException {
+ try {
+ int _type = RULE_INT;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:2835:10: ( ( '0' .. '9' )+ )
+ // InternalSensinact.g:2835:12: ( '0' .. '9' )+
+ {
+ // InternalSensinact.g:2835:12: ( '0' .. '9' )+
+ int cnt2=0;
+ loop2:
+ do {
+ int alt2=2;
+ int LA2_0 = input.LA(1);
+
+ if ( ((LA2_0>='0' && LA2_0<='9')) ) {
+ alt2=1;
+ }
+
+
+ switch (alt2) {
+ case 1 :
+ // InternalSensinact.g:2835:13: '0' .. '9'
+ {
+ matchRange('0','9');
+
+ }
+ break;
+
+ default :
+ if ( cnt2 >= 1 ) break loop2;
+ EarlyExitException eee =
+ new EarlyExitException(2, input);
+ throw eee;
+ }
+ cnt2++;
+ } while (true);
+
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "RULE_INT"
+
+ // $ANTLR start "RULE_ID"
+ public final void mRULE_ID() throws RecognitionException {
+ try {
+ int _type = RULE_ID;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:2837:9: ( ( 'a' .. 'z' | 'A' .. 'Z' | '_' | '0' .. '9' | ':' | '-' )+ )
+ // InternalSensinact.g:2837:11: ( 'a' .. 'z' | 'A' .. 'Z' | '_' | '0' .. '9' | ':' | '-' )+
+ {
+ // InternalSensinact.g:2837:11: ( 'a' .. 'z' | 'A' .. 'Z' | '_' | '0' .. '9' | ':' | '-' )+
+ int cnt3=0;
+ loop3:
+ do {
+ int alt3=2;
+ int LA3_0 = input.LA(1);
+
+ if ( (LA3_0=='-'||(LA3_0>='0' && LA3_0<=':')||(LA3_0>='A' && LA3_0<='Z')||LA3_0=='_'||(LA3_0>='a' && LA3_0<='z')) ) {
+ alt3=1;
+ }
+
+
+ switch (alt3) {
+ case 1 :
+ // InternalSensinact.g:
+ {
+ if ( input.LA(1)=='-'||(input.LA(1)>='0' && input.LA(1)<=':')||(input.LA(1)>='A' && input.LA(1)<='Z')||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='z') ) {
+ input.consume();
+
+ }
+ else {
+ MismatchedSetException mse = new MismatchedSetException(null,input);
+ recover(mse);
+ throw mse;}
+
+
+ }
+ break;
+
+ default :
+ if ( cnt3 >= 1 ) break loop3;
+ EarlyExitException eee =
+ new EarlyExitException(3, input);
+ throw eee;
+ }
+ cnt3++;
+ } while (true);
+
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "RULE_ID"
+
+ // $ANTLR start "RULE_STRING"
+ public final void mRULE_STRING() throws RecognitionException {
+ try {
+ int _type = RULE_STRING;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:2839:13: ( ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* '\"' | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* '\\'' ) )
+ // InternalSensinact.g:2839:15: ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* '\"' | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* '\\'' )
+ {
+ // InternalSensinact.g:2839:15: ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* '\"' | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* '\\'' )
+ int alt6=2;
+ int LA6_0 = input.LA(1);
+
+ if ( (LA6_0=='\"') ) {
+ alt6=1;
+ }
+ else if ( (LA6_0=='\'') ) {
+ alt6=2;
+ }
+ else {
+ NoViableAltException nvae =
+ new NoViableAltException("", 6, 0, input);
+
+ throw nvae;
+ }
+ switch (alt6) {
+ case 1 :
+ // InternalSensinact.g:2839:16: '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* '\"'
+ {
+ match('\"');
+ // InternalSensinact.g:2839:20: ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )*
+ loop4:
+ do {
+ int alt4=3;
+ int LA4_0 = input.LA(1);
+
+ if ( (LA4_0=='\\') ) {
+ alt4=1;
+ }
+ else if ( ((LA4_0>='\u0000' && LA4_0<='!')||(LA4_0>='#' && LA4_0<='[')||(LA4_0>=']' && LA4_0<='\uFFFF')) ) {
+ alt4=2;
+ }
+
+
+ switch (alt4) {
+ case 1 :
+ // InternalSensinact.g:2839:21: '\\\\' .
+ {
+ match('\\');
+ matchAny();
+
+ }
+ break;
+ case 2 :
+ // InternalSensinact.g:2839:28: ~ ( ( '\\\\' | '\"' ) )
+ {
+ if ( (input.LA(1)>='\u0000' && input.LA(1)<='!')||(input.LA(1)>='#' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFF') ) {
+ input.consume();
+
+ }
+ else {
+ MismatchedSetException mse = new MismatchedSetException(null,input);
+ recover(mse);
+ throw mse;}
+
+
+ }
+ break;
+
+ default :
+ break loop4;
+ }
+ } while (true);
+
+ match('\"');
+
+ }
+ break;
+ case 2 :
+ // InternalSensinact.g:2839:48: '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* '\\''
+ {
+ match('\'');
+ // InternalSensinact.g:2839:53: ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )*
+ loop5:
+ do {
+ int alt5=3;
+ int LA5_0 = input.LA(1);
+
+ if ( (LA5_0=='\\') ) {
+ alt5=1;
+ }
+ else if ( ((LA5_0>='\u0000' && LA5_0<='&')||(LA5_0>='(' && LA5_0<='[')||(LA5_0>=']' && LA5_0<='\uFFFF')) ) {
+ alt5=2;
+ }
+
+
+ switch (alt5) {
+ case 1 :
+ // InternalSensinact.g:2839:54: '\\\\' .
+ {
+ match('\\');
+ matchAny();
+
+ }
+ break;
+ case 2 :
+ // InternalSensinact.g:2839:61: ~ ( ( '\\\\' | '\\'' ) )
+ {
+ if ( (input.LA(1)>='\u0000' && input.LA(1)<='&')||(input.LA(1)>='(' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFF') ) {
+ input.consume();
+
+ }
+ else {
+ MismatchedSetException mse = new MismatchedSetException(null,input);
+ recover(mse);
+ throw mse;}
+
+
+ }
+ break;
+
+ default :
+ break loop5;
+ }
+ } while (true);
+
+ match('\'');
+
+ }
+ break;
+
+ }
+
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "RULE_STRING"
+
+ // $ANTLR start "RULE_ML_COMMENT"
+ public final void mRULE_ML_COMMENT() throws RecognitionException {
+ try {
+ int _type = RULE_ML_COMMENT;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:2841:17: ( '/*' ( options {greedy=false; } : . )* '*/' )
+ // InternalSensinact.g:2841:19: '/*' ( options {greedy=false; } : . )* '*/'
+ {
+ match("/*");
+
+ // InternalSensinact.g:2841:24: ( options {greedy=false; } : . )*
+ loop7:
+ do {
+ int alt7=2;
+ int LA7_0 = input.LA(1);
+
+ if ( (LA7_0=='*') ) {
+ int LA7_1 = input.LA(2);
+
+ if ( (LA7_1=='/') ) {
+ alt7=2;
+ }
+ else if ( ((LA7_1>='\u0000' && LA7_1<='.')||(LA7_1>='0' && LA7_1<='\uFFFF')) ) {
+ alt7=1;
+ }
+
+
+ }
+ else if ( ((LA7_0>='\u0000' && LA7_0<=')')||(LA7_0>='+' && LA7_0<='\uFFFF')) ) {
+ alt7=1;
+ }
+
+
+ switch (alt7) {
+ case 1 :
+ // InternalSensinact.g:2841:52: .
+ {
+ matchAny();
+
+ }
+ break;
+
+ default :
+ break loop7;
+ }
+ } while (true);
+
+ match("*/");
+
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "RULE_ML_COMMENT"
+
+ // $ANTLR start "RULE_SL_COMMENT"
+ public final void mRULE_SL_COMMENT() throws RecognitionException {
+ try {
+ int _type = RULE_SL_COMMENT;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:2843:17: ( '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )? )
+ // InternalSensinact.g:2843:19: '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )?
+ {
+ match("//");
+
+ // InternalSensinact.g:2843:24: (~ ( ( '\\n' | '\\r' ) ) )*
+ loop8:
+ do {
+ int alt8=2;
+ int LA8_0 = input.LA(1);
+
+ if ( ((LA8_0>='\u0000' && LA8_0<='\t')||(LA8_0>='\u000B' && LA8_0<='\f')||(LA8_0>='\u000E' && LA8_0<='\uFFFF')) ) {
+ alt8=1;
+ }
+
+
+ switch (alt8) {
+ case 1 :
+ // InternalSensinact.g:2843:24: ~ ( ( '\\n' | '\\r' ) )
+ {
+ if ( (input.LA(1)>='\u0000' && input.LA(1)<='\t')||(input.LA(1)>='\u000B' && input.LA(1)<='\f')||(input.LA(1)>='\u000E' && input.LA(1)<='\uFFFF') ) {
+ input.consume();
+
+ }
+ else {
+ MismatchedSetException mse = new MismatchedSetException(null,input);
+ recover(mse);
+ throw mse;}
+
+
+ }
+ break;
+
+ default :
+ break loop8;
+ }
+ } while (true);
+
+ // InternalSensinact.g:2843:40: ( ( '\\r' )? '\\n' )?
+ int alt10=2;
+ int LA10_0 = input.LA(1);
+
+ if ( (LA10_0=='\n'||LA10_0=='\r') ) {
+ alt10=1;
+ }
+ switch (alt10) {
+ case 1 :
+ // InternalSensinact.g:2843:41: ( '\\r' )? '\\n'
+ {
+ // InternalSensinact.g:2843:41: ( '\\r' )?
+ int alt9=2;
+ int LA9_0 = input.LA(1);
+
+ if ( (LA9_0=='\r') ) {
+ alt9=1;
+ }
+ switch (alt9) {
+ case 1 :
+ // InternalSensinact.g:2843:41: '\\r'
+ {
+ match('\r');
+
+ }
+ break;
+
+ }
+
+ match('\n');
+
+ }
+ break;
+
+ }
+
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "RULE_SL_COMMENT"
+
+ // $ANTLR start "RULE_WS"
+ public final void mRULE_WS() throws RecognitionException {
+ try {
+ int _type = RULE_WS;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:2845:9: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ )
+ // InternalSensinact.g:2845:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
+ {
+ // InternalSensinact.g:2845:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
+ int cnt11=0;
+ loop11:
+ do {
+ int alt11=2;
+ int LA11_0 = input.LA(1);
+
+ if ( ((LA11_0>='\t' && LA11_0<='\n')||LA11_0=='\r'||LA11_0==' ') ) {
+ alt11=1;
+ }
+
+
+ switch (alt11) {
+ case 1 :
+ // InternalSensinact.g:
+ {
+ if ( (input.LA(1)>='\t' && input.LA(1)<='\n')||input.LA(1)=='\r'||input.LA(1)==' ' ) {
+ input.consume();
+
+ }
+ else {
+ MismatchedSetException mse = new MismatchedSetException(null,input);
+ recover(mse);
+ throw mse;}
+
+
+ }
+ break;
+
+ default :
+ if ( cnt11 >= 1 ) break loop11;
+ EarlyExitException eee =
+ new EarlyExitException(11, input);
+ throw eee;
+ }
+ cnt11++;
+ } while (true);
+
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "RULE_WS"
+
+ // $ANTLR start "RULE_ANY_OTHER"
+ public final void mRULE_ANY_OTHER() throws RecognitionException {
+ try {
+ int _type = RULE_ANY_OTHER;
+ int _channel = DEFAULT_TOKEN_CHANNEL;
+ // InternalSensinact.g:2847:16: ( . )
+ // InternalSensinact.g:2847:18: .
+ {
+ matchAny();
+
+ }
+
+ state.type = _type;
+ state.channel = _channel;
+ }
+ finally {
+ }
+ }
+ // $ANTLR end "RULE_ANY_OTHER"
+
+ public void mTokens() throws RecognitionException {
+ // InternalSensinact.g:1:8: ( T__12 | T__13 | T__14 | T__15 | T__16 | T__17 | T__18 | T__19 | T__20 | T__21 | T__22 | T__23 | T__24 | T__25 | T__26 | T__27 | T__28 | T__29 | T__30 | T__31 | T__32 | T__33 | T__34 | T__35 | T__36 | T__37 | T__38 | T__39 | T__40 | T__41 | T__42 | T__43 | T__44 | T__45 | T__46 | T__47 | T__48 | T__49 | T__50 | T__51 | T__52 | T__53 | RULE_BOOLEAN | RULE_INT | RULE_ID | RULE_STRING | RULE_ML_COMMENT | RULE_SL_COMMENT | RULE_WS | RULE_ANY_OTHER )
+ int alt12=50;
+ alt12 = dfa12.predict(input);
+ switch (alt12) {
+ case 1 :
+ // InternalSensinact.g:1:10: T__12
+ {
+ mT__12();
+
+ }
+ break;
+ case 2 :
+ // InternalSensinact.g:1:16: T__13
+ {
+ mT__13();
+
+ }
+ break;
+ case 3 :
+ // InternalSensinact.g:1:22: T__14
+ {
+ mT__14();
+
+ }
+ break;
+ case 4 :
+ // InternalSensinact.g:1:28: T__15
+ {
+ mT__15();
+
+ }
+ break;
+ case 5 :
+ // InternalSensinact.g:1:34: T__16
+ {
+ mT__16();
+
+ }
+ break;
+ case 6 :
+ // InternalSensinact.g:1:40: T__17
+ {
+ mT__17();
+
+ }
+ break;
+ case 7 :
+ // InternalSensinact.g:1:46: T__18
+ {
+ mT__18();
+
+ }
+ break;
+ case 8 :
+ // InternalSensinact.g:1:52: T__19
+ {
+ mT__19();
+
+ }
+ break;
+ case 9 :
+ // InternalSensinact.g:1:58: T__20
+ {
+ mT__20();
+
+ }
+ break;
+ case 10 :
+ // InternalSensinact.g:1:64: T__21
+ {
+ mT__21();
+
+ }
+ break;
+ case 11 :
+ // InternalSensinact.g:1:70: T__22
+ {
+ mT__22();
+
+ }
+ break;
+ case 12 :
+ // InternalSensinact.g:1:76: T__23
+ {
+ mT__23();
+
+ }
+ break;
+ case 13 :
+ // InternalSensinact.g:1:82: T__24
+ {
+ mT__24();
+
+ }
+ break;
+ case 14 :
+ // InternalSensinact.g:1:88: T__25
+ {
+ mT__25();
+
+ }
+ break;
+ case 15 :
+ // InternalSensinact.g:1:94: T__26
+ {
+ mT__26();
+
+ }
+ break;
+ case 16 :
+ // InternalSensinact.g:1:100: T__27
+ {
+ mT__27();
+
+ }
+ break;
+ case 17 :
+ // InternalSensinact.g:1:106: T__28
+ {
+ mT__28();
+
+ }
+ break;
+ case 18 :
+ // InternalSensinact.g:1:112: T__29
+ {
+ mT__29();
+
+ }
+ break;
+ case 19 :
+ // InternalSensinact.g:1:118: T__30
+ {
+ mT__30();
+
+ }
+ break;
+ case 20 :
+ // InternalSensinact.g:1:124: T__31
+ {
+ mT__31();
+
+ }
+ break;
+ case 21 :
+ // InternalSensinact.g:1:130: T__32
+ {
+ mT__32();
+
+ }
+ break;
+ case 22 :
+ // InternalSensinact.g:1:136: T__33
+ {
+ mT__33();
+
+ }
+ break;
+ case 23 :
+ // InternalSensinact.g:1:142: T__34
+ {
+ mT__34();
+
+ }
+ break;
+ case 24 :
+ // InternalSensinact.g:1:148: T__35
+ {
+ mT__35();
+
+ }
+ break;
+ case 25 :
+ // InternalSensinact.g:1:154: T__36
+ {
+ mT__36();
+
+ }
+ break;
+ case 26 :
+ // InternalSensinact.g:1:160: T__37
+ {
+ mT__37();
+
+ }
+ break;
+ case 27 :
+ // InternalSensinact.g:1:166: T__38
+ {
+ mT__38();
+
+ }
+ break;
+ case 28 :
+ // InternalSensinact.g:1:172: T__39
+ {
+ mT__39();
+
+ }
+ break;
+ case 29 :
+ // InternalSensinact.g:1:178: T__40
+ {
+ mT__40();
+
+ }
+ break;
+ case 30 :
+ // InternalSensinact.g:1:184: T__41
+ {
+ mT__41();
+
+ }
+ break;
+ case 31 :
+ // InternalSensinact.g:1:190: T__42
+ {
+ mT__42();
+
+ }
+ break;
+ case 32 :
+ // InternalSensinact.g:1:196: T__43
+ {
+ mT__43();
+
+ }
+ break;
+ case 33 :
+ // InternalSensinact.g:1:202: T__44
+ {
+ mT__44();
+
+ }
+ break;
+ case 34 :
+ // InternalSensinact.g:1:208: T__45
+ {
+ mT__45();
+
+ }
+ break;
+ case 35 :
+ // InternalSensinact.g:1:214: T__46
+ {
+ mT__46();
+
+ }
+ break;
+ case 36 :
+ // InternalSensinact.g:1:220: T__47
+ {
+ mT__47();
+
+ }
+ break;
+ case 37 :
+ // InternalSensinact.g:1:226: T__48
+ {
+ mT__48();
+
+ }
+ break;
+ case 38 :
+ // InternalSensinact.g:1:232: T__49
+ {
+ mT__49();
+
+ }
+ break;
+ case 39 :
+ // InternalSensinact.g:1:238: T__50
+ {
+ mT__50();
+
+ }
+ break;
+ case 40 :
+ // InternalSensinact.g:1:244: T__51
+ {
+ mT__51();
+
+ }
+ break;
+ case 41 :
+ // InternalSensinact.g:1:250: T__52
+ {
+ mT__52();
+
+ }
+ break;
+ case 42 :
+ // InternalSensinact.g:1:256: T__53
+ {
+ mT__53();
+
+ }
+ break;
+ case 43 :
+ // InternalSensinact.g:1:262: RULE_BOOLEAN
+ {
+ mRULE_BOOLEAN();
+
+ }
+ break;
+ case 44 :
+ // InternalSensinact.g:1:275: RULE_INT
+ {
+ mRULE_INT();
+
+ }
+ break;
+ case 45 :
+ // InternalSensinact.g:1:284: RULE_ID
+ {
+ mRULE_ID();
+
+ }
+ break;
+ case 46 :
+ // InternalSensinact.g:1:292: RULE_STRING
+ {
+ mRULE_STRING();
+
+ }
+ break;
+ case 47 :
+ // InternalSensinact.g:1:304: RULE_ML_COMMENT
+ {
+ mRULE_ML_COMMENT();
+
+ }
+ break;
+ case 48 :
+ // InternalSensinact.g:1:320: RULE_SL_COMMENT
+ {
+ mRULE_SL_COMMENT();
+
+ }
+ break;
+ case 49 :
+ // InternalSensinact.g:1:336: RULE_WS
+ {
+ mRULE_WS();
+
+ }
+ break;
+ case 50 :
+ // InternalSensinact.g:1:344: RULE_ANY_OTHER
+ {
+ mRULE_ANY_OTHER();
+
+ }
+ break;
+
+ }
+
+ }
+
+
+ protected DFA12 dfa12 = new DFA12(this);
+ static final String DFA12_eotS =
+ "\1\uffff\1\44\1\46\1\uffff\1\52\1\uffff\1\44\1\uffff\3\44\1\65\1\44\2\uffff\4\44\1\42\1\104\1\106\1\uffff\1\110\2\uffff\3\44\1\116\1\uffff\2\42\2\uffff\1\44\10\uffff\1\123\1\124\1\uffff\2\44\1\127\1\130\1\44\2\uffff\2\44\2\uffff\10\44\11\uffff\3\44\1\uffff\1\116\2\uffff\1\44\2\uffff\2\44\2\uffff\2\44\1\157\1\160\1\161\1\44\1\163\1\164\1\165\3\44\1\171\1\172\1\173\3\44\1\uffff\3\44\3\uffff\1\44\3\uffff\3\44\3\uffff\1\u0086\2\44\1\uffff\2\44\1\u008d\2\44\1\u0090\1\uffff\1\u0086\1\44\2\uffff\1\u0092\1\44\1\uffff\1\u0094\1\44\1\uffff\1\44\1\uffff\1\44\1\uffff\1\44\1\u0099\1\44\1\u009b\1\uffff\1\u009c\2\uffff";
+ static final String DFA12_eofS =
+ "\u009d\uffff";
+ static final String DFA12_minS =
+ "\1\0\1\145\1\75\1\uffff\1\52\1\uffff\1\156\1\uffff\1\154\1\146\1\145\1\147\1\145\2\uffff\1\143\1\145\1\157\1\141\3\75\1\uffff\1\55\2\uffff\1\157\1\162\1\141\1\55\1\uffff\2\0\2\uffff\1\163\10\uffff\2\55\1\uffff\1\144\1\163\2\55\1\146\2\uffff\1\142\1\143\2\uffff\1\164\1\147\1\164\1\144\1\146\1\151\1\156\1\170\11\uffff\1\164\1\165\1\154\1\uffff\1\55\2\uffff\1\157\2\uffff\1\40\1\145\2\uffff\1\151\1\163\3\55\1\145\3\55\1\157\2\156\3\55\1\145\1\163\1\165\1\uffff\1\40\1\156\1\143\3\uffff\1\162\3\uffff\1\162\1\143\1\164\3\uffff\1\55\1\145\1\162\1\144\1\145\1\162\1\55\1\145\1\151\1\55\1\uffff\1\55\1\143\2\uffff\1\55\1\151\1\uffff\1\55\1\144\1\uffff\1\145\1\uffff\1\142\1\uffff\1\145\1\55\1\145\1\55\1\uffff\1\55\2\uffff";
+ static final String DFA12_maxS =
+ "\1\uffff\1\145\1\75\1\uffff\1\57\1\uffff\1\162\1\uffff\1\156\1\146\1\157\1\147\1\165\2\uffff\1\166\1\145\1\157\1\151\3\75\1\uffff\1\172\2\uffff\1\157\1\162\1\141\1\172\1\uffff\2\uffff\2\uffff\1\163\10\uffff\2\172\1\uffff\1\144\1\163\2\172\1\146\2\uffff\1\155\1\164\2\uffff\1\164\1\147\1\164\1\144\1\146\1\165\1\156\1\170\11\uffff\1\164\1\165\1\154\1\uffff\1\172\2\uffff\1\157\2\uffff\1\40\1\145\2\uffff\1\151\1\163\3\172\1\145\3\172\1\157\2\156\3\172\1\145\1\163\1\165\1\uffff\1\40\1\156\1\143\3\uffff\1\162\3\uffff\1\162\1\143\1\164\3\uffff\1\172\1\145\1\162\1\151\1\145\1\162\1\172\1\145\1\151\1\172\1\uffff\1\172\1\143\2\uffff\1\172\1\151\1\uffff\1\172\1\144\1\uffff\1\145\1\uffff\1\142\1\uffff\1\145\1\172\1\145\1\172\1\uffff\1\172\2\uffff";
+ static final String DFA12_acceptS =
+ "\3\uffff\1\3\1\uffff\1\5\1\uffff\1\7\5\uffff\1\17\1\20\7\uffff\1\45\1\uffff\1\47\1\50\4\uffff\1\55\2\uffff\1\61\1\62\1\uffff\1\55\1\40\1\2\1\3\1\57\1\60\1\4\1\5\2\uffff\1\7\5\uffff\1\51\1\15\2\uffff\1\17\1\20\10\uffff\1\37\1\42\1\41\1\44\1\43\1\45\1\46\1\47\1\50\3\uffff\1\54\1\uffff\1\56\1\61\1\uffff\1\6\1\35\2\uffff\1\11\1\12\22\uffff\1\10\3\uffff\1\30\1\32\1\34\1\uffff\1\27\1\33\1\36\3\uffff\1\25\1\26\1\52\12\uffff\1\53\2\uffff\1\13\1\14\2\uffff\1\22\2\uffff\1\31\1\uffff\1\21\1\uffff\1\23\4\uffff\1\1\1\uffff\1\24\1\16";
+ static final String DFA12_specialS =
+ "\1\1\36\uffff\1\0\1\2\174\uffff}>";
+ static final String[] DFA12_transitionS = {
+ "\11\42\2\41\2\42\1\41\22\42\1\41\1\23\1\37\2\42\1\31\1\42\1\40\1\15\1\16\1\30\1\26\1\7\1\27\1\13\1\4\12\35\1\36\1\42\1\25\1\2\1\24\2\42\32\36\1\3\1\42\1\5\1\42\1\36\1\42\1\17\1\20\1\21\1\12\1\10\1\34\2\36\1\11\3\36\1\22\1\32\1\6\2\36\1\1\1\14\1\33\6\36\uff85\42",
+ "\1\43",
+ "\1\45",
+ "",
+ "\1\50\4\uffff\1\51",
+ "",
+ "\1\54\3\uffff\1\55",
+ "",
+ "\1\60\1\uffff\1\57",
+ "\1\61",
+ "\1\63\11\uffff\1\62",
+ "\1\64",
+ "\1\67\17\uffff\1\66",
+ "",
+ "",
+ "\1\74\2\uffff\1\72\7\uffff\1\75\7\uffff\1\73",
+ "\1\76",
+ "\1\77",
+ "\1\101\7\uffff\1\100",
+ "\1\102",
+ "\1\103",
+ "\1\105",
+ "",
+ "\1\44\2\uffff\13\44\6\uffff\32\44\4\uffff\1\44\1\uffff\32\44",
+ "",
+ "",
+ "\1\113",
+ "\1\114",
+ "\1\115",
+ "\1\44\2\uffff\12\117\1\44\6\uffff\32\44\4\uffff\1\44\1\uffff\32\44",
+ "",
+ "\0\120",
+ "\0\120",
+ "",
+ "",
+ "\1\122",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "\1\44\2\uffff\13\44\6\uffff\32\44\4\uffff\1\44\1\uffff\32\44",
+ "\1\44\2\uffff\13\44\6\uffff\32\44\4\uffff\1\44\1\uffff\32\44",
+ "",
+ "\1\125",
+ "\1\126",
+ "\1\44\2\uffff\13\44\6\uffff\32\44\4\uffff\1\44\1\uffff\32\44",
+ "\1\44\2\uffff\13\44\6\uffff\32\44\4\uffff\1\44\1\uffff\32\44",
+ "\1\131",
+ "",
+ "",
+ "\1\132\12\uffff\1\133",
+ "\1\134\20\uffff\1\135",
+ "",
+ "",
+ "\1\136",
+ "\1\137",
+ "\1\140",
+ "\1\141",
+ "\1\142",
+ "\1\143\13\uffff\1\144",
+ "\1\145",
+ "\1\146",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "\1\147",
+ "\1\150",
+ "\1\151",
+ "",
+ "\1\44\2\uffff\12\117\1\44\6\uffff\32\44\4\uffff\1\44\1\uffff\32\44",
+ "",
+ "",
+ "\1\152",
+ "",
+ "",
+ "\1\153",
+ "\1\154",
+ "",
+ "",
+ "\1\155",
+ "\1\156",
+ "\1\44\2\uffff\13\44\6\uffff\32\44\4\uffff\1\44\1\uffff\32\44",
+ "\1\44\2\uffff\13\44\6\uffff\32\44\4\uffff\1\44\1\uffff\32\44",
+ "\1\44\2\uffff\13\44\6\uffff\32\44\4\uffff\1\44\1\uffff\32\44",
+ "\1\162",
+ "\1\44\2\uffff\13\44\6\uffff\32\44\4\uffff\1\44\1\uffff\32\44",
+ "\1\44\2\uffff\13\44\6\uffff\32\44\4\uffff\1\44\1\uffff\32\44",
+ "\1\44\2\uffff\13\44\6\uffff\32\44\4\uffff\1\44\1\uffff\32\44",
+ "\1\166",
+ "\1\167",
+ "\1\170",
+ "\1\44\2\uffff\13\44\6\uffff\32\44\4\uffff\1\44\1\uffff\32\44",
+ "\1\44\2\uffff\13\44\6\uffff\32\44\4\uffff\1\44\1\uffff\32\44",
+ "\1\44\2\uffff\13\44\6\uffff\32\44\4\uffff\1\44\1\uffff\32\44",
+ "\1\174",
+ "\1\175",
+ "\1\176",
+ "",
+ "\1\177",
+ "\1\u0080",
+ "\1\u0081",
+ "",
+ "",
+ "",
+ "\1\u0082",
+ "",
+ "",
+ "",
+ "\1\u0083",
+ "\1\u0084",
+ "\1\u0085",
+ "",
+ "",
+ "",
+ "\1\44\2\uffff\13\44\6\uffff\32\44\4\uffff\1\44\1\uffff\32\44",
+ "\1\u0087",
+ "\1\u0088",
+ "\1\u008a\4\uffff\1\u0089",
+ "\1\u008b",
+ "\1\u008c",
+ "\1\44\2\uffff\13\44\6\uffff\32\44\4\uffff\1\44\1\uffff\32\44",
+ "\1\u008e",
+ "\1\u008f",
+ "\1\44\2\uffff\13\44\6\uffff\32\44\4\uffff\1\44\1\uffff\32\44",
+ "",
+ "\1\44\2\uffff\13\44\6\uffff\32\44\4\uffff\1\44\1\uffff\32\44",
+ "\1\u0091",
+ "",
+ "",
+ "\1\44\2\uffff\13\44\6\uffff\32\44\4\uffff\1\44\1\uffff\32\44",
+ "\1\u0093",
+ "",
+ "\1\44\2\uffff\13\44\6\uffff\32\44\4\uffff\1\44\1\uffff\32\44",
+ "\1\u0095",
+ "",
+ "\1\u0096",
+ "",
+ "\1\u0097",
+ "",
+ "\1\u0098",
+ "\1\44\2\uffff\13\44\6\uffff\32\44\4\uffff\1\44\1\uffff\32\44",
+ "\1\u009a",
+ "\1\44\2\uffff\13\44\6\uffff\32\44\4\uffff\1\44\1\uffff\32\44",
+ "",
+ "\1\44\2\uffff\13\44\6\uffff\32\44\4\uffff\1\44\1\uffff\32\44",
+ "",
+ ""
+ };
+
+ static final short[] DFA12_eot = DFA.unpackEncodedString(DFA12_eotS);
+ static final short[] DFA12_eof = DFA.unpackEncodedString(DFA12_eofS);
+ static final char[] DFA12_min = DFA.unpackEncodedStringToUnsignedChars(DFA12_minS);
+ static final char[] DFA12_max = DFA.unpackEncodedStringToUnsignedChars(DFA12_maxS);
+ static final short[] DFA12_accept = DFA.unpackEncodedString(DFA12_acceptS);
+ static final short[] DFA12_special = DFA.unpackEncodedString(DFA12_specialS);
+ static final short[][] DFA12_transition;
+
+ static {
+ int numStates = DFA12_transitionS.length;
+ DFA12_transition = new short[numStates][];
+ for (int i=0; i<numStates; i++) {
+ DFA12_transition[i] = DFA.unpackEncodedString(DFA12_transitionS[i]);
+ }
+ }
+
+ class DFA12 extends DFA {
+
+ public DFA12(BaseRecognizer recognizer) {
+ this.recognizer = recognizer;
+ this.decisionNumber = 12;
+ this.eot = DFA12_eot;
+ this.eof = DFA12_eof;
+ this.min = DFA12_min;
+ this.max = DFA12_max;
+ this.accept = DFA12_accept;
+ this.special = DFA12_special;
+ this.transition = DFA12_transition;
+ }
+ public String getDescription() {
+ return "1:1: Tokens : ( T__12 | T__13 | T__14 | T__15 | T__16 | T__17 | T__18 | T__19 | T__20 | T__21 | T__22 | T__23 | T__24 | T__25 | T__26 | T__27 | T__28 | T__29 | T__30 | T__31 | T__32 | T__33 | T__34 | T__35 | T__36 | T__37 | T__38 | T__39 | T__40 | T__41 | T__42 | T__43 | T__44 | T__45 | T__46 | T__47 | T__48 | T__49 | T__50 | T__51 | T__52 | T__53 | RULE_BOOLEAN | RULE_INT | RULE_ID | RULE_STRING | RULE_ML_COMMENT | RULE_SL_COMMENT | RULE_WS | RULE_ANY_OTHER );";
+ }
+ public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+ IntStream input = _input;
+ int _s = s;
+ switch ( s ) {
+ case 0 :
+ int LA12_31 = input.LA(1);
+
+ s = -1;
+ if ( ((LA12_31>='\u0000' && LA12_31<='\uFFFF')) ) {s = 80;}
+
+ else s = 34;
+
+ if ( s>=0 ) return s;
+ break;
+ case 1 :
+ int LA12_0 = input.LA(1);
+
+ s = -1;
+ if ( (LA12_0=='r') ) {s = 1;}
+
+ else if ( (LA12_0=='=') ) {s = 2;}
+
+ else if ( (LA12_0=='[') ) {s = 3;}
+
+ else if ( (LA12_0=='/') ) {s = 4;}
+
+ else if ( (LA12_0==']') ) {s = 5;}
+
+ else if ( (LA12_0=='o') ) {s = 6;}
+
+ else if ( (LA12_0==',') ) {s = 7;}
+
+ else if ( (LA12_0=='e') ) {s = 8;}
+
+ else if ( (LA12_0=='i') ) {s = 9;}
+
+ else if ( (LA12_0=='d') ) {s = 10;}
+
+ else if ( (LA12_0=='.') ) {s = 11;}
+
+ else if ( (LA12_0=='s') ) {s = 12;}
+
+ else if ( (LA12_0=='(') ) {s = 13;}
+
+ else if ( (LA12_0==')') ) {s = 14;}
+
+ else if ( (LA12_0=='a') ) {s = 15;}
+
+ else if ( (LA12_0=='b') ) {s = 16;}
+
+ else if ( (LA12_0=='c') ) {s = 17;}
+
+ else if ( (LA12_0=='m') ) {s = 18;}
+
+ else if ( (LA12_0=='!') ) {s = 19;}
+
+ else if ( (LA12_0=='>') ) {s = 20;}
+
+ else if ( (LA12_0=='<') ) {s = 21;}
+
+ else if ( (LA12_0=='+') ) {s = 22;}
+
+ else if ( (LA12_0=='-') ) {s = 23;}
+
+ else if ( (LA12_0=='*') ) {s = 24;}
+
+ else if ( (LA12_0=='%') ) {s = 25;}
+
+ else if ( (LA12_0=='n') ) {s = 26;}
+
+ else if ( (LA12_0=='t') ) {s = 27;}
+
+ else if ( (LA12_0=='f') ) {s = 28;}
+
+ else if ( ((LA12_0>='0' && LA12_0<='9')) ) {s = 29;}
+
+ else if ( (LA12_0==':'||(LA12_0>='A' && LA12_0<='Z')||LA12_0=='_'||(LA12_0>='g' && LA12_0<='h')||(LA12_0>='j' && LA12_0<='l')||(LA12_0>='p' && LA12_0<='q')||(LA12_0>='u' && LA12_0<='z')) ) {s = 30;}
+
+ else if ( (LA12_0=='\"') ) {s = 31;}
+
+ else if ( (LA12_0=='\'') ) {s = 32;}
+
+ else if ( ((LA12_0>='\t' && LA12_0<='\n')||LA12_0=='\r'||LA12_0==' ') ) {s = 33;}
+
+ else if ( ((LA12_0>='\u0000' && LA12_0<='\b')||(LA12_0>='\u000B' && LA12_0<='\f')||(LA12_0>='\u000E' && LA12_0<='\u001F')||(LA12_0>='#' && LA12_0<='$')||LA12_0=='&'||LA12_0==';'||(LA12_0>='?' && LA12_0<='@')||LA12_0=='\\'||LA12_0=='^'||LA12_0=='`'||(LA12_0>='{' && LA12_0<='\uFFFF')) ) {s = 34;}
+
+ if ( s>=0 ) return s;
+ break;
+ case 2 :
+ int LA12_32 = input.LA(1);
+
+ s = -1;
+ if ( ((LA12_32>='\u0000' && LA12_32<='\uFFFF')) ) {s = 80;}
+
+ else s = 34;
+
+ if ( s>=0 ) return s;
+ break;
+ }
+ NoViableAltException nvae =
+ new NoViableAltException(getDescription(), 12, _s, input);
+ error(nvae);
+ throw nvae;
+ }
+ }
+
+
+}
\ No newline at end of file
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/parser/antlr/internal/InternalSensinactParser.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/parser/antlr/internal/InternalSensinactParser.java
new file mode 100644
index 0000000..fb1e4ac
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/parser/antlr/internal/InternalSensinactParser.java
@@ -0,0 +1,6863 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.language.parser.antlr.internal;
+
+import org.eclipse.xtext.*;
+import org.eclipse.xtext.parser.*;
+import org.eclipse.xtext.parser.impl.*;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.xtext.parser.antlr.AbstractInternalAntlrParser;
+import org.eclipse.xtext.parser.antlr.XtextTokenStream;
+import org.eclipse.xtext.parser.antlr.XtextTokenStream.HiddenTokens;
+import org.eclipse.xtext.parser.antlr.AntlrDatatypeRuleToken;
+import org.eclipse.sensinact.studio.language.services.SensinactGrammarAccess;
+
+
+
+import org.antlr.runtime.*;
+import java.util.Stack;
+import java.util.List;
+import java.util.ArrayList;
+
+@SuppressWarnings("all")
+public class InternalSensinactParser extends AbstractInternalAntlrParser {
+ public static final String[] tokenNames = new String[] {
+ "<invalid>", "<EOR>", "<DOWN>", "<UP>", "RULE_ID", "RULE_INT", "RULE_STRING", "RULE_BOOLEAN", "RULE_ML_COMMENT", "RULE_SL_COMMENT", "RULE_WS", "RULE_ANY_OTHER", "'resource'", "'='", "'['", "'/'", "']'", "'on'", "','", "'end if'", "'if'", "'do'", "'else if'", "'else do'", "'.'", "'subscribe'", "'('", "')'", "'define'", "'after'", "'before'", "'coincide'", "'min'", "'max'", "'avg'", "'sum'", "'count'", "'sec'", "'act'", "'set'", "'or'", "'and'", "'!='", "'=='", "'>'", "'>='", "'<'", "'<='", "'+'", "'-'", "'*'", "'%'", "'.get()'", "'not'"
+ };
+ public static final int T__50=50;
+ public static final int RULE_BOOLEAN=7;
+ public static final int T__19=19;
+ public static final int T__15=15;
+ public static final int T__16=16;
+ public static final int T__17=17;
+ public static final int T__18=18;
+ public static final int T__12=12;
+ public static final int T__13=13;
+ public static final int T__14=14;
+ public static final int T__51=51;
+ public static final int T__52=52;
+ public static final int T__53=53;
+ public static final int RULE_ID=4;
+ public static final int T__26=26;
+ public static final int T__27=27;
+ public static final int T__28=28;
+ public static final int RULE_INT=5;
+ public static final int T__29=29;
+ public static final int T__22=22;
+ public static final int RULE_ML_COMMENT=8;
+ public static final int T__23=23;
+ public static final int T__24=24;
+ public static final int T__25=25;
+ public static final int T__20=20;
+ public static final int T__21=21;
+ public static final int RULE_STRING=6;
+ public static final int RULE_SL_COMMENT=9;
+ public static final int T__37=37;
+ public static final int T__38=38;
+ public static final int T__39=39;
+ public static final int T__33=33;
+ public static final int T__34=34;
+ public static final int T__35=35;
+ public static final int T__36=36;
+ public static final int EOF=-1;
+ public static final int T__30=30;
+ public static final int T__31=31;
+ public static final int T__32=32;
+ public static final int RULE_WS=10;
+ public static final int RULE_ANY_OTHER=11;
+ public static final int T__48=48;
+ public static final int T__49=49;
+ public static final int T__44=44;
+ public static final int T__45=45;
+ public static final int T__46=46;
+ public static final int T__47=47;
+ public static final int T__40=40;
+ public static final int T__41=41;
+ public static final int T__42=42;
+ public static final int T__43=43;
+
+ // delegates
+ // delegators
+
+
+ public InternalSensinactParser(TokenStream input) {
+ this(input, new RecognizerSharedState());
+ }
+ public InternalSensinactParser(TokenStream input, RecognizerSharedState state) {
+ super(input, state);
+
+ }
+
+
+ public String[] getTokenNames() { return InternalSensinactParser.tokenNames; }
+ public String getGrammarFileName() { return "InternalSensinact.g"; }
+
+
+
+ private SensinactGrammarAccess grammarAccess;
+
+ public InternalSensinactParser(TokenStream input, SensinactGrammarAccess grammarAccess) {
+ this(input);
+ this.grammarAccess = grammarAccess;
+ registerRules(grammarAccess.getGrammar());
+ }
+
+ @Override
+ protected String getFirstRuleName() {
+ return "Sensinact";
+ }
+
+ @Override
+ protected SensinactGrammarAccess getGrammarAccess() {
+ return grammarAccess;
+ }
+
+
+
+
+ // $ANTLR start "entryRuleSensinact"
+ // InternalSensinact.g:64:1: entryRuleSensinact returns [EObject current=null] : iv_ruleSensinact= ruleSensinact EOF ;
+ public final EObject entryRuleSensinact() throws RecognitionException {
+ EObject current = null;
+
+ EObject iv_ruleSensinact = null;
+
+
+ try {
+ // InternalSensinact.g:64:50: (iv_ruleSensinact= ruleSensinact EOF )
+ // InternalSensinact.g:65:2: iv_ruleSensinact= ruleSensinact EOF
+ {
+ newCompositeNode(grammarAccess.getSensinactRule());
+ pushFollow(FOLLOW_1);
+ iv_ruleSensinact=ruleSensinact();
+
+ state._fsp--;
+
+ current =iv_ruleSensinact;
+ match(input,EOF,FOLLOW_2);
+
+ }
+
+ }
+
+ catch (RecognitionException re) {
+ recover(input,re);
+ appendSkippedTokens();
+ }
+ finally {
+ }
+ return current;
+ }
+ // $ANTLR end "entryRuleSensinact"
+
+
+ // $ANTLR start "ruleSensinact"
+ // InternalSensinact.g:71:1: ruleSensinact returns [EObject current=null] : ( () ( (lv_eca_1_0= ruleDSL_SENSINACT ) ) ) ;
+ public final EObject ruleSensinact() throws RecognitionException {
+ EObject current = null;
+
+ EObject lv_eca_1_0 = null;
+
+
+
+ enterRule();
+
+ try {
+ // InternalSensinact.g:77:2: ( ( () ( (lv_eca_1_0= ruleDSL_SENSINACT ) ) ) )
+ // InternalSensinact.g:78:2: ( () ( (lv_eca_1_0= ruleDSL_SENSINACT ) ) )
+ {
+ // InternalSensinact.g:78:2: ( () ( (lv_eca_1_0= ruleDSL_SENSINACT ) ) )
+ // InternalSensinact.g:79:3: () ( (lv_eca_1_0= ruleDSL_SENSINACT ) )
+ {
+ // InternalSensinact.g:79:3: ()
+ // InternalSensinact.g:80:4:
+ {
+
+ current = forceCreateModelElement(
+ grammarAccess.getSensinactAccess().getSensinactAction_0(),
+ current);
+
+
+ }
+
+ // InternalSensinact.g:86:3: ( (lv_eca_1_0= ruleDSL_SENSINACT ) )
+ // InternalSensinact.g:87:4: (lv_eca_1_0= ruleDSL_SENSINACT )
+ {
+ // InternalSensinact.g:87:4: (lv_eca_1_0= ruleDSL_SENSINACT )
+ // InternalSensinact.g:88:5: lv_eca_1_0= ruleDSL_SENSINACT
+ {
+
+ newCompositeNode(grammarAccess.getSensinactAccess().getEcaDSL_SENSINACTParserRuleCall_1_0());
+
+ pushFollow(FOLLOW_2);
+ lv_eca_1_0=ruleDSL_SENSINACT();
+
+ state._fsp--;
+
+
+ if (current==null) {
+ current = createModelElementForParent(grammarAccess.getSensinactRule());
+ }
+ set(
+ current,
+ "eca",
+ lv_eca_1_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_SENSINACT");
+ afterParserOrEnumRuleCall();
+
+
+ }
+
+
+ }
+
+
+ }
+
+
+ }
+
+
+ leaveRule();
+
+ }
+
+ catch (RecognitionException re) {
+ recover(input,re);
+ appendSkippedTokens();
+ }
+ finally {
+ }
+ return current;
+ }
+ // $ANTLR end "ruleSensinact"
+
+
+ // $ANTLR start "entryRuleDSL_SENSINACT"
+ // InternalSensinact.g:109:1: entryRuleDSL_SENSINACT returns [EObject current=null] : iv_ruleDSL_SENSINACT= ruleDSL_SENSINACT EOF ;
+ public final EObject entryRuleDSL_SENSINACT() throws RecognitionException {
+ EObject current = null;
+
+ EObject iv_ruleDSL_SENSINACT = null;
+
+
+ try {
+ // InternalSensinact.g:109:54: (iv_ruleDSL_SENSINACT= ruleDSL_SENSINACT EOF )
+ // InternalSensinact.g:110:2: iv_ruleDSL_SENSINACT= ruleDSL_SENSINACT EOF
+ {
+ newCompositeNode(grammarAccess.getDSL_SENSINACTRule());
+ pushFollow(FOLLOW_1);
+ iv_ruleDSL_SENSINACT=ruleDSL_SENSINACT();
+
+ state._fsp--;
+
+ current =iv_ruleDSL_SENSINACT;
+ match(input,EOF,FOLLOW_2);
+
+ }
+
+ }
+
+ catch (RecognitionException re) {
+ recover(input,re);
+ appendSkippedTokens();
+ }
+ finally {
+ }
+ return current;
+ }
+ // $ANTLR end "entryRuleDSL_SENSINACT"
+
+
+ // $ANTLR start "ruleDSL_SENSINACT"
+ // InternalSensinact.g:116:1: ruleDSL_SENSINACT returns [EObject current=null] : ( ( (lv_resources_0_0= ruleDSL_Resource ) )+ ( (lv_cep_1_0= ruleDSL_CEP_STATEMENT ) )* ( (lv_on_2_0= ruleDSL_On ) ) ( (lv_eca_3_0= ruleDSL_ECA_STATEMENT ) ) ) ;
+ public final EObject ruleDSL_SENSINACT() throws RecognitionException {
+ EObject current = null;
+
+ EObject lv_resources_0_0 = null;
+
+ EObject lv_cep_1_0 = null;
+
+ EObject lv_on_2_0 = null;
+
+ EObject lv_eca_3_0 = null;
+
+
+
+ enterRule();
+
+ try {
+ // InternalSensinact.g:122:2: ( ( ( (lv_resources_0_0= ruleDSL_Resource ) )+ ( (lv_cep_1_0= ruleDSL_CEP_STATEMENT ) )* ( (lv_on_2_0= ruleDSL_On ) ) ( (lv_eca_3_0= ruleDSL_ECA_STATEMENT ) ) ) )
+ // InternalSensinact.g:123:2: ( ( (lv_resources_0_0= ruleDSL_Resource ) )+ ( (lv_cep_1_0= ruleDSL_CEP_STATEMENT ) )* ( (lv_on_2_0= ruleDSL_On ) ) ( (lv_eca_3_0= ruleDSL_ECA_STATEMENT ) ) )
+ {
+ // InternalSensinact.g:123:2: ( ( (lv_resources_0_0= ruleDSL_Resource ) )+ ( (lv_cep_1_0= ruleDSL_CEP_STATEMENT ) )* ( (lv_on_2_0= ruleDSL_On ) ) ( (lv_eca_3_0= ruleDSL_ECA_STATEMENT ) ) )
+ // InternalSensinact.g:124:3: ( (lv_resources_0_0= ruleDSL_Resource ) )+ ( (lv_cep_1_0= ruleDSL_CEP_STATEMENT ) )* ( (lv_on_2_0= ruleDSL_On ) ) ( (lv_eca_3_0= ruleDSL_ECA_STATEMENT ) )
+ {
+ // InternalSensinact.g:124:3: ( (lv_resources_0_0= ruleDSL_Resource ) )+
+ int cnt1=0;
+ loop1:
+ do {
+ int alt1=2;
+ int LA1_0 = input.LA(1);
+
+ if ( (LA1_0==12) ) {
+ alt1=1;
+ }
+
+
+ switch (alt1) {
+ case 1 :
+ // InternalSensinact.g:125:4: (lv_resources_0_0= ruleDSL_Resource )
+ {
+ // InternalSensinact.g:125:4: (lv_resources_0_0= ruleDSL_Resource )
+ // InternalSensinact.g:126:5: lv_resources_0_0= ruleDSL_Resource
+ {
+
+ newCompositeNode(grammarAccess.getDSL_SENSINACTAccess().getResourcesDSL_ResourceParserRuleCall_0_0());
+
+ pushFollow(FOLLOW_3);
+ lv_resources_0_0=ruleDSL_Resource();
+
+ state._fsp--;
+
+
+ if (current==null) {
+ current = createModelElementForParent(grammarAccess.getDSL_SENSINACTRule());
+ }
+ add(
+ current,
+ "resources",
+ lv_resources_0_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_Resource");
+ afterParserOrEnumRuleCall();
+
+
+ }
+
+
+ }
+ break;
+
+ default :
+ if ( cnt1 >= 1 ) break loop1;
+ EarlyExitException eee =
+ new EarlyExitException(1, input);
+ throw eee;
+ }
+ cnt1++;
+ } while (true);
+
+ // InternalSensinact.g:143:3: ( (lv_cep_1_0= ruleDSL_CEP_STATEMENT ) )*
+ loop2:
+ do {
+ int alt2=2;
+ int LA2_0 = input.LA(1);
+
+ if ( (LA2_0==28) ) {
+ alt2=1;
+ }
+
+
+ switch (alt2) {
+ case 1 :
+ // InternalSensinact.g:144:4: (lv_cep_1_0= ruleDSL_CEP_STATEMENT )
+ {
+ // InternalSensinact.g:144:4: (lv_cep_1_0= ruleDSL_CEP_STATEMENT )
+ // InternalSensinact.g:145:5: lv_cep_1_0= ruleDSL_CEP_STATEMENT
+ {
+
+ newCompositeNode(grammarAccess.getDSL_SENSINACTAccess().getCepDSL_CEP_STATEMENTParserRuleCall_1_0());
+
+ pushFollow(FOLLOW_4);
+ lv_cep_1_0=ruleDSL_CEP_STATEMENT();
+
+ state._fsp--;
+
+
+ if (current==null) {
+ current = createModelElementForParent(grammarAccess.getDSL_SENSINACTRule());
+ }
+ add(
+ current,
+ "cep",
+ lv_cep_1_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_CEP_STATEMENT");
+ afterParserOrEnumRuleCall();
+
+
+ }
+
+
+ }
+ break;
+
+ default :
+ break loop2;
+ }
+ } while (true);
+
+ // InternalSensinact.g:162:3: ( (lv_on_2_0= ruleDSL_On ) )
+ // InternalSensinact.g:163:4: (lv_on_2_0= ruleDSL_On )
+ {
+ // InternalSensinact.g:163:4: (lv_on_2_0= ruleDSL_On )
+ // InternalSensinact.g:164:5: lv_on_2_0= ruleDSL_On
+ {
+
+ newCompositeNode(grammarAccess.getDSL_SENSINACTAccess().getOnDSL_OnParserRuleCall_2_0());
+
+ pushFollow(FOLLOW_5);
+ lv_on_2_0=ruleDSL_On();
+
+ state._fsp--;
+
+
+ if (current==null) {
+ current = createModelElementForParent(grammarAccess.getDSL_SENSINACTRule());
+ }
+ set(
+ current,
+ "on",
+ lv_on_2_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_On");
+ afterParserOrEnumRuleCall();
+
+
+ }
+
+
+ }
+
+ // InternalSensinact.g:181:3: ( (lv_eca_3_0= ruleDSL_ECA_STATEMENT ) )
+ // InternalSensinact.g:182:4: (lv_eca_3_0= ruleDSL_ECA_STATEMENT )
+ {
+ // InternalSensinact.g:182:4: (lv_eca_3_0= ruleDSL_ECA_STATEMENT )
+ // InternalSensinact.g:183:5: lv_eca_3_0= ruleDSL_ECA_STATEMENT
+ {
+
+ newCompositeNode(grammarAccess.getDSL_SENSINACTAccess().getEcaDSL_ECA_STATEMENTParserRuleCall_3_0());
+
+ pushFollow(FOLLOW_2);
+ lv_eca_3_0=ruleDSL_ECA_STATEMENT();
+
+ state._fsp--;
+
+
+ if (current==null) {
+ current = createModelElementForParent(grammarAccess.getDSL_SENSINACTRule());
+ }
+ set(
+ current,
+ "eca",
+ lv_eca_3_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_ECA_STATEMENT");
+ afterParserOrEnumRuleCall();
+
+
+ }
+
+
+ }
+
+
+ }
+
+
+ }
+
+
+ leaveRule();
+
+ }
+
+ catch (RecognitionException re) {
+ recover(input,re);
+ appendSkippedTokens();
+ }
+ finally {
+ }
+ return current;
+ }
+ // $ANTLR end "ruleDSL_SENSINACT"
+
+
+ // $ANTLR start "entryRuleDSL_Resource"
+ // InternalSensinact.g:204:1: entryRuleDSL_Resource returns [EObject current=null] : iv_ruleDSL_Resource= ruleDSL_Resource EOF ;
+ public final EObject entryRuleDSL_Resource() throws RecognitionException {
+ EObject current = null;
+
+ EObject iv_ruleDSL_Resource = null;
+
+
+ try {
+ // InternalSensinact.g:204:53: (iv_ruleDSL_Resource= ruleDSL_Resource EOF )
+ // InternalSensinact.g:205:2: iv_ruleDSL_Resource= ruleDSL_Resource EOF
+ {
+ newCompositeNode(grammarAccess.getDSL_ResourceRule());
+ pushFollow(FOLLOW_1);
+ iv_ruleDSL_Resource=ruleDSL_Resource();
+
+ state._fsp--;
+
+ current =iv_ruleDSL_Resource;
+ match(input,EOF,FOLLOW_2);
+
+ }
+
+ }
+
+ catch (RecognitionException re) {
+ recover(input,re);
+ appendSkippedTokens();
+ }
+ finally {
+ }
+ return current;
+ }
+ // $ANTLR end "entryRuleDSL_Resource"
+
+
+ // $ANTLR start "ruleDSL_Resource"
+ // InternalSensinact.g:211:1: ruleDSL_Resource returns [EObject current=null] : (otherlv_0= 'resource' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '=' otherlv_3= '[' ( (lv_gatewayID_4_0= ruleEXTENDED_ID ) ) otherlv_5= '/' ( (lv_deviceID_6_0= ruleEXTENDED_ID ) ) otherlv_7= '/' ( (lv_serviceID_8_0= ruleEXTENDED_ID ) ) otherlv_9= '/' ( (lv_resourceID_10_0= ruleEXTENDED_ID ) ) otherlv_11= ']' ) ;
+ public final EObject ruleDSL_Resource() throws RecognitionException {
+ EObject current = null;
+
+ Token otherlv_0=null;
+ Token lv_name_1_0=null;
+ Token otherlv_2=null;
+ Token otherlv_3=null;
+ Token otherlv_5=null;
+ Token otherlv_7=null;
+ Token otherlv_9=null;
+ Token otherlv_11=null;
+ AntlrDatatypeRuleToken lv_gatewayID_4_0 = null;
+
+ AntlrDatatypeRuleToken lv_deviceID_6_0 = null;
+
+ AntlrDatatypeRuleToken lv_serviceID_8_0 = null;
+
+ AntlrDatatypeRuleToken lv_resourceID_10_0 = null;
+
+
+
+ enterRule();
+
+ try {
+ // InternalSensinact.g:217:2: ( (otherlv_0= 'resource' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '=' otherlv_3= '[' ( (lv_gatewayID_4_0= ruleEXTENDED_ID ) ) otherlv_5= '/' ( (lv_deviceID_6_0= ruleEXTENDED_ID ) ) otherlv_7= '/' ( (lv_serviceID_8_0= ruleEXTENDED_ID ) ) otherlv_9= '/' ( (lv_resourceID_10_0= ruleEXTENDED_ID ) ) otherlv_11= ']' ) )
+ // InternalSensinact.g:218:2: (otherlv_0= 'resource' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '=' otherlv_3= '[' ( (lv_gatewayID_4_0= ruleEXTENDED_ID ) ) otherlv_5= '/' ( (lv_deviceID_6_0= ruleEXTENDED_ID ) ) otherlv_7= '/' ( (lv_serviceID_8_0= ruleEXTENDED_ID ) ) otherlv_9= '/' ( (lv_resourceID_10_0= ruleEXTENDED_ID ) ) otherlv_11= ']' )
+ {
+ // InternalSensinact.g:218:2: (otherlv_0= 'resource' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '=' otherlv_3= '[' ( (lv_gatewayID_4_0= ruleEXTENDED_ID ) ) otherlv_5= '/' ( (lv_deviceID_6_0= ruleEXTENDED_ID ) ) otherlv_7= '/' ( (lv_serviceID_8_0= ruleEXTENDED_ID ) ) otherlv_9= '/' ( (lv_resourceID_10_0= ruleEXTENDED_ID ) ) otherlv_11= ']' )
+ // InternalSensinact.g:219:3: otherlv_0= 'resource' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '=' otherlv_3= '[' ( (lv_gatewayID_4_0= ruleEXTENDED_ID ) ) otherlv_5= '/' ( (lv_deviceID_6_0= ruleEXTENDED_ID ) ) otherlv_7= '/' ( (lv_serviceID_8_0= ruleEXTENDED_ID ) ) otherlv_9= '/' ( (lv_resourceID_10_0= ruleEXTENDED_ID ) ) otherlv_11= ']'
+ {
+ otherlv_0=(Token)match(input,12,FOLLOW_6);
+
+ newLeafNode(otherlv_0, grammarAccess.getDSL_ResourceAccess().getResourceKeyword_0());
+
+ // InternalSensinact.g:223:3: ( (lv_name_1_0= RULE_ID ) )
+ // InternalSensinact.g:224:4: (lv_name_1_0= RULE_ID )
+ {
+ // InternalSensinact.g:224:4: (lv_name_1_0= RULE_ID )
+ // InternalSensinact.g:225:5: lv_name_1_0= RULE_ID
+ {
+ lv_name_1_0=(Token)match(input,RULE_ID,FOLLOW_7);
+
+ newLeafNode(lv_name_1_0, grammarAccess.getDSL_ResourceAccess().getNameIDTerminalRuleCall_1_0());
+
+
+ if (current==null) {
+ current = createModelElement(grammarAccess.getDSL_ResourceRule());
+ }
+ setWithLastConsumed(
+ current,
+ "name",
+ lv_name_1_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.ID");
+
+
+ }
+
+
+ }
+
+ otherlv_2=(Token)match(input,13,FOLLOW_8);
+
+ newLeafNode(otherlv_2, grammarAccess.getDSL_ResourceAccess().getEqualsSignKeyword_2());
+
+ otherlv_3=(Token)match(input,14,FOLLOW_6);
+
+ newLeafNode(otherlv_3, grammarAccess.getDSL_ResourceAccess().getLeftSquareBracketKeyword_3());
+
+ // InternalSensinact.g:249:3: ( (lv_gatewayID_4_0= ruleEXTENDED_ID ) )
+ // InternalSensinact.g:250:4: (lv_gatewayID_4_0= ruleEXTENDED_ID )
+ {
+ // InternalSensinact.g:250:4: (lv_gatewayID_4_0= ruleEXTENDED_ID )
+ // InternalSensinact.g:251:5: lv_gatewayID_4_0= ruleEXTENDED_ID
+ {
+
+ newCompositeNode(grammarAccess.getDSL_ResourceAccess().getGatewayIDEXTENDED_IDParserRuleCall_4_0());
+
+ pushFollow(FOLLOW_9);
+ lv_gatewayID_4_0=ruleEXTENDED_ID();
+
+ state._fsp--;
+
+
+ if (current==null) {
+ current = createModelElementForParent(grammarAccess.getDSL_ResourceRule());
+ }
+ set(
+ current,
+ "gatewayID",
+ lv_gatewayID_4_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.EXTENDED_ID");
+ afterParserOrEnumRuleCall();
+
+
+ }
+
+
+ }
+
+ otherlv_5=(Token)match(input,15,FOLLOW_6);
+
+ newLeafNode(otherlv_5, grammarAccess.getDSL_ResourceAccess().getSolidusKeyword_5());
+
+ // InternalSensinact.g:272:3: ( (lv_deviceID_6_0= ruleEXTENDED_ID ) )
+ // InternalSensinact.g:273:4: (lv_deviceID_6_0= ruleEXTENDED_ID )
+ {
+ // InternalSensinact.g:273:4: (lv_deviceID_6_0= ruleEXTENDED_ID )
+ // InternalSensinact.g:274:5: lv_deviceID_6_0= ruleEXTENDED_ID
+ {
+
+ newCompositeNode(grammarAccess.getDSL_ResourceAccess().getDeviceIDEXTENDED_IDParserRuleCall_6_0());
+
+ pushFollow(FOLLOW_9);
+ lv_deviceID_6_0=ruleEXTENDED_ID();
+
+ state._fsp--;
+
+
+ if (current==null) {
+ current = createModelElementForParent(grammarAccess.getDSL_ResourceRule());
+ }
+ set(
+ current,
+ "deviceID",
+ lv_deviceID_6_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.EXTENDED_ID");
+ afterParserOrEnumRuleCall();
+
+
+ }
+
+
+ }
+
+ otherlv_7=(Token)match(input,15,FOLLOW_6);
+
+ newLeafNode(otherlv_7, grammarAccess.getDSL_ResourceAccess().getSolidusKeyword_7());
+
+ // InternalSensinact.g:295:3: ( (lv_serviceID_8_0= ruleEXTENDED_ID ) )
+ // InternalSensinact.g:296:4: (lv_serviceID_8_0= ruleEXTENDED_ID )
+ {
+ // InternalSensinact.g:296:4: (lv_serviceID_8_0= ruleEXTENDED_ID )
+ // InternalSensinact.g:297:5: lv_serviceID_8_0= ruleEXTENDED_ID
+ {
+
+ newCompositeNode(grammarAccess.getDSL_ResourceAccess().getServiceIDEXTENDED_IDParserRuleCall_8_0());
+
+ pushFollow(FOLLOW_9);
+ lv_serviceID_8_0=ruleEXTENDED_ID();
+
+ state._fsp--;
+
+
+ if (current==null) {
+ current = createModelElementForParent(grammarAccess.getDSL_ResourceRule());
+ }
+ set(
+ current,
+ "serviceID",
+ lv_serviceID_8_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.EXTENDED_ID");
+ afterParserOrEnumRuleCall();
+
+
+ }
+
+
+ }
+
+ otherlv_9=(Token)match(input,15,FOLLOW_6);
+
+ newLeafNode(otherlv_9, grammarAccess.getDSL_ResourceAccess().getSolidusKeyword_9());
+
+ // InternalSensinact.g:318:3: ( (lv_resourceID_10_0= ruleEXTENDED_ID ) )
+ // InternalSensinact.g:319:4: (lv_resourceID_10_0= ruleEXTENDED_ID )
+ {
+ // InternalSensinact.g:319:4: (lv_resourceID_10_0= ruleEXTENDED_ID )
+ // InternalSensinact.g:320:5: lv_resourceID_10_0= ruleEXTENDED_ID
+ {
+
+ newCompositeNode(grammarAccess.getDSL_ResourceAccess().getResourceIDEXTENDED_IDParserRuleCall_10_0());
+
+ pushFollow(FOLLOW_10);
+ lv_resourceID_10_0=ruleEXTENDED_ID();
+
+ state._fsp--;
+
+
+ if (current==null) {
+ current = createModelElementForParent(grammarAccess.getDSL_ResourceRule());
+ }
+ set(
+ current,
+ "resourceID",
+ lv_resourceID_10_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.EXTENDED_ID");
+ afterParserOrEnumRuleCall();
+
+
+ }
+
+
+ }
+
+ otherlv_11=(Token)match(input,16,FOLLOW_2);
+
+ newLeafNode(otherlv_11, grammarAccess.getDSL_ResourceAccess().getRightSquareBracketKeyword_11());
+
+
+ }
+
+
+ }
+
+
+ leaveRule();
+
+ }
+
+ catch (RecognitionException re) {
+ recover(input,re);
+ appendSkippedTokens();
+ }
+ finally {
+ }
+ return current;
+ }
+ // $ANTLR end "ruleDSL_Resource"
+
+
+ // $ANTLR start "entryRuleDSL_On"
+ // InternalSensinact.g:345:1: entryRuleDSL_On returns [EObject current=null] : iv_ruleDSL_On= ruleDSL_On EOF ;
+ public final EObject entryRuleDSL_On() throws RecognitionException {
+ EObject current = null;
+
+ EObject iv_ruleDSL_On = null;
+
+
+ try {
+ // InternalSensinact.g:345:47: (iv_ruleDSL_On= ruleDSL_On EOF )
+ // InternalSensinact.g:346:2: iv_ruleDSL_On= ruleDSL_On EOF
+ {
+ newCompositeNode(grammarAccess.getDSL_OnRule());
+ pushFollow(FOLLOW_1);
+ iv_ruleDSL_On=ruleDSL_On();
+
+ state._fsp--;
+
+ current =iv_ruleDSL_On;
+ match(input,EOF,FOLLOW_2);
+
+ }
+
+ }
+
+ catch (RecognitionException re) {
+ recover(input,re);
+ appendSkippedTokens();
+ }
+ finally {
+ }
+ return current;
+ }
+ // $ANTLR end "entryRuleDSL_On"
+
+
+ // $ANTLR start "ruleDSL_On"
+ // InternalSensinact.g:352:1: ruleDSL_On returns [EObject current=null] : (otherlv_0= 'on' ( (lv_triggers_1_0= ruleDSL_REF_CONDITION ) ) (otherlv_2= ',' ( (lv_triggers_3_0= ruleDSL_REF_CONDITION ) ) )* ) ;
+ public final EObject ruleDSL_On() throws RecognitionException {
+ EObject current = null;
+
+ Token otherlv_0=null;
+ Token otherlv_2=null;
+ EObject lv_triggers_1_0 = null;
+
+ EObject lv_triggers_3_0 = null;
+
+
+
+ enterRule();
+
+ try {
+ // InternalSensinact.g:358:2: ( (otherlv_0= 'on' ( (lv_triggers_1_0= ruleDSL_REF_CONDITION ) ) (otherlv_2= ',' ( (lv_triggers_3_0= ruleDSL_REF_CONDITION ) ) )* ) )
+ // InternalSensinact.g:359:2: (otherlv_0= 'on' ( (lv_triggers_1_0= ruleDSL_REF_CONDITION ) ) (otherlv_2= ',' ( (lv_triggers_3_0= ruleDSL_REF_CONDITION ) ) )* )
+ {
+ // InternalSensinact.g:359:2: (otherlv_0= 'on' ( (lv_triggers_1_0= ruleDSL_REF_CONDITION ) ) (otherlv_2= ',' ( (lv_triggers_3_0= ruleDSL_REF_CONDITION ) ) )* )
+ // InternalSensinact.g:360:3: otherlv_0= 'on' ( (lv_triggers_1_0= ruleDSL_REF_CONDITION ) ) (otherlv_2= ',' ( (lv_triggers_3_0= ruleDSL_REF_CONDITION ) ) )*
+ {
+ otherlv_0=(Token)match(input,17,FOLLOW_6);
+
+ newLeafNode(otherlv_0, grammarAccess.getDSL_OnAccess().getOnKeyword_0());
+
+ // InternalSensinact.g:364:3: ( (lv_triggers_1_0= ruleDSL_REF_CONDITION ) )
+ // InternalSensinact.g:365:4: (lv_triggers_1_0= ruleDSL_REF_CONDITION )
+ {
+ // InternalSensinact.g:365:4: (lv_triggers_1_0= ruleDSL_REF_CONDITION )
+ // InternalSensinact.g:366:5: lv_triggers_1_0= ruleDSL_REF_CONDITION
+ {
+
+ newCompositeNode(grammarAccess.getDSL_OnAccess().getTriggersDSL_REF_CONDITIONParserRuleCall_1_0());
+
+ pushFollow(FOLLOW_11);
+ lv_triggers_1_0=ruleDSL_REF_CONDITION();
+
+ state._fsp--;
+
+
+ if (current==null) {
+ current = createModelElementForParent(grammarAccess.getDSL_OnRule());
+ }
+ add(
+ current,
+ "triggers",
+ lv_triggers_1_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_REF_CONDITION");
+ afterParserOrEnumRuleCall();
+
+
+ }
+
+
+ }
+
+ // InternalSensinact.g:383:3: (otherlv_2= ',' ( (lv_triggers_3_0= ruleDSL_REF_CONDITION ) ) )*
+ loop3:
+ do {
+ int alt3=2;
+ int LA3_0 = input.LA(1);
+
+ if ( (LA3_0==18) ) {
+ alt3=1;
+ }
+
+
+ switch (alt3) {
+ case 1 :
+ // InternalSensinact.g:384:4: otherlv_2= ',' ( (lv_triggers_3_0= ruleDSL_REF_CONDITION ) )
+ {
+ otherlv_2=(Token)match(input,18,FOLLOW_6);
+
+ newLeafNode(otherlv_2, grammarAccess.getDSL_OnAccess().getCommaKeyword_2_0());
+
+ // InternalSensinact.g:388:4: ( (lv_triggers_3_0= ruleDSL_REF_CONDITION ) )
+ // InternalSensinact.g:389:5: (lv_triggers_3_0= ruleDSL_REF_CONDITION )
+ {
+ // InternalSensinact.g:389:5: (lv_triggers_3_0= ruleDSL_REF_CONDITION )
+ // InternalSensinact.g:390:6: lv_triggers_3_0= ruleDSL_REF_CONDITION
+ {
+
+ newCompositeNode(grammarAccess.getDSL_OnAccess().getTriggersDSL_REF_CONDITIONParserRuleCall_2_1_0());
+
+ pushFollow(FOLLOW_11);
+ lv_triggers_3_0=ruleDSL_REF_CONDITION();
+
+ state._fsp--;
+
+
+ if (current==null) {
+ current = createModelElementForParent(grammarAccess.getDSL_OnRule());
+ }
+ add(
+ current,
+ "triggers",
+ lv_triggers_3_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_REF_CONDITION");
+ afterParserOrEnumRuleCall();
+
+
+ }
+
+
+ }
+
+
+ }
+ break;
+
+ default :
+ break loop3;
+ }
+ } while (true);
+
+
+ }
+
+
+ }
+
+
+ leaveRule();
+
+ }
+
+ catch (RecognitionException re) {
+ recover(input,re);
+ appendSkippedTokens();
+ }
+ finally {
+ }
+ return current;
+ }
+ // $ANTLR end "ruleDSL_On"
+
+
+ // $ANTLR start "entryRuleDSL_ECA_STATEMENT"
+ // InternalSensinact.g:412:1: entryRuleDSL_ECA_STATEMENT returns [EObject current=null] : iv_ruleDSL_ECA_STATEMENT= ruleDSL_ECA_STATEMENT EOF ;
+ public final EObject entryRuleDSL_ECA_STATEMENT() throws RecognitionException {
+ EObject current = null;
+
+ EObject iv_ruleDSL_ECA_STATEMENT = null;
+
+
+ try {
+ // InternalSensinact.g:412:58: (iv_ruleDSL_ECA_STATEMENT= ruleDSL_ECA_STATEMENT EOF )
+ // InternalSensinact.g:413:2: iv_ruleDSL_ECA_STATEMENT= ruleDSL_ECA_STATEMENT EOF
+ {
+ newCompositeNode(grammarAccess.getDSL_ECA_STATEMENTRule());
+ pushFollow(FOLLOW_1);
+ iv_ruleDSL_ECA_STATEMENT=ruleDSL_ECA_STATEMENT();
+
+ state._fsp--;
+
+ current =iv_ruleDSL_ECA_STATEMENT;
+ match(input,EOF,FOLLOW_2);
+
+ }
+
+ }
+
+ catch (RecognitionException re) {
+ recover(input,re);
+ appendSkippedTokens();
+ }
+ finally {
+ }
+ return current;
+ }
+ // $ANTLR end "entryRuleDSL_ECA_STATEMENT"
+
+
+ // $ANTLR start "ruleDSL_ECA_STATEMENT"
+ // InternalSensinact.g:419:1: ruleDSL_ECA_STATEMENT returns [EObject current=null] : ( ( (lv_ifdo_0_0= ruleDSL_IfDo ) ) ( (lv_elseIfdo_1_0= ruleDSL_ElseIfDo ) )* ( (lv_elsedo_2_0= ruleDSL_ElseDo ) )? otherlv_3= 'end if' ) ;
+ public final EObject ruleDSL_ECA_STATEMENT() throws RecognitionException {
+ EObject current = null;
+
+ Token otherlv_3=null;
+ EObject lv_ifdo_0_0 = null;
+
+ EObject lv_elseIfdo_1_0 = null;
+
+ EObject lv_elsedo_2_0 = null;
+
+
+
+ enterRule();
+
+ try {
+ // InternalSensinact.g:425:2: ( ( ( (lv_ifdo_0_0= ruleDSL_IfDo ) ) ( (lv_elseIfdo_1_0= ruleDSL_ElseIfDo ) )* ( (lv_elsedo_2_0= ruleDSL_ElseDo ) )? otherlv_3= 'end if' ) )
+ // InternalSensinact.g:426:2: ( ( (lv_ifdo_0_0= ruleDSL_IfDo ) ) ( (lv_elseIfdo_1_0= ruleDSL_ElseIfDo ) )* ( (lv_elsedo_2_0= ruleDSL_ElseDo ) )? otherlv_3= 'end if' )
+ {
+ // InternalSensinact.g:426:2: ( ( (lv_ifdo_0_0= ruleDSL_IfDo ) ) ( (lv_elseIfdo_1_0= ruleDSL_ElseIfDo ) )* ( (lv_elsedo_2_0= ruleDSL_ElseDo ) )? otherlv_3= 'end if' )
+ // InternalSensinact.g:427:3: ( (lv_ifdo_0_0= ruleDSL_IfDo ) ) ( (lv_elseIfdo_1_0= ruleDSL_ElseIfDo ) )* ( (lv_elsedo_2_0= ruleDSL_ElseDo ) )? otherlv_3= 'end if'
+ {
+ // InternalSensinact.g:427:3: ( (lv_ifdo_0_0= ruleDSL_IfDo ) )
+ // InternalSensinact.g:428:4: (lv_ifdo_0_0= ruleDSL_IfDo )
+ {
+ // InternalSensinact.g:428:4: (lv_ifdo_0_0= ruleDSL_IfDo )
+ // InternalSensinact.g:429:5: lv_ifdo_0_0= ruleDSL_IfDo
+ {
+
+ newCompositeNode(grammarAccess.getDSL_ECA_STATEMENTAccess().getIfdoDSL_IfDoParserRuleCall_0_0());
+
+ pushFollow(FOLLOW_12);
+ lv_ifdo_0_0=ruleDSL_IfDo();
+
+ state._fsp--;
+
+
+ if (current==null) {
+ current = createModelElementForParent(grammarAccess.getDSL_ECA_STATEMENTRule());
+ }
+ set(
+ current,
+ "ifdo",
+ lv_ifdo_0_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_IfDo");
+ afterParserOrEnumRuleCall();
+
+
+ }
+
+
+ }
+
+ // InternalSensinact.g:446:3: ( (lv_elseIfdo_1_0= ruleDSL_ElseIfDo ) )*
+ loop4:
+ do {
+ int alt4=2;
+ int LA4_0 = input.LA(1);
+
+ if ( (LA4_0==22) ) {
+ alt4=1;
+ }
+
+
+ switch (alt4) {
+ case 1 :
+ // InternalSensinact.g:447:4: (lv_elseIfdo_1_0= ruleDSL_ElseIfDo )
+ {
+ // InternalSensinact.g:447:4: (lv_elseIfdo_1_0= ruleDSL_ElseIfDo )
+ // InternalSensinact.g:448:5: lv_elseIfdo_1_0= ruleDSL_ElseIfDo
+ {
+
+ newCompositeNode(grammarAccess.getDSL_ECA_STATEMENTAccess().getElseIfdoDSL_ElseIfDoParserRuleCall_1_0());
+
+ pushFollow(FOLLOW_12);
+ lv_elseIfdo_1_0=ruleDSL_ElseIfDo();
+
+ state._fsp--;
+
+
+ if (current==null) {
+ current = createModelElementForParent(grammarAccess.getDSL_ECA_STATEMENTRule());
+ }
+ add(
+ current,
+ "elseIfdo",
+ lv_elseIfdo_1_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_ElseIfDo");
+ afterParserOrEnumRuleCall();
+
+
+ }
+
+
+ }
+ break;
+
+ default :
+ break loop4;
+ }
+ } while (true);
+
+ // InternalSensinact.g:465:3: ( (lv_elsedo_2_0= ruleDSL_ElseDo ) )?
+ int alt5=2;
+ int LA5_0 = input.LA(1);
+
+ if ( (LA5_0==23) ) {
+ alt5=1;
+ }
+ switch (alt5) {
+ case 1 :
+ // InternalSensinact.g:466:4: (lv_elsedo_2_0= ruleDSL_ElseDo )
+ {
+ // InternalSensinact.g:466:4: (lv_elsedo_2_0= ruleDSL_ElseDo )
+ // InternalSensinact.g:467:5: lv_elsedo_2_0= ruleDSL_ElseDo
+ {
+
+ newCompositeNode(grammarAccess.getDSL_ECA_STATEMENTAccess().getElsedoDSL_ElseDoParserRuleCall_2_0());
+
+ pushFollow(FOLLOW_13);
+ lv_elsedo_2_0=ruleDSL_ElseDo();
+
+ state._fsp--;
+
+
+ if (current==null) {
+ current = createModelElementForParent(grammarAccess.getDSL_ECA_STATEMENTRule());
+ }
+ set(
+ current,
+ "elsedo",
+ lv_elsedo_2_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_ElseDo");
+ afterParserOrEnumRuleCall();
+
+
+ }
+
+
+ }
+ break;
+
+ }
+
+ otherlv_3=(Token)match(input,19,FOLLOW_2);
+
+ newLeafNode(otherlv_3, grammarAccess.getDSL_ECA_STATEMENTAccess().getEndIfKeyword_3());
+
+
+ }
+
+
+ }
+
+
+ leaveRule();
+
+ }
+
+ catch (RecognitionException re) {
+ recover(input,re);
+ appendSkippedTokens();
+ }
+ finally {
+ }
+ return current;
+ }
+ // $ANTLR end "ruleDSL_ECA_STATEMENT"
+
+
+ // $ANTLR start "entryRuleDSL_IfDo"
+ // InternalSensinact.g:492:1: entryRuleDSL_IfDo returns [EObject current=null] : iv_ruleDSL_IfDo= ruleDSL_IfDo EOF ;
+ public final EObject entryRuleDSL_IfDo() throws RecognitionException {
+ EObject current = null;
+
+ EObject iv_ruleDSL_IfDo = null;
+
+
+ try {
+ // InternalSensinact.g:492:49: (iv_ruleDSL_IfDo= ruleDSL_IfDo EOF )
+ // InternalSensinact.g:493:2: iv_ruleDSL_IfDo= ruleDSL_IfDo EOF
+ {
+ newCompositeNode(grammarAccess.getDSL_IfDoRule());
+ pushFollow(FOLLOW_1);
+ iv_ruleDSL_IfDo=ruleDSL_IfDo();
+
+ state._fsp--;
+
+ current =iv_ruleDSL_IfDo;
+ match(input,EOF,FOLLOW_2);
+
+ }
+
+ }
+
+ catch (RecognitionException re) {
+ recover(input,re);
+ appendSkippedTokens();
+ }
+ finally {
+ }
+ return current;
+ }
+ // $ANTLR end "entryRuleDSL_IfDo"
+
+
+ // $ANTLR start "ruleDSL_IfDo"
+ // InternalSensinact.g:499:1: ruleDSL_IfDo returns [EObject current=null] : (otherlv_0= 'if' ( (lv_condition_1_0= ruleDSL_Expression_Or ) ) otherlv_2= 'do' ( (lv_actions_3_0= ruleDSL_ListActions ) ) ) ;
+ public final EObject ruleDSL_IfDo() throws RecognitionException {
+ EObject current = null;
+
+ Token otherlv_0=null;
+ Token otherlv_2=null;
+ EObject lv_condition_1_0 = null;
+
+ EObject lv_actions_3_0 = null;
+
+
+
+ enterRule();
+
+ try {
+ // InternalSensinact.g:505:2: ( (otherlv_0= 'if' ( (lv_condition_1_0= ruleDSL_Expression_Or ) ) otherlv_2= 'do' ( (lv_actions_3_0= ruleDSL_ListActions ) ) ) )
+ // InternalSensinact.g:506:2: (otherlv_0= 'if' ( (lv_condition_1_0= ruleDSL_Expression_Or ) ) otherlv_2= 'do' ( (lv_actions_3_0= ruleDSL_ListActions ) ) )
+ {
+ // InternalSensinact.g:506:2: (otherlv_0= 'if' ( (lv_condition_1_0= ruleDSL_Expression_Or ) ) otherlv_2= 'do' ( (lv_actions_3_0= ruleDSL_ListActions ) ) )
+ // InternalSensinact.g:507:3: otherlv_0= 'if' ( (lv_condition_1_0= ruleDSL_Expression_Or ) ) otherlv_2= 'do' ( (lv_actions_3_0= ruleDSL_ListActions ) )
+ {
+ otherlv_0=(Token)match(input,20,FOLLOW_14);
+
+ newLeafNode(otherlv_0, grammarAccess.getDSL_IfDoAccess().getIfKeyword_0());
+
+ // InternalSensinact.g:511:3: ( (lv_condition_1_0= ruleDSL_Expression_Or ) )
+ // InternalSensinact.g:512:4: (lv_condition_1_0= ruleDSL_Expression_Or )
+ {
+ // InternalSensinact.g:512:4: (lv_condition_1_0= ruleDSL_Expression_Or )
+ // InternalSensinact.g:513:5: lv_condition_1_0= ruleDSL_Expression_Or
+ {
+
+ newCompositeNode(grammarAccess.getDSL_IfDoAccess().getConditionDSL_Expression_OrParserRuleCall_1_0());
+
+ pushFollow(FOLLOW_15);
+ lv_condition_1_0=ruleDSL_Expression_Or();
+
+ state._fsp--;
+
+
+ if (current==null) {
+ current = createModelElementForParent(grammarAccess.getDSL_IfDoRule());
+ }
+ set(
+ current,
+ "condition",
+ lv_condition_1_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_Expression_Or");
+ afterParserOrEnumRuleCall();
+
+
+ }
+
+
+ }
+
+ otherlv_2=(Token)match(input,21,FOLLOW_6);
+
+ newLeafNode(otherlv_2, grammarAccess.getDSL_IfDoAccess().getDoKeyword_2());
+
+ // InternalSensinact.g:534:3: ( (lv_actions_3_0= ruleDSL_ListActions ) )
+ // InternalSensinact.g:535:4: (lv_actions_3_0= ruleDSL_ListActions )
+ {
+ // InternalSensinact.g:535:4: (lv_actions_3_0= ruleDSL_ListActions )
+ // InternalSensinact.g:536:5: lv_actions_3_0= ruleDSL_ListActions
+ {
+
+ newCompositeNode(grammarAccess.getDSL_IfDoAccess().getActionsDSL_ListActionsParserRuleCall_3_0());
+
+ pushFollow(FOLLOW_2);
+ lv_actions_3_0=ruleDSL_ListActions();
+
+ state._fsp--;
+
+
+ if (current==null) {
+ current = createModelElementForParent(grammarAccess.getDSL_IfDoRule());
+ }
+ set(
+ current,
+ "actions",
+ lv_actions_3_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_ListActions");
+ afterParserOrEnumRuleCall();
+
+
+ }
+
+
+ }
+
+
+ }
+
+
+ }
+
+
+ leaveRule();
+
+ }
+
+ catch (RecognitionException re) {
+ recover(input,re);
+ appendSkippedTokens();
+ }
+ finally {
+ }
+ return current;
+ }
+ // $ANTLR end "ruleDSL_IfDo"
+
+
+ // $ANTLR start "entryRuleDSL_ElseIfDo"
+ // InternalSensinact.g:557:1: entryRuleDSL_ElseIfDo returns [EObject current=null] : iv_ruleDSL_ElseIfDo= ruleDSL_ElseIfDo EOF ;
+ public final EObject entryRuleDSL_ElseIfDo() throws RecognitionException {
+ EObject current = null;
+
+ EObject iv_ruleDSL_ElseIfDo = null;
+
+
+ try {
+ // InternalSensinact.g:557:53: (iv_ruleDSL_ElseIfDo= ruleDSL_ElseIfDo EOF )
+ // InternalSensinact.g:558:2: iv_ruleDSL_ElseIfDo= ruleDSL_ElseIfDo EOF
+ {
+ newCompositeNode(grammarAccess.getDSL_ElseIfDoRule());
+ pushFollow(FOLLOW_1);
+ iv_ruleDSL_ElseIfDo=ruleDSL_ElseIfDo();
+
+ state._fsp--;
+
+ current =iv_ruleDSL_ElseIfDo;
+ match(input,EOF,FOLLOW_2);
+
+ }
+
+ }
+
+ catch (RecognitionException re) {
+ recover(input,re);
+ appendSkippedTokens();
+ }
+ finally {
+ }
+ return current;
+ }
+ // $ANTLR end "entryRuleDSL_ElseIfDo"
+
+
+ // $ANTLR start "ruleDSL_ElseIfDo"
+ // InternalSensinact.g:564:1: ruleDSL_ElseIfDo returns [EObject current=null] : (otherlv_0= 'else if' ( (lv_condition_1_0= ruleDSL_Expression_Or ) ) otherlv_2= 'do' ( (lv_actions_3_0= ruleDSL_ListActions ) ) ) ;
+ public final EObject ruleDSL_ElseIfDo() throws RecognitionException {
+ EObject current = null;
+
+ Token otherlv_0=null;
+ Token otherlv_2=null;
+ EObject lv_condition_1_0 = null;
+
+ EObject lv_actions_3_0 = null;
+
+
+
+ enterRule();
+
+ try {
+ // InternalSensinact.g:570:2: ( (otherlv_0= 'else if' ( (lv_condition_1_0= ruleDSL_Expression_Or ) ) otherlv_2= 'do' ( (lv_actions_3_0= ruleDSL_ListActions ) ) ) )
+ // InternalSensinact.g:571:2: (otherlv_0= 'else if' ( (lv_condition_1_0= ruleDSL_Expression_Or ) ) otherlv_2= 'do' ( (lv_actions_3_0= ruleDSL_ListActions ) ) )
+ {
+ // InternalSensinact.g:571:2: (otherlv_0= 'else if' ( (lv_condition_1_0= ruleDSL_Expression_Or ) ) otherlv_2= 'do' ( (lv_actions_3_0= ruleDSL_ListActions ) ) )
+ // InternalSensinact.g:572:3: otherlv_0= 'else if' ( (lv_condition_1_0= ruleDSL_Expression_Or ) ) otherlv_2= 'do' ( (lv_actions_3_0= ruleDSL_ListActions ) )
+ {
+ otherlv_0=(Token)match(input,22,FOLLOW_14);
+
+ newLeafNode(otherlv_0, grammarAccess.getDSL_ElseIfDoAccess().getElseIfKeyword_0());
+
+ // InternalSensinact.g:576:3: ( (lv_condition_1_0= ruleDSL_Expression_Or ) )
+ // InternalSensinact.g:577:4: (lv_condition_1_0= ruleDSL_Expression_Or )
+ {
+ // InternalSensinact.g:577:4: (lv_condition_1_0= ruleDSL_Expression_Or )
+ // InternalSensinact.g:578:5: lv_condition_1_0= ruleDSL_Expression_Or
+ {
+
+ newCompositeNode(grammarAccess.getDSL_ElseIfDoAccess().getConditionDSL_Expression_OrParserRuleCall_1_0());
+
+ pushFollow(FOLLOW_15);
+ lv_condition_1_0=ruleDSL_Expression_Or();
+
+ state._fsp--;
+
+
+ if (current==null) {
+ current = createModelElementForParent(grammarAccess.getDSL_ElseIfDoRule());
+ }
+ set(
+ current,
+ "condition",
+ lv_condition_1_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_Expression_Or");
+ afterParserOrEnumRuleCall();
+
+
+ }
+
+
+ }
+
+ otherlv_2=(Token)match(input,21,FOLLOW_6);
+
+ newLeafNode(otherlv_2, grammarAccess.getDSL_ElseIfDoAccess().getDoKeyword_2());
+
+ // InternalSensinact.g:599:3: ( (lv_actions_3_0= ruleDSL_ListActions ) )
+ // InternalSensinact.g:600:4: (lv_actions_3_0= ruleDSL_ListActions )
+ {
+ // InternalSensinact.g:600:4: (lv_actions_3_0= ruleDSL_ListActions )
+ // InternalSensinact.g:601:5: lv_actions_3_0= ruleDSL_ListActions
+ {
+
+ newCompositeNode(grammarAccess.getDSL_ElseIfDoAccess().getActionsDSL_ListActionsParserRuleCall_3_0());
+
+ pushFollow(FOLLOW_2);
+ lv_actions_3_0=ruleDSL_ListActions();
+
+ state._fsp--;
+
+
+ if (current==null) {
+ current = createModelElementForParent(grammarAccess.getDSL_ElseIfDoRule());
+ }
+ set(
+ current,
+ "actions",
+ lv_actions_3_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_ListActions");
+ afterParserOrEnumRuleCall();
+
+
+ }
+
+
+ }
+
+
+ }
+
+
+ }
+
+
+ leaveRule();
+
+ }
+
+ catch (RecognitionException re) {
+ recover(input,re);
+ appendSkippedTokens();
+ }
+ finally {
+ }
+ return current;
+ }
+ // $ANTLR end "ruleDSL_ElseIfDo"
+
+
+ // $ANTLR start "entryRuleDSL_ElseDo"
+ // InternalSensinact.g:622:1: entryRuleDSL_ElseDo returns [EObject current=null] : iv_ruleDSL_ElseDo= ruleDSL_ElseDo EOF ;
+ public final EObject entryRuleDSL_ElseDo() throws RecognitionException {
+ EObject current = null;
+
+ EObject iv_ruleDSL_ElseDo = null;
+
+
+ try {
+ // InternalSensinact.g:622:51: (iv_ruleDSL_ElseDo= ruleDSL_ElseDo EOF )
+ // InternalSensinact.g:623:2: iv_ruleDSL_ElseDo= ruleDSL_ElseDo EOF
+ {
+ newCompositeNode(grammarAccess.getDSL_ElseDoRule());
+ pushFollow(FOLLOW_1);
+ iv_ruleDSL_ElseDo=ruleDSL_ElseDo();
+
+ state._fsp--;
+
+ current =iv_ruleDSL_ElseDo;
+ match(input,EOF,FOLLOW_2);
+
+ }
+
+ }
+
+ catch (RecognitionException re) {
+ recover(input,re);
+ appendSkippedTokens();
+ }
+ finally {
+ }
+ return current;
+ }
+ // $ANTLR end "entryRuleDSL_ElseDo"
+
+
+ // $ANTLR start "ruleDSL_ElseDo"
+ // InternalSensinact.g:629:1: ruleDSL_ElseDo returns [EObject current=null] : (otherlv_0= 'else do' ( (lv_actions_1_0= ruleDSL_ListActions ) ) ) ;
+ public final EObject ruleDSL_ElseDo() throws RecognitionException {
+ EObject current = null;
+
+ Token otherlv_0=null;
+ EObject lv_actions_1_0 = null;
+
+
+
+ enterRule();
+
+ try {
+ // InternalSensinact.g:635:2: ( (otherlv_0= 'else do' ( (lv_actions_1_0= ruleDSL_ListActions ) ) ) )
+ // InternalSensinact.g:636:2: (otherlv_0= 'else do' ( (lv_actions_1_0= ruleDSL_ListActions ) ) )
+ {
+ // InternalSensinact.g:636:2: (otherlv_0= 'else do' ( (lv_actions_1_0= ruleDSL_ListActions ) ) )
+ // InternalSensinact.g:637:3: otherlv_0= 'else do' ( (lv_actions_1_0= ruleDSL_ListActions ) )
+ {
+ otherlv_0=(Token)match(input,23,FOLLOW_6);
+
+ newLeafNode(otherlv_0, grammarAccess.getDSL_ElseDoAccess().getElseDoKeyword_0());
+
+ // InternalSensinact.g:641:3: ( (lv_actions_1_0= ruleDSL_ListActions ) )
+ // InternalSensinact.g:642:4: (lv_actions_1_0= ruleDSL_ListActions )
+ {
+ // InternalSensinact.g:642:4: (lv_actions_1_0= ruleDSL_ListActions )
+ // InternalSensinact.g:643:5: lv_actions_1_0= ruleDSL_ListActions
+ {
+
+ newCompositeNode(grammarAccess.getDSL_ElseDoAccess().getActionsDSL_ListActionsParserRuleCall_1_0());
+
+ pushFollow(FOLLOW_2);
+ lv_actions_1_0=ruleDSL_ListActions();
+
+ state._fsp--;
+
+
+ if (current==null) {
+ current = createModelElementForParent(grammarAccess.getDSL_ElseDoRule());
+ }
+ set(
+ current,
+ "actions",
+ lv_actions_1_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_ListActions");
+ afterParserOrEnumRuleCall();
+
+
+ }
+
+
+ }
+
+
+ }
+
+
+ }
+
+
+ leaveRule();
+
+ }
+
+ catch (RecognitionException re) {
+ recover(input,re);
+ appendSkippedTokens();
+ }
+ finally {
+ }
+ return current;
+ }
+ // $ANTLR end "ruleDSL_ElseDo"
+
+
+ // $ANTLR start "entryRuleNUMBER"
+ // InternalSensinact.g:664:1: entryRuleNUMBER returns [String current=null] : iv_ruleNUMBER= ruleNUMBER EOF ;
+ public final String entryRuleNUMBER() throws RecognitionException {
+ String current = null;
+
+ AntlrDatatypeRuleToken iv_ruleNUMBER = null;
+
+
+ try {
+ // InternalSensinact.g:664:46: (iv_ruleNUMBER= ruleNUMBER EOF )
+ // InternalSensinact.g:665:2: iv_ruleNUMBER= ruleNUMBER EOF
+ {
+ newCompositeNode(grammarAccess.getNUMBERRule());
+ pushFollow(FOLLOW_1);
+ iv_ruleNUMBER=ruleNUMBER();
+
+ state._fsp--;
+
+ current =iv_ruleNUMBER.getText();
+ match(input,EOF,FOLLOW_2);
+
+ }
+
+ }
+
+ catch (RecognitionException re) {
+ recover(input,re);
+ appendSkippedTokens();
+ }
+ finally {
+ }
+ return current;
+ }
+ // $ANTLR end "entryRuleNUMBER"
+
+
+ // $ANTLR start "ruleNUMBER"
+ // InternalSensinact.g:671:1: ruleNUMBER returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_INT_0= RULE_INT | (this_INT_1= RULE_INT kw= '.' this_INT_3= RULE_INT ) ) ;
+ public final AntlrDatatypeRuleToken ruleNUMBER() throws RecognitionException {
+ AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
+
+ Token this_INT_0=null;
+ Token this_INT_1=null;
+ Token kw=null;
+ Token this_INT_3=null;
+
+
+ enterRule();
+
+ try {
+ // InternalSensinact.g:677:2: ( (this_INT_0= RULE_INT | (this_INT_1= RULE_INT kw= '.' this_INT_3= RULE_INT ) ) )
+ // InternalSensinact.g:678:2: (this_INT_0= RULE_INT | (this_INT_1= RULE_INT kw= '.' this_INT_3= RULE_INT ) )
+ {
+ // InternalSensinact.g:678:2: (this_INT_0= RULE_INT | (this_INT_1= RULE_INT kw= '.' this_INT_3= RULE_INT ) )
+ int alt6=2;
+ int LA6_0 = input.LA(1);
+
+ if ( (LA6_0==RULE_INT) ) {
+ int LA6_1 = input.LA(2);
+
+ if ( (LA6_1==EOF||LA6_1==15||LA6_1==18||LA6_1==21||LA6_1==27||LA6_1==32||LA6_1==37||(LA6_1>=40 && LA6_1<=51)) ) {
+ alt6=1;
+ }
+ else if ( (LA6_1==24) ) {
+ alt6=2;
+ }
+ else {
+ NoViableAltException nvae =
+ new NoViableAltException("", 6, 1, input);
+
+ throw nvae;
+ }
+ }
+ else {
+ NoViableAltException nvae =
+ new NoViableAltException("", 6, 0, input);
+
+ throw nvae;
+ }
+ switch (alt6) {
+ case 1 :
+ // InternalSensinact.g:679:3: this_INT_0= RULE_INT
+ {
+ this_INT_0=(Token)match(input,RULE_INT,FOLLOW_2);
+
+ current.merge(this_INT_0);
+
+
+ newLeafNode(this_INT_0, grammarAccess.getNUMBERAccess().getINTTerminalRuleCall_0());
+
+
+ }
+ break;
+ case 2 :
+ // InternalSensinact.g:687:3: (this_INT_1= RULE_INT kw= '.' this_INT_3= RULE_INT )
+ {
+ // InternalSensinact.g:687:3: (this_INT_1= RULE_INT kw= '.' this_INT_3= RULE_INT )
+ // InternalSensinact.g:688:4: this_INT_1= RULE_INT kw= '.' this_INT_3= RULE_INT
+ {
+ this_INT_1=(Token)match(input,RULE_INT,FOLLOW_16);
+
+ current.merge(this_INT_1);
+
+
+ newLeafNode(this_INT_1, grammarAccess.getNUMBERAccess().getINTTerminalRuleCall_1_0());
+
+ kw=(Token)match(input,24,FOLLOW_17);
+
+ current.merge(kw);
+ newLeafNode(kw, grammarAccess.getNUMBERAccess().getFullStopKeyword_1_1());
+
+ this_INT_3=(Token)match(input,RULE_INT,FOLLOW_2);
+
+ current.merge(this_INT_3);
+
+
+ newLeafNode(this_INT_3, grammarAccess.getNUMBERAccess().getINTTerminalRuleCall_1_2());
+
+
+ }
+
+
+ }
+ break;
+
+ }
+
+
+ }
+
+
+ leaveRule();
+
+ }
+
+ catch (RecognitionException re) {
+ recover(input,re);
+ appendSkippedTokens();
+ }
+ finally {
+ }
+ return current;
+ }
+ // $ANTLR end "ruleNUMBER"
+
+
+ // $ANTLR start "entryRuleEXTENDED_ID"
+ // InternalSensinact.g:712:1: entryRuleEXTENDED_ID returns [String current=null] : iv_ruleEXTENDED_ID= ruleEXTENDED_ID EOF ;
+ public final String entryRuleEXTENDED_ID() throws RecognitionException {
+ String current = null;
+
+ AntlrDatatypeRuleToken iv_ruleEXTENDED_ID = null;
+
+
+ try {
+ // InternalSensinact.g:712:51: (iv_ruleEXTENDED_ID= ruleEXTENDED_ID EOF )
+ // InternalSensinact.g:713:2: iv_ruleEXTENDED_ID= ruleEXTENDED_ID EOF
+ {
+ newCompositeNode(grammarAccess.getEXTENDED_IDRule());
+ pushFollow(FOLLOW_1);
+ iv_ruleEXTENDED_ID=ruleEXTENDED_ID();
+
+ state._fsp--;
+
+ current =iv_ruleEXTENDED_ID.getText();
+ match(input,EOF,FOLLOW_2);
+
+ }
+
+ }
+
+ catch (RecognitionException re) {
+ recover(input,re);
+ appendSkippedTokens();
+ }
+ finally {
+ }
+ return current;
+ }
+ // $ANTLR end "entryRuleEXTENDED_ID"
+
+
+ // $ANTLR start "ruleEXTENDED_ID"
+ // InternalSensinact.g:719:1: ruleEXTENDED_ID returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_ID_0= RULE_ID (kw= '.' this_ID_2= RULE_ID )* ) ;
+ public final AntlrDatatypeRuleToken ruleEXTENDED_ID() throws RecognitionException {
+ AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
+
+ Token this_ID_0=null;
+ Token kw=null;
+ Token this_ID_2=null;
+
+
+ enterRule();
+
+ try {
+ // InternalSensinact.g:725:2: ( (this_ID_0= RULE_ID (kw= '.' this_ID_2= RULE_ID )* ) )
+ // InternalSensinact.g:726:2: (this_ID_0= RULE_ID (kw= '.' this_ID_2= RULE_ID )* )
+ {
+ // InternalSensinact.g:726:2: (this_ID_0= RULE_ID (kw= '.' this_ID_2= RULE_ID )* )
+ // InternalSensinact.g:727:3: this_ID_0= RULE_ID (kw= '.' this_ID_2= RULE_ID )*
+ {
+ this_ID_0=(Token)match(input,RULE_ID,FOLLOW_18);
+
+ current.merge(this_ID_0);
+
+
+ newLeafNode(this_ID_0, grammarAccess.getEXTENDED_IDAccess().getIDTerminalRuleCall_0());
+
+ // InternalSensinact.g:734:3: (kw= '.' this_ID_2= RULE_ID )*
+ loop7:
+ do {
+ int alt7=2;
+ int LA7_0 = input.LA(1);
+
+ if ( (LA7_0==24) ) {
+ alt7=1;
+ }
+
+
+ switch (alt7) {
+ case 1 :
+ // InternalSensinact.g:735:4: kw= '.' this_ID_2= RULE_ID
+ {
+ kw=(Token)match(input,24,FOLLOW_6);
+
+ current.merge(kw);
+ newLeafNode(kw, grammarAccess.getEXTENDED_IDAccess().getFullStopKeyword_1_0());
+
+ this_ID_2=(Token)match(input,RULE_ID,FOLLOW_18);
+
+ current.merge(this_ID_2);
+
+
+ newLeafNode(this_ID_2, grammarAccess.getEXTENDED_IDAccess().getIDTerminalRuleCall_1_1());
+
+
+ }
+ break;
+
+ default :
+ break loop7;
+ }
+ } while (true);
+
+
+ }
+
+
+ }
+
+
+ leaveRule();
+
+ }
+
+ catch (RecognitionException re) {
+ recover(input,re);
+ appendSkippedTokens();
+ }
+ finally {
+ }
+ return current;
+ }
+ // $ANTLR end "ruleEXTENDED_ID"
+
+
+ // $ANTLR start "entryRuleDSL_REF_CONDITION"
+ // InternalSensinact.g:752:1: entryRuleDSL_REF_CONDITION returns [EObject current=null] : iv_ruleDSL_REF_CONDITION= ruleDSL_REF_CONDITION EOF ;
+ public final EObject entryRuleDSL_REF_CONDITION() throws RecognitionException {
+ EObject current = null;
+
+ EObject iv_ruleDSL_REF_CONDITION = null;
+
+
+ try {
+ // InternalSensinact.g:752:58: (iv_ruleDSL_REF_CONDITION= ruleDSL_REF_CONDITION EOF )
+ // InternalSensinact.g:753:2: iv_ruleDSL_REF_CONDITION= ruleDSL_REF_CONDITION EOF
+ {
+ newCompositeNode(grammarAccess.getDSL_REF_CONDITIONRule());
+ pushFollow(FOLLOW_1);
+ iv_ruleDSL_REF_CONDITION=ruleDSL_REF_CONDITION();
+
+ state._fsp--;
+
+ current =iv_ruleDSL_REF_CONDITION;
+ match(input,EOF,FOLLOW_2);
+
+ }
+
+ }
+
+ catch (RecognitionException re) {
+ recover(input,re);
+ appendSkippedTokens();
+ }
+ finally {
+ }
+ return current;
+ }
+ // $ANTLR end "entryRuleDSL_REF_CONDITION"
+
+
+ // $ANTLR start "ruleDSL_REF_CONDITION"
+ // InternalSensinact.g:759:1: ruleDSL_REF_CONDITION returns [EObject current=null] : ( ( (otherlv_0= RULE_ID ) ) otherlv_1= '.' otherlv_2= 'subscribe' otherlv_3= '(' otherlv_4= ')' ) ;
+ public final EObject ruleDSL_REF_CONDITION() throws RecognitionException {
+ EObject current = null;
+
+ Token otherlv_0=null;
+ Token otherlv_1=null;
+ Token otherlv_2=null;
+ Token otherlv_3=null;
+ Token otherlv_4=null;
+
+
+ enterRule();
+
+ try {
+ // InternalSensinact.g:765:2: ( ( ( (otherlv_0= RULE_ID ) ) otherlv_1= '.' otherlv_2= 'subscribe' otherlv_3= '(' otherlv_4= ')' ) )
+ // InternalSensinact.g:766:2: ( ( (otherlv_0= RULE_ID ) ) otherlv_1= '.' otherlv_2= 'subscribe' otherlv_3= '(' otherlv_4= ')' )
+ {
+ // InternalSensinact.g:766:2: ( ( (otherlv_0= RULE_ID ) ) otherlv_1= '.' otherlv_2= 'subscribe' otherlv_3= '(' otherlv_4= ')' )
+ // InternalSensinact.g:767:3: ( (otherlv_0= RULE_ID ) ) otherlv_1= '.' otherlv_2= 'subscribe' otherlv_3= '(' otherlv_4= ')'
+ {
+ // InternalSensinact.g:767:3: ( (otherlv_0= RULE_ID ) )
+ // InternalSensinact.g:768:4: (otherlv_0= RULE_ID )
+ {
+ // InternalSensinact.g:768:4: (otherlv_0= RULE_ID )
+ // InternalSensinact.g:769:5: otherlv_0= RULE_ID
+ {
+
+ if (current==null) {
+ current = createModelElement(grammarAccess.getDSL_REF_CONDITIONRule());
+ }
+
+ otherlv_0=(Token)match(input,RULE_ID,FOLLOW_16);
+
+ newLeafNode(otherlv_0, grammarAccess.getDSL_REF_CONDITIONAccess().getRefDSL_REFCrossReference_0_0());
+
+
+ }
+
+
+ }
+
+ otherlv_1=(Token)match(input,24,FOLLOW_19);
+
+ newLeafNode(otherlv_1, grammarAccess.getDSL_REF_CONDITIONAccess().getFullStopKeyword_1());
+
+ otherlv_2=(Token)match(input,25,FOLLOW_20);
+
+ newLeafNode(otherlv_2, grammarAccess.getDSL_REF_CONDITIONAccess().getSubscribeKeyword_2());
+
+ otherlv_3=(Token)match(input,26,FOLLOW_21);
+
+ newLeafNode(otherlv_3, grammarAccess.getDSL_REF_CONDITIONAccess().getLeftParenthesisKeyword_3());
+
+ otherlv_4=(Token)match(input,27,FOLLOW_2);
+
+ newLeafNode(otherlv_4, grammarAccess.getDSL_REF_CONDITIONAccess().getRightParenthesisKeyword_4());
+
+
+ }
+
+
+ }
+
+
+ leaveRule();
+
+ }
+
+ catch (RecognitionException re) {
+ recover(input,re);
+ appendSkippedTokens();
+ }
+ finally {
+ }
+ return current;
+ }
+ // $ANTLR end "ruleDSL_REF_CONDITION"
+
+
+ // $ANTLR start "entryRuleDSL_CEP_STATEMENT"
+ // InternalSensinact.g:800:1: entryRuleDSL_CEP_STATEMENT returns [EObject current=null] : iv_ruleDSL_CEP_STATEMENT= ruleDSL_CEP_STATEMENT EOF ;
+ public final EObject entryRuleDSL_CEP_STATEMENT() throws RecognitionException {
+ EObject current = null;
+
+ EObject iv_ruleDSL_CEP_STATEMENT = null;
+
+
+ try {
+ // InternalSensinact.g:800:58: (iv_ruleDSL_CEP_STATEMENT= ruleDSL_CEP_STATEMENT EOF )
+ // InternalSensinact.g:801:2: iv_ruleDSL_CEP_STATEMENT= ruleDSL_CEP_STATEMENT EOF
+ {
+ newCompositeNode(grammarAccess.getDSL_CEP_STATEMENTRule());
+ pushFollow(FOLLOW_1);
+ iv_ruleDSL_CEP_STATEMENT=ruleDSL_CEP_STATEMENT();
+
+ state._fsp--;
+
+ current =iv_ruleDSL_CEP_STATEMENT;
+ match(input,EOF,FOLLOW_2);
+
+ }
+
+ }
+
+ catch (RecognitionException re) {
+ recover(input,re);
+ appendSkippedTokens();
+ }
+ finally {
+ }
+ return current;
+ }
+ // $ANTLR end "entryRuleDSL_CEP_STATEMENT"
+
+
+ // $ANTLR start "ruleDSL_CEP_STATEMENT"
+ // InternalSensinact.g:807:1: ruleDSL_CEP_STATEMENT returns [EObject current=null] : (otherlv_0= 'define' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '=' ( ( (lv_operation_3_1= ruleDSL_CEP_AFTER | lv_operation_3_2= ruleDSL_CEP_BEFORE | lv_operation_3_3= ruleDSL_CEP_COINCIDE | lv_operation_3_4= ruleDSL_CEP_MIN | lv_operation_3_5= ruleDSL_CEP_MAX | lv_operation_3_6= ruleDSL_CEP_AVG | lv_operation_3_7= ruleDSL_CEP_SUM | lv_operation_3_8= ruleDSL_CEP_COUNT ) ) ) ) ;
+ public final EObject ruleDSL_CEP_STATEMENT() throws RecognitionException {
+ EObject current = null;
+
+ Token otherlv_0=null;
+ Token lv_name_1_0=null;
+ Token otherlv_2=null;
+ EObject lv_operation_3_1 = null;
+
+ EObject lv_operation_3_2 = null;
+
+ EObject lv_operation_3_3 = null;
+
+ EObject lv_operation_3_4 = null;
+
+ EObject lv_operation_3_5 = null;
+
+ EObject lv_operation_3_6 = null;
+
+ EObject lv_operation_3_7 = null;
+
+ EObject lv_operation_3_8 = null;
+
+
+
+ enterRule();
+
+ try {
+ // InternalSensinact.g:813:2: ( (otherlv_0= 'define' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '=' ( ( (lv_operation_3_1= ruleDSL_CEP_AFTER | lv_operation_3_2= ruleDSL_CEP_BEFORE | lv_operation_3_3= ruleDSL_CEP_COINCIDE | lv_operation_3_4= ruleDSL_CEP_MIN | lv_operation_3_5= ruleDSL_CEP_MAX | lv_operation_3_6= ruleDSL_CEP_AVG | lv_operation_3_7= ruleDSL_CEP_SUM | lv_operation_3_8= ruleDSL_CEP_COUNT ) ) ) ) )
+ // InternalSensinact.g:814:2: (otherlv_0= 'define' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '=' ( ( (lv_operation_3_1= ruleDSL_CEP_AFTER | lv_operation_3_2= ruleDSL_CEP_BEFORE | lv_operation_3_3= ruleDSL_CEP_COINCIDE | lv_operation_3_4= ruleDSL_CEP_MIN | lv_operation_3_5= ruleDSL_CEP_MAX | lv_operation_3_6= ruleDSL_CEP_AVG | lv_operation_3_7= ruleDSL_CEP_SUM | lv_operation_3_8= ruleDSL_CEP_COUNT ) ) ) )
+ {
+ // InternalSensinact.g:814:2: (otherlv_0= 'define' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '=' ( ( (lv_operation_3_1= ruleDSL_CEP_AFTER | lv_operation_3_2= ruleDSL_CEP_BEFORE | lv_operation_3_3= ruleDSL_CEP_COINCIDE | lv_operation_3_4= ruleDSL_CEP_MIN | lv_operation_3_5= ruleDSL_CEP_MAX | lv_operation_3_6= ruleDSL_CEP_AVG | lv_operation_3_7= ruleDSL_CEP_SUM | lv_operation_3_8= ruleDSL_CEP_COUNT ) ) ) )
+ // InternalSensinact.g:815:3: otherlv_0= 'define' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '=' ( ( (lv_operation_3_1= ruleDSL_CEP_AFTER | lv_operation_3_2= ruleDSL_CEP_BEFORE | lv_operation_3_3= ruleDSL_CEP_COINCIDE | lv_operation_3_4= ruleDSL_CEP_MIN | lv_operation_3_5= ruleDSL_CEP_MAX | lv_operation_3_6= ruleDSL_CEP_AVG | lv_operation_3_7= ruleDSL_CEP_SUM | lv_operation_3_8= ruleDSL_CEP_COUNT ) ) )
+ {
+ otherlv_0=(Token)match(input,28,FOLLOW_6);
+
+ newLeafNode(otherlv_0, grammarAccess.getDSL_CEP_STATEMENTAccess().getDefineKeyword_0());
+
+ // InternalSensinact.g:819:3: ( (lv_name_1_0= RULE_ID ) )
+ // InternalSensinact.g:820:4: (lv_name_1_0= RULE_ID )
+ {
+ // InternalSensinact.g:820:4: (lv_name_1_0= RULE_ID )
+ // InternalSensinact.g:821:5: lv_name_1_0= RULE_ID
+ {
+ lv_name_1_0=(Token)match(input,RULE_ID,FOLLOW_7);
+
+ newLeafNode(lv_name_1_0, grammarAccess.getDSL_CEP_STATEMENTAccess().getNameIDTerminalRuleCall_1_0());
+
+
+ if (current==null) {
+ current = createModelElement(grammarAccess.getDSL_CEP_STATEMENTRule());
+ }
+ setWithLastConsumed(
+ current,
+ "name",
+ lv_name_1_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.ID");
+
+
+ }
+
+
+ }
+
+ otherlv_2=(Token)match(input,13,FOLLOW_22);
+
+ newLeafNode(otherlv_2, grammarAccess.getDSL_CEP_STATEMENTAccess().getEqualsSignKeyword_2());
+
+ // InternalSensinact.g:841:3: ( ( (lv_operation_3_1= ruleDSL_CEP_AFTER | lv_operation_3_2= ruleDSL_CEP_BEFORE | lv_operation_3_3= ruleDSL_CEP_COINCIDE | lv_operation_3_4= ruleDSL_CEP_MIN | lv_operation_3_5= ruleDSL_CEP_MAX | lv_operation_3_6= ruleDSL_CEP_AVG | lv_operation_3_7= ruleDSL_CEP_SUM | lv_operation_3_8= ruleDSL_CEP_COUNT ) ) )
+ // InternalSensinact.g:842:4: ( (lv_operation_3_1= ruleDSL_CEP_AFTER | lv_operation_3_2= ruleDSL_CEP_BEFORE | lv_operation_3_3= ruleDSL_CEP_COINCIDE | lv_operation_3_4= ruleDSL_CEP_MIN | lv_operation_3_5= ruleDSL_CEP_MAX | lv_operation_3_6= ruleDSL_CEP_AVG | lv_operation_3_7= ruleDSL_CEP_SUM | lv_operation_3_8= ruleDSL_CEP_COUNT ) )
+ {
+ // InternalSensinact.g:842:4: ( (lv_operation_3_1= ruleDSL_CEP_AFTER | lv_operation_3_2= ruleDSL_CEP_BEFORE | lv_operation_3_3= ruleDSL_CEP_COINCIDE | lv_operation_3_4= ruleDSL_CEP_MIN | lv_operation_3_5= ruleDSL_CEP_MAX | lv_operation_3_6= ruleDSL_CEP_AVG | lv_operation_3_7= ruleDSL_CEP_SUM | lv_operation_3_8= ruleDSL_CEP_COUNT ) )
+ // InternalSensinact.g:843:5: (lv_operation_3_1= ruleDSL_CEP_AFTER | lv_operation_3_2= ruleDSL_CEP_BEFORE | lv_operation_3_3= ruleDSL_CEP_COINCIDE | lv_operation_3_4= ruleDSL_CEP_MIN | lv_operation_3_5= ruleDSL_CEP_MAX | lv_operation_3_6= ruleDSL_CEP_AVG | lv_operation_3_7= ruleDSL_CEP_SUM | lv_operation_3_8= ruleDSL_CEP_COUNT )
+ {
+ // InternalSensinact.g:843:5: (lv_operation_3_1= ruleDSL_CEP_AFTER | lv_operation_3_2= ruleDSL_CEP_BEFORE | lv_operation_3_3= ruleDSL_CEP_COINCIDE | lv_operation_3_4= ruleDSL_CEP_MIN | lv_operation_3_5= ruleDSL_CEP_MAX | lv_operation_3_6= ruleDSL_CEP_AVG | lv_operation_3_7= ruleDSL_CEP_SUM | lv_operation_3_8= ruleDSL_CEP_COUNT )
+ int alt8=8;
+ switch ( input.LA(1) ) {
+ case 29:
+ {
+ alt8=1;
+ }
+ break;
+ case 30:
+ {
+ alt8=2;
+ }
+ break;
+ case 31:
+ {
+ alt8=3;
+ }
+ break;
+ case 32:
+ {
+ alt8=4;
+ }
+ break;
+ case 33:
+ {
+ alt8=5;
+ }
+ break;
+ case 34:
+ {
+ alt8=6;
+ }
+ break;
+ case 35:
+ {
+ alt8=7;
+ }
+ break;
+ case 36:
+ {
+ alt8=8;
+ }
+ break;
+ default:
+ NoViableAltException nvae =
+ new NoViableAltException("", 8, 0, input);
+
+ throw nvae;
+ }
+
+ switch (alt8) {
+ case 1 :
+ // InternalSensinact.g:844:6: lv_operation_3_1= ruleDSL_CEP_AFTER
+ {
+
+ newCompositeNode(grammarAccess.getDSL_CEP_STATEMENTAccess().getOperationDSL_CEP_AFTERParserRuleCall_3_0_0());
+
+ pushFollow(FOLLOW_2);
+ lv_operation_3_1=ruleDSL_CEP_AFTER();
+
+ state._fsp--;
+
+
+ if (current==null) {
+ current = createModelElementForParent(grammarAccess.getDSL_CEP_STATEMENTRule());
+ }
+ set(
+ current,
+ "operation",
+ lv_operation_3_1,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_CEP_AFTER");
+ afterParserOrEnumRuleCall();
+
+
+ }
+ break;
+ case 2 :
+ // InternalSensinact.g:860:6: lv_operation_3_2= ruleDSL_CEP_BEFORE
+ {
+
+ newCompositeNode(grammarAccess.getDSL_CEP_STATEMENTAccess().getOperationDSL_CEP_BEFOREParserRuleCall_3_0_1());
+
+ pushFollow(FOLLOW_2);
+ lv_operation_3_2=ruleDSL_CEP_BEFORE();
+
+ state._fsp--;
+
+
+ if (current==null) {
+ current = createModelElementForParent(grammarAccess.getDSL_CEP_STATEMENTRule());
+ }
+ set(
+ current,
+ "operation",
+ lv_operation_3_2,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_CEP_BEFORE");
+ afterParserOrEnumRuleCall();
+
+
+ }
+ break;
+ case 3 :
+ // InternalSensinact.g:876:6: lv_operation_3_3= ruleDSL_CEP_COINCIDE
+ {
+
+ newCompositeNode(grammarAccess.getDSL_CEP_STATEMENTAccess().getOperationDSL_CEP_COINCIDEParserRuleCall_3_0_2());
+
+ pushFollow(FOLLOW_2);
+ lv_operation_3_3=ruleDSL_CEP_COINCIDE();
+
+ state._fsp--;
+
+
+ if (current==null) {
+ current = createModelElementForParent(grammarAccess.getDSL_CEP_STATEMENTRule());
+ }
+ set(
+ current,
+ "operation",
+ lv_operation_3_3,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_CEP_COINCIDE");
+ afterParserOrEnumRuleCall();
+
+
+ }
+ break;
+ case 4 :
+ // InternalSensinact.g:892:6: lv_operation_3_4= ruleDSL_CEP_MIN
+ {
+
+ newCompositeNode(grammarAccess.getDSL_CEP_STATEMENTAccess().getOperationDSL_CEP_MINParserRuleCall_3_0_3());
+
+ pushFollow(FOLLOW_2);
+ lv_operation_3_4=ruleDSL_CEP_MIN();
+
+ state._fsp--;
+
+
+ if (current==null) {
+ current = createModelElementForParent(grammarAccess.getDSL_CEP_STATEMENTRule());
+ }
+ set(
+ current,
+ "operation",
+ lv_operation_3_4,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_CEP_MIN");
+ afterParserOrEnumRuleCall();
+
+
+ }
+ break;
+ case 5 :
+ // InternalSensinact.g:908:6: lv_operation_3_5= ruleDSL_CEP_MAX
+ {
+
+ newCompositeNode(grammarAccess.getDSL_CEP_STATEMENTAccess().getOperationDSL_CEP_MAXParserRuleCall_3_0_4());
+
+ pushFollow(FOLLOW_2);
+ lv_operation_3_5=ruleDSL_CEP_MAX();
+
+ state._fsp--;
+
+
+ if (current==null) {
+ current = createModelElementForParent(grammarAccess.getDSL_CEP_STATEMENTRule());
+ }
+ set(
+ current,
+ "operation",
+ lv_operation_3_5,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_CEP_MAX");
+ afterParserOrEnumRuleCall();
+
+
+ }
+ break;
+ case 6 :
+ // InternalSensinact.g:924:6: lv_operation_3_6= ruleDSL_CEP_AVG
+ {
+
+ newCompositeNode(grammarAccess.getDSL_CEP_STATEMENTAccess().getOperationDSL_CEP_AVGParserRuleCall_3_0_5());
+
+ pushFollow(FOLLOW_2);
+ lv_operation_3_6=ruleDSL_CEP_AVG();
+
+ state._fsp--;
+
+
+ if (current==null) {
+ current = createModelElementForParent(grammarAccess.getDSL_CEP_STATEMENTRule());
+ }
+ set(
+ current,
+ "operation",
+ lv_operation_3_6,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_CEP_AVG");
+ afterParserOrEnumRuleCall();
+
+
+ }
+ break;
+ case 7 :
+ // InternalSensinact.g:940:6: lv_operation_3_7= ruleDSL_CEP_SUM
+ {
+
+ newCompositeNode(grammarAccess.getDSL_CEP_STATEMENTAccess().getOperationDSL_CEP_SUMParserRuleCall_3_0_6());
+
+ pushFollow(FOLLOW_2);
+ lv_operation_3_7=ruleDSL_CEP_SUM();
+
+ state._fsp--;
+
+
+ if (current==null) {
+ current = createModelElementForParent(grammarAccess.getDSL_CEP_STATEMENTRule());
+ }
+ set(
+ current,
+ "operation",
+ lv_operation_3_7,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_CEP_SUM");
+ afterParserOrEnumRuleCall();
+
+
+ }
+ break;
+ case 8 :
+ // InternalSensinact.g:956:6: lv_operation_3_8= ruleDSL_CEP_COUNT
+ {
+
+ newCompositeNode(grammarAccess.getDSL_CEP_STATEMENTAccess().getOperationDSL_CEP_COUNTParserRuleCall_3_0_7());
+
+ pushFollow(FOLLOW_2);
+ lv_operation_3_8=ruleDSL_CEP_COUNT();
+
+ state._fsp--;
+
+
+ if (current==null) {
+ current = createModelElementForParent(grammarAccess.getDSL_CEP_STATEMENTRule());
+ }
+ set(
+ current,
+ "operation",
+ lv_operation_3_8,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_CEP_COUNT");
+ afterParserOrEnumRuleCall();
+
+
+ }
+ break;
+
+ }
+
+
+ }
+
+
+ }
+
+
+ }
+
+
+ }
+
+
+ leaveRule();
+
+ }
+
+ catch (RecognitionException re) {
+ recover(input,re);
+ appendSkippedTokens();
+ }
+ finally {
+ }
+ return current;
+ }
+ // $ANTLR end "ruleDSL_CEP_STATEMENT"
+
+
+ // $ANTLR start "entryRuleDSL_CEP_AFTER"
+ // InternalSensinact.g:978:1: entryRuleDSL_CEP_AFTER returns [EObject current=null] : iv_ruleDSL_CEP_AFTER= ruleDSL_CEP_AFTER EOF ;
+ public final EObject entryRuleDSL_CEP_AFTER() throws RecognitionException {
+ EObject current = null;
+
+ EObject iv_ruleDSL_CEP_AFTER = null;
+
+
+ try {
+ // InternalSensinact.g:978:54: (iv_ruleDSL_CEP_AFTER= ruleDSL_CEP_AFTER EOF )
+ // InternalSensinact.g:979:2: iv_ruleDSL_CEP_AFTER= ruleDSL_CEP_AFTER EOF
+ {
+ newCompositeNode(grammarAccess.getDSL_CEP_AFTERRule());
+ pushFollow(FOLLOW_1);
+ iv_ruleDSL_CEP_AFTER=ruleDSL_CEP_AFTER();
+
+ state._fsp--;
+
+ current =iv_ruleDSL_CEP_AFTER;
+ match(input,EOF,FOLLOW_2);
+
+ }
+
+ }
+
+ catch (RecognitionException re) {
+ recover(input,re);
+ appendSkippedTokens();
+ }
+ finally {
+ }
+ return current;
+ }
+ // $ANTLR end "entryRuleDSL_CEP_AFTER"
+
+
+ // $ANTLR start "ruleDSL_CEP_AFTER"
+ // InternalSensinact.g:985:1: ruleDSL_CEP_AFTER returns [EObject current=null] : (otherlv_0= 'after' otherlv_1= '(' ( (lv_ref1_2_0= ruleDSL_REF_CONDITION ) ) otherlv_3= ',' ( (lv_ref2_4_0= ruleDSL_REF_CONDITION ) ) otherlv_5= ',' ( ( (lv_start_6_0= ruleDSL_CEP_DURATION ) ) otherlv_7= ',' )? ( (lv_end_8_0= ruleDSL_CEP_DURATION ) ) otherlv_9= ')' ) ;
+ public final EObject ruleDSL_CEP_AFTER() throws RecognitionException {
+ EObject current = null;
+
+ Token otherlv_0=null;
+ Token otherlv_1=null;
+ Token otherlv_3=null;
+ Token otherlv_5=null;
+ Token otherlv_7=null;
+ Token otherlv_9=null;
+ EObject lv_ref1_2_0 = null;
+
+ EObject lv_ref2_4_0 = null;
+
+ EObject lv_start_6_0 = null;
+
+ EObject lv_end_8_0 = null;
+
+
+
+ enterRule();
+
+ try {
+ // InternalSensinact.g:991:2: ( (otherlv_0= 'after' otherlv_1= '(' ( (lv_ref1_2_0= ruleDSL_REF_CONDITION ) ) otherlv_3= ',' ( (lv_ref2_4_0= ruleDSL_REF_CONDITION ) ) otherlv_5= ',' ( ( (lv_start_6_0= ruleDSL_CEP_DURATION ) ) otherlv_7= ',' )? ( (lv_end_8_0= ruleDSL_CEP_DURATION ) ) otherlv_9= ')' ) )
+ // InternalSensinact.g:992:2: (otherlv_0= 'after' otherlv_1= '(' ( (lv_ref1_2_0= ruleDSL_REF_CONDITION ) ) otherlv_3= ',' ( (lv_ref2_4_0= ruleDSL_REF_CONDITION ) ) otherlv_5= ',' ( ( (lv_start_6_0= ruleDSL_CEP_DURATION ) ) otherlv_7= ',' )? ( (lv_end_8_0= ruleDSL_CEP_DURATION ) ) otherlv_9= ')' )
+ {
+ // InternalSensinact.g:992:2: (otherlv_0= 'after' otherlv_1= '(' ( (lv_ref1_2_0= ruleDSL_REF_CONDITION ) ) otherlv_3= ',' ( (lv_ref2_4_0= ruleDSL_REF_CONDITION ) ) otherlv_5= ',' ( ( (lv_start_6_0= ruleDSL_CEP_DURATION ) ) otherlv_7= ',' )? ( (lv_end_8_0= ruleDSL_CEP_DURATION ) ) otherlv_9= ')' )
+ // InternalSensinact.g:993:3: otherlv_0= 'after' otherlv_1= '(' ( (lv_ref1_2_0= ruleDSL_REF_CONDITION ) ) otherlv_3= ',' ( (lv_ref2_4_0= ruleDSL_REF_CONDITION ) ) otherlv_5= ',' ( ( (lv_start_6_0= ruleDSL_CEP_DURATION ) ) otherlv_7= ',' )? ( (lv_end_8_0= ruleDSL_CEP_DURATION ) ) otherlv_9= ')'
+ {
+ otherlv_0=(Token)match(input,29,FOLLOW_20);
+
+ newLeafNode(otherlv_0, grammarAccess.getDSL_CEP_AFTERAccess().getAfterKeyword_0());
+
+ otherlv_1=(Token)match(input,26,FOLLOW_6);
+
+ newLeafNode(otherlv_1, grammarAccess.getDSL_CEP_AFTERAccess().getLeftParenthesisKeyword_1());
+
+ // InternalSensinact.g:1001:3: ( (lv_ref1_2_0= ruleDSL_REF_CONDITION ) )
+ // InternalSensinact.g:1002:4: (lv_ref1_2_0= ruleDSL_REF_CONDITION )
+ {
+ // InternalSensinact.g:1002:4: (lv_ref1_2_0= ruleDSL_REF_CONDITION )
+ // InternalSensinact.g:1003:5: lv_ref1_2_0= ruleDSL_REF_CONDITION
+ {
+
+ newCompositeNode(grammarAccess.getDSL_CEP_AFTERAccess().getRef1DSL_REF_CONDITIONParserRuleCall_2_0());
+
+ pushFollow(FOLLOW_23);
+ lv_ref1_2_0=ruleDSL_REF_CONDITION();
+
+ state._fsp--;
+
+
+ if (current==null) {
+ current = createModelElementForParent(grammarAccess.getDSL_CEP_AFTERRule());
+ }
+ set(
+ current,
+ "ref1",
+ lv_ref1_2_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_REF_CONDITION");
+ afterParserOrEnumRuleCall();
+
+
+ }
+
+
+ }
+
+ otherlv_3=(Token)match(input,18,FOLLOW_6);
+
+ newLeafNode(otherlv_3, grammarAccess.getDSL_CEP_AFTERAccess().getCommaKeyword_3());
+
+ // InternalSensinact.g:1024:3: ( (lv_ref2_4_0= ruleDSL_REF_CONDITION ) )
+ // InternalSensinact.g:1025:4: (lv_ref2_4_0= ruleDSL_REF_CONDITION )
+ {
+ // InternalSensinact.g:1025:4: (lv_ref2_4_0= ruleDSL_REF_CONDITION )
+ // InternalSensinact.g:1026:5: lv_ref2_4_0= ruleDSL_REF_CONDITION
+ {
+
+ newCompositeNode(grammarAccess.getDSL_CEP_AFTERAccess().getRef2DSL_REF_CONDITIONParserRuleCall_4_0());
+
+ pushFollow(FOLLOW_23);
+ lv_ref2_4_0=ruleDSL_REF_CONDITION();
+
+ state._fsp--;
+
+
+ if (current==null) {
+ current = createModelElementForParent(grammarAccess.getDSL_CEP_AFTERRule());
+ }
+ set(
+ current,
+ "ref2",
+ lv_ref2_4_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_REF_CONDITION");
+ afterParserOrEnumRuleCall();
+
+
+ }
+
+
+ }
+
+ otherlv_5=(Token)match(input,18,FOLLOW_17);
+
+ newLeafNode(otherlv_5, grammarAccess.getDSL_CEP_AFTERAccess().getCommaKeyword_5());
+
+ // InternalSensinact.g:1047:3: ( ( (lv_start_6_0= ruleDSL_CEP_DURATION ) ) otherlv_7= ',' )?
+ int alt9=2;
+ alt9 = dfa9.predict(input);
+ switch (alt9) {
+ case 1 :
+ // InternalSensinact.g:1048:4: ( (lv_start_6_0= ruleDSL_CEP_DURATION ) ) otherlv_7= ','
+ {
+ // InternalSensinact.g:1048:4: ( (lv_start_6_0= ruleDSL_CEP_DURATION ) )
+ // InternalSensinact.g:1049:5: (lv_start_6_0= ruleDSL_CEP_DURATION )
+ {
+ // InternalSensinact.g:1049:5: (lv_start_6_0= ruleDSL_CEP_DURATION )
+ // InternalSensinact.g:1050:6: lv_start_6_0= ruleDSL_CEP_DURATION
+ {
+
+ newCompositeNode(grammarAccess.getDSL_CEP_AFTERAccess().getStartDSL_CEP_DURATIONParserRuleCall_6_0_0());
+
+ pushFollow(FOLLOW_23);
+ lv_start_6_0=ruleDSL_CEP_DURATION();
+
+ state._fsp--;
+
+
+ if (current==null) {
+ current = createModelElementForParent(grammarAccess.getDSL_CEP_AFTERRule());
+ }
+ set(
+ current,
+ "start",
+ lv_start_6_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_CEP_DURATION");
+ afterParserOrEnumRuleCall();
+
+
+ }
+
+
+ }
+
+ otherlv_7=(Token)match(input,18,FOLLOW_17);
+
+ newLeafNode(otherlv_7, grammarAccess.getDSL_CEP_AFTERAccess().getCommaKeyword_6_1());
+
+
+ }
+ break;
+
+ }
+
+ // InternalSensinact.g:1072:3: ( (lv_end_8_0= ruleDSL_CEP_DURATION ) )
+ // InternalSensinact.g:1073:4: (lv_end_8_0= ruleDSL_CEP_DURATION )
+ {
+ // InternalSensinact.g:1073:4: (lv_end_8_0= ruleDSL_CEP_DURATION )
+ // InternalSensinact.g:1074:5: lv_end_8_0= ruleDSL_CEP_DURATION
+ {
+
+ newCompositeNode(grammarAccess.getDSL_CEP_AFTERAccess().getEndDSL_CEP_DURATIONParserRuleCall_7_0());
+
+ pushFollow(FOLLOW_21);
+ lv_end_8_0=ruleDSL_CEP_DURATION();
+
+ state._fsp--;
+
+
+ if (current==null) {
+ current = createModelElementForParent(grammarAccess.getDSL_CEP_AFTERRule());
+ }
+ set(
+ current,
+ "end",
+ lv_end_8_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_CEP_DURATION");
+ afterParserOrEnumRuleCall();
+
+
+ }
+
+
+ }
+
+ otherlv_9=(Token)match(input,27,FOLLOW_2);
+
+ newLeafNode(otherlv_9, grammarAccess.getDSL_CEP_AFTERAccess().getRightParenthesisKeyword_8());
+
+
+ }
+
+
+ }
+
+
+ leaveRule();
+
+ }
+
+ catch (RecognitionException re) {
+ recover(input,re);
+ appendSkippedTokens();
+ }
+ finally {
+ }
+ return current;
+ }
+ // $ANTLR end "ruleDSL_CEP_AFTER"
+
+
+ // $ANTLR start "entryRuleDSL_CEP_BEFORE"
+ // InternalSensinact.g:1099:1: entryRuleDSL_CEP_BEFORE returns [EObject current=null] : iv_ruleDSL_CEP_BEFORE= ruleDSL_CEP_BEFORE EOF ;
+ public final EObject entryRuleDSL_CEP_BEFORE() throws RecognitionException {
+ EObject current = null;
+
+ EObject iv_ruleDSL_CEP_BEFORE = null;
+
+
+ try {
+ // InternalSensinact.g:1099:55: (iv_ruleDSL_CEP_BEFORE= ruleDSL_CEP_BEFORE EOF )
+ // InternalSensinact.g:1100:2: iv_ruleDSL_CEP_BEFORE= ruleDSL_CEP_BEFORE EOF
+ {
+ newCompositeNode(grammarAccess.getDSL_CEP_BEFORERule());
+ pushFollow(FOLLOW_1);
+ iv_ruleDSL_CEP_BEFORE=ruleDSL_CEP_BEFORE();
+
+ state._fsp--;
+
+ current =iv_ruleDSL_CEP_BEFORE;
+ match(input,EOF,FOLLOW_2);
+
+ }
+
+ }
+
+ catch (RecognitionException re) {
+ recover(input,re);
+ appendSkippedTokens();
+ }
+ finally {
+ }
+ return current;
+ }
+ // $ANTLR end "entryRuleDSL_CEP_BEFORE"
+
+
+ // $ANTLR start "ruleDSL_CEP_BEFORE"
+ // InternalSensinact.g:1106:1: ruleDSL_CEP_BEFORE returns [EObject current=null] : (otherlv_0= 'before' otherlv_1= '(' ( (lv_ref1_2_0= ruleDSL_REF_CONDITION ) ) otherlv_3= ',' ( (lv_ref2_4_0= ruleDSL_REF_CONDITION ) ) otherlv_5= ',' ( ( (lv_start_6_0= ruleDSL_CEP_DURATION ) ) otherlv_7= ',' )? ( (lv_end_8_0= ruleDSL_CEP_DURATION ) ) otherlv_9= ')' ) ;
+ public final EObject ruleDSL_CEP_BEFORE() throws RecognitionException {
+ EObject current = null;
+
+ Token otherlv_0=null;
+ Token otherlv_1=null;
+ Token otherlv_3=null;
+ Token otherlv_5=null;
+ Token otherlv_7=null;
+ Token otherlv_9=null;
+ EObject lv_ref1_2_0 = null;
+
+ EObject lv_ref2_4_0 = null;
+
+ EObject lv_start_6_0 = null;
+
+ EObject lv_end_8_0 = null;
+
+
+
+ enterRule();
+
+ try {
+ // InternalSensinact.g:1112:2: ( (otherlv_0= 'before' otherlv_1= '(' ( (lv_ref1_2_0= ruleDSL_REF_CONDITION ) ) otherlv_3= ',' ( (lv_ref2_4_0= ruleDSL_REF_CONDITION ) ) otherlv_5= ',' ( ( (lv_start_6_0= ruleDSL_CEP_DURATION ) ) otherlv_7= ',' )? ( (lv_end_8_0= ruleDSL_CEP_DURATION ) ) otherlv_9= ')' ) )
+ // InternalSensinact.g:1113:2: (otherlv_0= 'before' otherlv_1= '(' ( (lv_ref1_2_0= ruleDSL_REF_CONDITION ) ) otherlv_3= ',' ( (lv_ref2_4_0= ruleDSL_REF_CONDITION ) ) otherlv_5= ',' ( ( (lv_start_6_0= ruleDSL_CEP_DURATION ) ) otherlv_7= ',' )? ( (lv_end_8_0= ruleDSL_CEP_DURATION ) ) otherlv_9= ')' )
+ {
+ // InternalSensinact.g:1113:2: (otherlv_0= 'before' otherlv_1= '(' ( (lv_ref1_2_0= ruleDSL_REF_CONDITION ) ) otherlv_3= ',' ( (lv_ref2_4_0= ruleDSL_REF_CONDITION ) ) otherlv_5= ',' ( ( (lv_start_6_0= ruleDSL_CEP_DURATION ) ) otherlv_7= ',' )? ( (lv_end_8_0= ruleDSL_CEP_DURATION ) ) otherlv_9= ')' )
+ // InternalSensinact.g:1114:3: otherlv_0= 'before' otherlv_1= '(' ( (lv_ref1_2_0= ruleDSL_REF_CONDITION ) ) otherlv_3= ',' ( (lv_ref2_4_0= ruleDSL_REF_CONDITION ) ) otherlv_5= ',' ( ( (lv_start_6_0= ruleDSL_CEP_DURATION ) ) otherlv_7= ',' )? ( (lv_end_8_0= ruleDSL_CEP_DURATION ) ) otherlv_9= ')'
+ {
+ otherlv_0=(Token)match(input,30,FOLLOW_20);
+
+ newLeafNode(otherlv_0, grammarAccess.getDSL_CEP_BEFOREAccess().getBeforeKeyword_0());
+
+ otherlv_1=(Token)match(input,26,FOLLOW_6);
+
+ newLeafNode(otherlv_1, grammarAccess.getDSL_CEP_BEFOREAccess().getLeftParenthesisKeyword_1());
+
+ // InternalSensinact.g:1122:3: ( (lv_ref1_2_0= ruleDSL_REF_CONDITION ) )
+ // InternalSensinact.g:1123:4: (lv_ref1_2_0= ruleDSL_REF_CONDITION )
+ {
+ // InternalSensinact.g:1123:4: (lv_ref1_2_0= ruleDSL_REF_CONDITION )
+ // InternalSensinact.g:1124:5: lv_ref1_2_0= ruleDSL_REF_CONDITION
+ {
+
+ newCompositeNode(grammarAccess.getDSL_CEP_BEFOREAccess().getRef1DSL_REF_CONDITIONParserRuleCall_2_0());
+
+ pushFollow(FOLLOW_23);
+ lv_ref1_2_0=ruleDSL_REF_CONDITION();
+
+ state._fsp--;
+
+
+ if (current==null) {
+ current = createModelElementForParent(grammarAccess.getDSL_CEP_BEFORERule());
+ }
+ set(
+ current,
+ "ref1",
+ lv_ref1_2_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_REF_CONDITION");
+ afterParserOrEnumRuleCall();
+
+
+ }
+
+
+ }
+
+ otherlv_3=(Token)match(input,18,FOLLOW_6);
+
+ newLeafNode(otherlv_3, grammarAccess.getDSL_CEP_BEFOREAccess().getCommaKeyword_3());
+
+ // InternalSensinact.g:1145:3: ( (lv_ref2_4_0= ruleDSL_REF_CONDITION ) )
+ // InternalSensinact.g:1146:4: (lv_ref2_4_0= ruleDSL_REF_CONDITION )
+ {
+ // InternalSensinact.g:1146:4: (lv_ref2_4_0= ruleDSL_REF_CONDITION )
+ // InternalSensinact.g:1147:5: lv_ref2_4_0= ruleDSL_REF_CONDITION
+ {
+
+ newCompositeNode(grammarAccess.getDSL_CEP_BEFOREAccess().getRef2DSL_REF_CONDITIONParserRuleCall_4_0());
+
+ pushFollow(FOLLOW_23);
+ lv_ref2_4_0=ruleDSL_REF_CONDITION();
+
+ state._fsp--;
+
+
+ if (current==null) {
+ current = createModelElementForParent(grammarAccess.getDSL_CEP_BEFORERule());
+ }
+ set(
+ current,
+ "ref2",
+ lv_ref2_4_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_REF_CONDITION");
+ afterParserOrEnumRuleCall();
+
+
+ }
+
+
+ }
+
+ otherlv_5=(Token)match(input,18,FOLLOW_17);
+
+ newLeafNode(otherlv_5, grammarAccess.getDSL_CEP_BEFOREAccess().getCommaKeyword_5());
+
+ // InternalSensinact.g:1168:3: ( ( (lv_start_6_0= ruleDSL_CEP_DURATION ) ) otherlv_7= ',' )?
+ int alt10=2;
+ alt10 = dfa10.predict(input);
+ switch (alt10) {
+ case 1 :
+ // InternalSensinact.g:1169:4: ( (lv_start_6_0= ruleDSL_CEP_DURATION ) ) otherlv_7= ','
+ {
+ // InternalSensinact.g:1169:4: ( (lv_start_6_0= ruleDSL_CEP_DURATION ) )
+ // InternalSensinact.g:1170:5: (lv_start_6_0= ruleDSL_CEP_DURATION )
+ {
+ // InternalSensinact.g:1170:5: (lv_start_6_0= ruleDSL_CEP_DURATION )
+ // InternalSensinact.g:1171:6: lv_start_6_0= ruleDSL_CEP_DURATION
+ {
+
+ newCompositeNode(grammarAccess.getDSL_CEP_BEFOREAccess().getStartDSL_CEP_DURATIONParserRuleCall_6_0_0());
+
+ pushFollow(FOLLOW_23);
+ lv_start_6_0=ruleDSL_CEP_DURATION();
+
+ state._fsp--;
+
+
+ if (current==null) {
+ current = createModelElementForParent(grammarAccess.getDSL_CEP_BEFORERule());
+ }
+ set(
+ current,
+ "start",
+ lv_start_6_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_CEP_DURATION");
+ afterParserOrEnumRuleCall();
+
+
+ }
+
+
+ }
+
+ otherlv_7=(Token)match(input,18,FOLLOW_17);
+
+ newLeafNode(otherlv_7, grammarAccess.getDSL_CEP_BEFOREAccess().getCommaKeyword_6_1());
+
+
+ }
+ break;
+
+ }
+
+ // InternalSensinact.g:1193:3: ( (lv_end_8_0= ruleDSL_CEP_DURATION ) )
+ // InternalSensinact.g:1194:4: (lv_end_8_0= ruleDSL_CEP_DURATION )
+ {
+ // InternalSensinact.g:1194:4: (lv_end_8_0= ruleDSL_CEP_DURATION )
+ // InternalSensinact.g:1195:5: lv_end_8_0= ruleDSL_CEP_DURATION
+ {
+
+ newCompositeNode(grammarAccess.getDSL_CEP_BEFOREAccess().getEndDSL_CEP_DURATIONParserRuleCall_7_0());
+
+ pushFollow(FOLLOW_21);
+ lv_end_8_0=ruleDSL_CEP_DURATION();
+
+ state._fsp--;
+
+
+ if (current==null) {
+ current = createModelElementForParent(grammarAccess.getDSL_CEP_BEFORERule());
+ }
+ set(
+ current,
+ "end",
+ lv_end_8_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_CEP_DURATION");
+ afterParserOrEnumRuleCall();
+
+
+ }
+
+
+ }
+
+ otherlv_9=(Token)match(input,27,FOLLOW_2);
+
+ newLeafNode(otherlv_9, grammarAccess.getDSL_CEP_BEFOREAccess().getRightParenthesisKeyword_8());
+
+
+ }
+
+
+ }
+
+
+ leaveRule();
+
+ }
+
+ catch (RecognitionException re) {
+ recover(input,re);
+ appendSkippedTokens();
+ }
+ finally {
+ }
+ return current;
+ }
+ // $ANTLR end "ruleDSL_CEP_BEFORE"
+
+
+ // $ANTLR start "entryRuleDSL_CEP_COINCIDE"
+ // InternalSensinact.g:1220:1: entryRuleDSL_CEP_COINCIDE returns [EObject current=null] : iv_ruleDSL_CEP_COINCIDE= ruleDSL_CEP_COINCIDE EOF ;
+ public final EObject entryRuleDSL_CEP_COINCIDE() throws RecognitionException {
+ EObject current = null;
+
+ EObject iv_ruleDSL_CEP_COINCIDE = null;
+
+
+ try {
+ // InternalSensinact.g:1220:57: (iv_ruleDSL_CEP_COINCIDE= ruleDSL_CEP_COINCIDE EOF )
+ // InternalSensinact.g:1221:2: iv_ruleDSL_CEP_COINCIDE= ruleDSL_CEP_COINCIDE EOF
+ {
+ newCompositeNode(grammarAccess.getDSL_CEP_COINCIDERule());
+ pushFollow(FOLLOW_1);
+ iv_ruleDSL_CEP_COINCIDE=ruleDSL_CEP_COINCIDE();
+
+ state._fsp--;
+
+ current =iv_ruleDSL_CEP_COINCIDE;
+ match(input,EOF,FOLLOW_2);
+
+ }
+
+ }
+
+ catch (RecognitionException re) {
+ recover(input,re);
+ appendSkippedTokens();
+ }
+ finally {
+ }
+ return current;
+ }
+ // $ANTLR end "entryRuleDSL_CEP_COINCIDE"
+
+
+ // $ANTLR start "ruleDSL_CEP_COINCIDE"
+ // InternalSensinact.g:1227:1: ruleDSL_CEP_COINCIDE returns [EObject current=null] : (otherlv_0= 'coincide' otherlv_1= '(' ( (lv_ref1_2_0= ruleDSL_REF_CONDITION ) ) otherlv_3= ',' ( (lv_ref2_4_0= ruleDSL_REF_CONDITION ) ) otherlv_5= ',' ( (lv_window_6_0= ruleDSL_CEP_DURATION ) ) otherlv_7= ')' ) ;
+ public final EObject ruleDSL_CEP_COINCIDE() throws RecognitionException {
+ EObject current = null;
+
+ Token otherlv_0=null;
+ Token otherlv_1=null;
+ Token otherlv_3=null;
+ Token otherlv_5=null;
+ Token otherlv_7=null;
+ EObject lv_ref1_2_0 = null;
+
+ EObject lv_ref2_4_0 = null;
+
+ EObject lv_window_6_0 = null;
+
+
+
+ enterRule();
+
+ try {
+ // InternalSensinact.g:1233:2: ( (otherlv_0= 'coincide' otherlv_1= '(' ( (lv_ref1_2_0= ruleDSL_REF_CONDITION ) ) otherlv_3= ',' ( (lv_ref2_4_0= ruleDSL_REF_CONDITION ) ) otherlv_5= ',' ( (lv_window_6_0= ruleDSL_CEP_DURATION ) ) otherlv_7= ')' ) )
+ // InternalSensinact.g:1234:2: (otherlv_0= 'coincide' otherlv_1= '(' ( (lv_ref1_2_0= ruleDSL_REF_CONDITION ) ) otherlv_3= ',' ( (lv_ref2_4_0= ruleDSL_REF_CONDITION ) ) otherlv_5= ',' ( (lv_window_6_0= ruleDSL_CEP_DURATION ) ) otherlv_7= ')' )
+ {
+ // InternalSensinact.g:1234:2: (otherlv_0= 'coincide' otherlv_1= '(' ( (lv_ref1_2_0= ruleDSL_REF_CONDITION ) ) otherlv_3= ',' ( (lv_ref2_4_0= ruleDSL_REF_CONDITION ) ) otherlv_5= ',' ( (lv_window_6_0= ruleDSL_CEP_DURATION ) ) otherlv_7= ')' )
+ // InternalSensinact.g:1235:3: otherlv_0= 'coincide' otherlv_1= '(' ( (lv_ref1_2_0= ruleDSL_REF_CONDITION ) ) otherlv_3= ',' ( (lv_ref2_4_0= ruleDSL_REF_CONDITION ) ) otherlv_5= ',' ( (lv_window_6_0= ruleDSL_CEP_DURATION ) ) otherlv_7= ')'
+ {
+ otherlv_0=(Token)match(input,31,FOLLOW_20);
+
+ newLeafNode(otherlv_0, grammarAccess.getDSL_CEP_COINCIDEAccess().getCoincideKeyword_0());
+
+ otherlv_1=(Token)match(input,26,FOLLOW_6);
+
+ newLeafNode(otherlv_1, grammarAccess.getDSL_CEP_COINCIDEAccess().getLeftParenthesisKeyword_1());
+
+ // InternalSensinact.g:1243:3: ( (lv_ref1_2_0= ruleDSL_REF_CONDITION ) )
+ // InternalSensinact.g:1244:4: (lv_ref1_2_0= ruleDSL_REF_CONDITION )
+ {
+ // InternalSensinact.g:1244:4: (lv_ref1_2_0= ruleDSL_REF_CONDITION )
+ // InternalSensinact.g:1245:5: lv_ref1_2_0= ruleDSL_REF_CONDITION
+ {
+
+ newCompositeNode(grammarAccess.getDSL_CEP_COINCIDEAccess().getRef1DSL_REF_CONDITIONParserRuleCall_2_0());
+
+ pushFollow(FOLLOW_23);
+ lv_ref1_2_0=ruleDSL_REF_CONDITION();
+
+ state._fsp--;
+
+
+ if (current==null) {
+ current = createModelElementForParent(grammarAccess.getDSL_CEP_COINCIDERule());
+ }
+ set(
+ current,
+ "ref1",
+ lv_ref1_2_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_REF_CONDITION");
+ afterParserOrEnumRuleCall();
+
+
+ }
+
+
+ }
+
+ otherlv_3=(Token)match(input,18,FOLLOW_6);
+
+ newLeafNode(otherlv_3, grammarAccess.getDSL_CEP_COINCIDEAccess().getCommaKeyword_3());
+
+ // InternalSensinact.g:1266:3: ( (lv_ref2_4_0= ruleDSL_REF_CONDITION ) )
+ // InternalSensinact.g:1267:4: (lv_ref2_4_0= ruleDSL_REF_CONDITION )
+ {
+ // InternalSensinact.g:1267:4: (lv_ref2_4_0= ruleDSL_REF_CONDITION )
+ // InternalSensinact.g:1268:5: lv_ref2_4_0= ruleDSL_REF_CONDITION
+ {
+
+ newCompositeNode(grammarAccess.getDSL_CEP_COINCIDEAccess().getRef2DSL_REF_CONDITIONParserRuleCall_4_0());
+
+ pushFollow(FOLLOW_23);
+ lv_ref2_4_0=ruleDSL_REF_CONDITION();
+
+ state._fsp--;
+
+
+ if (current==null) {
+ current = createModelElementForParent(grammarAccess.getDSL_CEP_COINCIDERule());
+ }
+ set(
+ current,
+ "ref2",
+ lv_ref2_4_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_REF_CONDITION");
+ afterParserOrEnumRuleCall();
+
+
+ }
+
+
+ }
+
+ otherlv_5=(Token)match(input,18,FOLLOW_17);
+
+ newLeafNode(otherlv_5, grammarAccess.getDSL_CEP_COINCIDEAccess().getCommaKeyword_5());
+
+ // InternalSensinact.g:1289:3: ( (lv_window_6_0= ruleDSL_CEP_DURATION ) )
+ // InternalSensinact.g:1290:4: (lv_window_6_0= ruleDSL_CEP_DURATION )
+ {
+ // InternalSensinact.g:1290:4: (lv_window_6_0= ruleDSL_CEP_DURATION )
+ // InternalSensinact.g:1291:5: lv_window_6_0= ruleDSL_CEP_DURATION
+ {
+
+ newCompositeNode(grammarAccess.getDSL_CEP_COINCIDEAccess().getWindowDSL_CEP_DURATIONParserRuleCall_6_0());
+
+ pushFollow(FOLLOW_21);
+ lv_window_6_0=ruleDSL_CEP_DURATION();
+
+ state._fsp--;
+
+
+ if (current==null) {
+ current = createModelElementForParent(grammarAccess.getDSL_CEP_COINCIDERule());
+ }
+ set(
+ current,
+ "window",
+ lv_window_6_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_CEP_DURATION");
+ afterParserOrEnumRuleCall();
+
+
+ }
+
+
+ }
+
+ otherlv_7=(Token)match(input,27,FOLLOW_2);
+
+ newLeafNode(otherlv_7, grammarAccess.getDSL_CEP_COINCIDEAccess().getRightParenthesisKeyword_7());
+
+
+ }
+
+
+ }
+
+
+ leaveRule();
+
+ }
+
+ catch (RecognitionException re) {
+ recover(input,re);
+ appendSkippedTokens();
+ }
+ finally {
+ }
+ return current;
+ }
+ // $ANTLR end "ruleDSL_CEP_COINCIDE"
+
+
+ // $ANTLR start "entryRuleDSL_CEP_MIN"
+ // InternalSensinact.g:1316:1: entryRuleDSL_CEP_MIN returns [EObject current=null] : iv_ruleDSL_CEP_MIN= ruleDSL_CEP_MIN EOF ;
+ public final EObject entryRuleDSL_CEP_MIN() throws RecognitionException {
+ EObject current = null;
+
+ EObject iv_ruleDSL_CEP_MIN = null;
+
+
+ try {
+ // InternalSensinact.g:1316:52: (iv_ruleDSL_CEP_MIN= ruleDSL_CEP_MIN EOF )
+ // InternalSensinact.g:1317:2: iv_ruleDSL_CEP_MIN= ruleDSL_CEP_MIN EOF
+ {
+ newCompositeNode(grammarAccess.getDSL_CEP_MINRule());
+ pushFollow(FOLLOW_1);
+ iv_ruleDSL_CEP_MIN=ruleDSL_CEP_MIN();
+
+ state._fsp--;
+
+ current =iv_ruleDSL_CEP_MIN;
+ match(input,EOF,FOLLOW_2);
+
+ }
+
+ }
+
+ catch (RecognitionException re) {
+ recover(input,re);
+ appendSkippedTokens();
+ }
+ finally {
+ }
+ return current;
+ }
+ // $ANTLR end "entryRuleDSL_CEP_MIN"
+
+
+ // $ANTLR start "ruleDSL_CEP_MIN"
+ // InternalSensinact.g:1323:1: ruleDSL_CEP_MIN returns [EObject current=null] : (otherlv_0= 'min' otherlv_1= '(' ( (lv_ref_2_0= ruleDSL_REF_CONDITION ) ) otherlv_3= ',' ( (lv_window_4_0= ruleDSL_CEP_DURATION ) ) otherlv_5= ')' ) ;
+ public final EObject ruleDSL_CEP_MIN() throws RecognitionException {
+ EObject current = null;
+
+ Token otherlv_0=null;
+ Token otherlv_1=null;
+ Token otherlv_3=null;
+ Token otherlv_5=null;
+ EObject lv_ref_2_0 = null;
+
+ EObject lv_window_4_0 = null;
+
+
+
+ enterRule();
+
+ try {
+ // InternalSensinact.g:1329:2: ( (otherlv_0= 'min' otherlv_1= '(' ( (lv_ref_2_0= ruleDSL_REF_CONDITION ) ) otherlv_3= ',' ( (lv_window_4_0= ruleDSL_CEP_DURATION ) ) otherlv_5= ')' ) )
+ // InternalSensinact.g:1330:2: (otherlv_0= 'min' otherlv_1= '(' ( (lv_ref_2_0= ruleDSL_REF_CONDITION ) ) otherlv_3= ',' ( (lv_window_4_0= ruleDSL_CEP_DURATION ) ) otherlv_5= ')' )
+ {
+ // InternalSensinact.g:1330:2: (otherlv_0= 'min' otherlv_1= '(' ( (lv_ref_2_0= ruleDSL_REF_CONDITION ) ) otherlv_3= ',' ( (lv_window_4_0= ruleDSL_CEP_DURATION ) ) otherlv_5= ')' )
+ // InternalSensinact.g:1331:3: otherlv_0= 'min' otherlv_1= '(' ( (lv_ref_2_0= ruleDSL_REF_CONDITION ) ) otherlv_3= ',' ( (lv_window_4_0= ruleDSL_CEP_DURATION ) ) otherlv_5= ')'
+ {
+ otherlv_0=(Token)match(input,32,FOLLOW_20);
+
+ newLeafNode(otherlv_0, grammarAccess.getDSL_CEP_MINAccess().getMinKeyword_0());
+
+ otherlv_1=(Token)match(input,26,FOLLOW_6);
+
+ newLeafNode(otherlv_1, grammarAccess.getDSL_CEP_MINAccess().getLeftParenthesisKeyword_1());
+
+ // InternalSensinact.g:1339:3: ( (lv_ref_2_0= ruleDSL_REF_CONDITION ) )
+ // InternalSensinact.g:1340:4: (lv_ref_2_0= ruleDSL_REF_CONDITION )
+ {
+ // InternalSensinact.g:1340:4: (lv_ref_2_0= ruleDSL_REF_CONDITION )
+ // InternalSensinact.g:1341:5: lv_ref_2_0= ruleDSL_REF_CONDITION
+ {
+
+ newCompositeNode(grammarAccess.getDSL_CEP_MINAccess().getRefDSL_REF_CONDITIONParserRuleCall_2_0());
+
+ pushFollow(FOLLOW_23);
+ lv_ref_2_0=ruleDSL_REF_CONDITION();
+
+ state._fsp--;
+
+
+ if (current==null) {
+ current = createModelElementForParent(grammarAccess.getDSL_CEP_MINRule());
+ }
+ set(
+ current,
+ "ref",
+ lv_ref_2_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_REF_CONDITION");
+ afterParserOrEnumRuleCall();
+
+
+ }
+
+
+ }
+
+ otherlv_3=(Token)match(input,18,FOLLOW_17);
+
+ newLeafNode(otherlv_3, grammarAccess.getDSL_CEP_MINAccess().getCommaKeyword_3());
+
+ // InternalSensinact.g:1362:3: ( (lv_window_4_0= ruleDSL_CEP_DURATION ) )
+ // InternalSensinact.g:1363:4: (lv_window_4_0= ruleDSL_CEP_DURATION )
+ {
+ // InternalSensinact.g:1363:4: (lv_window_4_0= ruleDSL_CEP_DURATION )
+ // InternalSensinact.g:1364:5: lv_window_4_0= ruleDSL_CEP_DURATION
+ {
+
+ newCompositeNode(grammarAccess.getDSL_CEP_MINAccess().getWindowDSL_CEP_DURATIONParserRuleCall_4_0());
+
+ pushFollow(FOLLOW_21);
+ lv_window_4_0=ruleDSL_CEP_DURATION();
+
+ state._fsp--;
+
+
+ if (current==null) {
+ current = createModelElementForParent(grammarAccess.getDSL_CEP_MINRule());
+ }
+ set(
+ current,
+ "window",
+ lv_window_4_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_CEP_DURATION");
+ afterParserOrEnumRuleCall();
+
+
+ }
+
+
+ }
+
+ otherlv_5=(Token)match(input,27,FOLLOW_2);
+
+ newLeafNode(otherlv_5, grammarAccess.getDSL_CEP_MINAccess().getRightParenthesisKeyword_5());
+
+
+ }
+
+
+ }
+
+
+ leaveRule();
+
+ }
+
+ catch (RecognitionException re) {
+ recover(input,re);
+ appendSkippedTokens();
+ }
+ finally {
+ }
+ return current;
+ }
+ // $ANTLR end "ruleDSL_CEP_MIN"
+
+
+ // $ANTLR start "entryRuleDSL_CEP_MAX"
+ // InternalSensinact.g:1389:1: entryRuleDSL_CEP_MAX returns [EObject current=null] : iv_ruleDSL_CEP_MAX= ruleDSL_CEP_MAX EOF ;
+ public final EObject entryRuleDSL_CEP_MAX() throws RecognitionException {
+ EObject current = null;
+
+ EObject iv_ruleDSL_CEP_MAX = null;
+
+
+ try {
+ // InternalSensinact.g:1389:52: (iv_ruleDSL_CEP_MAX= ruleDSL_CEP_MAX EOF )
+ // InternalSensinact.g:1390:2: iv_ruleDSL_CEP_MAX= ruleDSL_CEP_MAX EOF
+ {
+ newCompositeNode(grammarAccess.getDSL_CEP_MAXRule());
+ pushFollow(FOLLOW_1);
+ iv_ruleDSL_CEP_MAX=ruleDSL_CEP_MAX();
+
+ state._fsp--;
+
+ current =iv_ruleDSL_CEP_MAX;
+ match(input,EOF,FOLLOW_2);
+
+ }
+
+ }
+
+ catch (RecognitionException re) {
+ recover(input,re);
+ appendSkippedTokens();
+ }
+ finally {
+ }
+ return current;
+ }
+ // $ANTLR end "entryRuleDSL_CEP_MAX"
+
+
+ // $ANTLR start "ruleDSL_CEP_MAX"
+ // InternalSensinact.g:1396:1: ruleDSL_CEP_MAX returns [EObject current=null] : (otherlv_0= 'max' otherlv_1= '(' ( (lv_ref_2_0= ruleDSL_REF_CONDITION ) ) otherlv_3= ',' ( (lv_window_4_0= ruleDSL_CEP_DURATION ) ) otherlv_5= ')' ) ;
+ public final EObject ruleDSL_CEP_MAX() throws RecognitionException {
+ EObject current = null;
+
+ Token otherlv_0=null;
+ Token otherlv_1=null;
+ Token otherlv_3=null;
+ Token otherlv_5=null;
+ EObject lv_ref_2_0 = null;
+
+ EObject lv_window_4_0 = null;
+
+
+
+ enterRule();
+
+ try {
+ // InternalSensinact.g:1402:2: ( (otherlv_0= 'max' otherlv_1= '(' ( (lv_ref_2_0= ruleDSL_REF_CONDITION ) ) otherlv_3= ',' ( (lv_window_4_0= ruleDSL_CEP_DURATION ) ) otherlv_5= ')' ) )
+ // InternalSensinact.g:1403:2: (otherlv_0= 'max' otherlv_1= '(' ( (lv_ref_2_0= ruleDSL_REF_CONDITION ) ) otherlv_3= ',' ( (lv_window_4_0= ruleDSL_CEP_DURATION ) ) otherlv_5= ')' )
+ {
+ // InternalSensinact.g:1403:2: (otherlv_0= 'max' otherlv_1= '(' ( (lv_ref_2_0= ruleDSL_REF_CONDITION ) ) otherlv_3= ',' ( (lv_window_4_0= ruleDSL_CEP_DURATION ) ) otherlv_5= ')' )
+ // InternalSensinact.g:1404:3: otherlv_0= 'max' otherlv_1= '(' ( (lv_ref_2_0= ruleDSL_REF_CONDITION ) ) otherlv_3= ',' ( (lv_window_4_0= ruleDSL_CEP_DURATION ) ) otherlv_5= ')'
+ {
+ otherlv_0=(Token)match(input,33,FOLLOW_20);
+
+ newLeafNode(otherlv_0, grammarAccess.getDSL_CEP_MAXAccess().getMaxKeyword_0());
+
+ otherlv_1=(Token)match(input,26,FOLLOW_6);
+
+ newLeafNode(otherlv_1, grammarAccess.getDSL_CEP_MAXAccess().getLeftParenthesisKeyword_1());
+
+ // InternalSensinact.g:1412:3: ( (lv_ref_2_0= ruleDSL_REF_CONDITION ) )
+ // InternalSensinact.g:1413:4: (lv_ref_2_0= ruleDSL_REF_CONDITION )
+ {
+ // InternalSensinact.g:1413:4: (lv_ref_2_0= ruleDSL_REF_CONDITION )
+ // InternalSensinact.g:1414:5: lv_ref_2_0= ruleDSL_REF_CONDITION
+ {
+
+ newCompositeNode(grammarAccess.getDSL_CEP_MAXAccess().getRefDSL_REF_CONDITIONParserRuleCall_2_0());
+
+ pushFollow(FOLLOW_23);
+ lv_ref_2_0=ruleDSL_REF_CONDITION();
+
+ state._fsp--;
+
+
+ if (current==null) {
+ current = createModelElementForParent(grammarAccess.getDSL_CEP_MAXRule());
+ }
+ set(
+ current,
+ "ref",
+ lv_ref_2_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_REF_CONDITION");
+ afterParserOrEnumRuleCall();
+
+
+ }
+
+
+ }
+
+ otherlv_3=(Token)match(input,18,FOLLOW_17);
+
+ newLeafNode(otherlv_3, grammarAccess.getDSL_CEP_MAXAccess().getCommaKeyword_3());
+
+ // InternalSensinact.g:1435:3: ( (lv_window_4_0= ruleDSL_CEP_DURATION ) )
+ // InternalSensinact.g:1436:4: (lv_window_4_0= ruleDSL_CEP_DURATION )
+ {
+ // InternalSensinact.g:1436:4: (lv_window_4_0= ruleDSL_CEP_DURATION )
+ // InternalSensinact.g:1437:5: lv_window_4_0= ruleDSL_CEP_DURATION
+ {
+
+ newCompositeNode(grammarAccess.getDSL_CEP_MAXAccess().getWindowDSL_CEP_DURATIONParserRuleCall_4_0());
+
+ pushFollow(FOLLOW_21);
+ lv_window_4_0=ruleDSL_CEP_DURATION();
+
+ state._fsp--;
+
+
+ if (current==null) {
+ current = createModelElementForParent(grammarAccess.getDSL_CEP_MAXRule());
+ }
+ set(
+ current,
+ "window",
+ lv_window_4_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_CEP_DURATION");
+ afterParserOrEnumRuleCall();
+
+
+ }
+
+
+ }
+
+ otherlv_5=(Token)match(input,27,FOLLOW_2);
+
+ newLeafNode(otherlv_5, grammarAccess.getDSL_CEP_MAXAccess().getRightParenthesisKeyword_5());
+
+
+ }
+
+
+ }
+
+
+ leaveRule();
+
+ }
+
+ catch (RecognitionException re) {
+ recover(input,re);
+ appendSkippedTokens();
+ }
+ finally {
+ }
+ return current;
+ }
+ // $ANTLR end "ruleDSL_CEP_MAX"
+
+
+ // $ANTLR start "entryRuleDSL_CEP_AVG"
+ // InternalSensinact.g:1462:1: entryRuleDSL_CEP_AVG returns [EObject current=null] : iv_ruleDSL_CEP_AVG= ruleDSL_CEP_AVG EOF ;
+ public final EObject entryRuleDSL_CEP_AVG() throws RecognitionException {
+ EObject current = null;
+
+ EObject iv_ruleDSL_CEP_AVG = null;
+
+
+ try {
+ // InternalSensinact.g:1462:52: (iv_ruleDSL_CEP_AVG= ruleDSL_CEP_AVG EOF )
+ // InternalSensinact.g:1463:2: iv_ruleDSL_CEP_AVG= ruleDSL_CEP_AVG EOF
+ {
+ newCompositeNode(grammarAccess.getDSL_CEP_AVGRule());
+ pushFollow(FOLLOW_1);
+ iv_ruleDSL_CEP_AVG=ruleDSL_CEP_AVG();
+
+ state._fsp--;
+
+ current =iv_ruleDSL_CEP_AVG;
+ match(input,EOF,FOLLOW_2);
+
+ }
+
+ }
+
+ catch (RecognitionException re) {
+ recover(input,re);
+ appendSkippedTokens();
+ }
+ finally {
+ }
+ return current;
+ }
+ // $ANTLR end "entryRuleDSL_CEP_AVG"
+
+
+ // $ANTLR start "ruleDSL_CEP_AVG"
+ // InternalSensinact.g:1469:1: ruleDSL_CEP_AVG returns [EObject current=null] : (otherlv_0= 'avg' otherlv_1= '(' ( (lv_ref_2_0= ruleDSL_REF_CONDITION ) ) otherlv_3= ',' ( (lv_window_4_0= ruleDSL_CEP_DURATION ) ) otherlv_5= ')' ) ;
+ public final EObject ruleDSL_CEP_AVG() throws RecognitionException {
+ EObject current = null;
+
+ Token otherlv_0=null;
+ Token otherlv_1=null;
+ Token otherlv_3=null;
+ Token otherlv_5=null;
+ EObject lv_ref_2_0 = null;
+
+ EObject lv_window_4_0 = null;
+
+
+
+ enterRule();
+
+ try {
+ // InternalSensinact.g:1475:2: ( (otherlv_0= 'avg' otherlv_1= '(' ( (lv_ref_2_0= ruleDSL_REF_CONDITION ) ) otherlv_3= ',' ( (lv_window_4_0= ruleDSL_CEP_DURATION ) ) otherlv_5= ')' ) )
+ // InternalSensinact.g:1476:2: (otherlv_0= 'avg' otherlv_1= '(' ( (lv_ref_2_0= ruleDSL_REF_CONDITION ) ) otherlv_3= ',' ( (lv_window_4_0= ruleDSL_CEP_DURATION ) ) otherlv_5= ')' )
+ {
+ // InternalSensinact.g:1476:2: (otherlv_0= 'avg' otherlv_1= '(' ( (lv_ref_2_0= ruleDSL_REF_CONDITION ) ) otherlv_3= ',' ( (lv_window_4_0= ruleDSL_CEP_DURATION ) ) otherlv_5= ')' )
+ // InternalSensinact.g:1477:3: otherlv_0= 'avg' otherlv_1= '(' ( (lv_ref_2_0= ruleDSL_REF_CONDITION ) ) otherlv_3= ',' ( (lv_window_4_0= ruleDSL_CEP_DURATION ) ) otherlv_5= ')'
+ {
+ otherlv_0=(Token)match(input,34,FOLLOW_20);
+
+ newLeafNode(otherlv_0, grammarAccess.getDSL_CEP_AVGAccess().getAvgKeyword_0());
+
+ otherlv_1=(Token)match(input,26,FOLLOW_6);
+
+ newLeafNode(otherlv_1, grammarAccess.getDSL_CEP_AVGAccess().getLeftParenthesisKeyword_1());
+
+ // InternalSensinact.g:1485:3: ( (lv_ref_2_0= ruleDSL_REF_CONDITION ) )
+ // InternalSensinact.g:1486:4: (lv_ref_2_0= ruleDSL_REF_CONDITION )
+ {
+ // InternalSensinact.g:1486:4: (lv_ref_2_0= ruleDSL_REF_CONDITION )
+ // InternalSensinact.g:1487:5: lv_ref_2_0= ruleDSL_REF_CONDITION
+ {
+
+ newCompositeNode(grammarAccess.getDSL_CEP_AVGAccess().getRefDSL_REF_CONDITIONParserRuleCall_2_0());
+
+ pushFollow(FOLLOW_23);
+ lv_ref_2_0=ruleDSL_REF_CONDITION();
+
+ state._fsp--;
+
+
+ if (current==null) {
+ current = createModelElementForParent(grammarAccess.getDSL_CEP_AVGRule());
+ }
+ set(
+ current,
+ "ref",
+ lv_ref_2_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_REF_CONDITION");
+ afterParserOrEnumRuleCall();
+
+
+ }
+
+
+ }
+
+ otherlv_3=(Token)match(input,18,FOLLOW_17);
+
+ newLeafNode(otherlv_3, grammarAccess.getDSL_CEP_AVGAccess().getCommaKeyword_3());
+
+ // InternalSensinact.g:1508:3: ( (lv_window_4_0= ruleDSL_CEP_DURATION ) )
+ // InternalSensinact.g:1509:4: (lv_window_4_0= ruleDSL_CEP_DURATION )
+ {
+ // InternalSensinact.g:1509:4: (lv_window_4_0= ruleDSL_CEP_DURATION )
+ // InternalSensinact.g:1510:5: lv_window_4_0= ruleDSL_CEP_DURATION
+ {
+
+ newCompositeNode(grammarAccess.getDSL_CEP_AVGAccess().getWindowDSL_CEP_DURATIONParserRuleCall_4_0());
+
+ pushFollow(FOLLOW_21);
+ lv_window_4_0=ruleDSL_CEP_DURATION();
+
+ state._fsp--;
+
+
+ if (current==null) {
+ current = createModelElementForParent(grammarAccess.getDSL_CEP_AVGRule());
+ }
+ set(
+ current,
+ "window",
+ lv_window_4_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_CEP_DURATION");
+ afterParserOrEnumRuleCall();
+
+
+ }
+
+
+ }
+
+ otherlv_5=(Token)match(input,27,FOLLOW_2);
+
+ newLeafNode(otherlv_5, grammarAccess.getDSL_CEP_AVGAccess().getRightParenthesisKeyword_5());
+
+
+ }
+
+
+ }
+
+
+ leaveRule();
+
+ }
+
+ catch (RecognitionException re) {
+ recover(input,re);
+ appendSkippedTokens();
+ }
+ finally {
+ }
+ return current;
+ }
+ // $ANTLR end "ruleDSL_CEP_AVG"
+
+
+ // $ANTLR start "entryRuleDSL_CEP_SUM"
+ // InternalSensinact.g:1535:1: entryRuleDSL_CEP_SUM returns [EObject current=null] : iv_ruleDSL_CEP_SUM= ruleDSL_CEP_SUM EOF ;
+ public final EObject entryRuleDSL_CEP_SUM() throws RecognitionException {
+ EObject current = null;
+
+ EObject iv_ruleDSL_CEP_SUM = null;
+
+
+ try {
+ // InternalSensinact.g:1535:52: (iv_ruleDSL_CEP_SUM= ruleDSL_CEP_SUM EOF )
+ // InternalSensinact.g:1536:2: iv_ruleDSL_CEP_SUM= ruleDSL_CEP_SUM EOF
+ {
+ newCompositeNode(grammarAccess.getDSL_CEP_SUMRule());
+ pushFollow(FOLLOW_1);
+ iv_ruleDSL_CEP_SUM=ruleDSL_CEP_SUM();
+
+ state._fsp--;
+
+ current =iv_ruleDSL_CEP_SUM;
+ match(input,EOF,FOLLOW_2);
+
+ }
+
+ }
+
+ catch (RecognitionException re) {
+ recover(input,re);
+ appendSkippedTokens();
+ }
+ finally {
+ }
+ return current;
+ }
+ // $ANTLR end "entryRuleDSL_CEP_SUM"
+
+
+ // $ANTLR start "ruleDSL_CEP_SUM"
+ // InternalSensinact.g:1542:1: ruleDSL_CEP_SUM returns [EObject current=null] : (otherlv_0= 'sum' otherlv_1= '(' ( (lv_ref_2_0= ruleDSL_REF_CONDITION ) ) otherlv_3= ',' ( (lv_window_4_0= ruleDSL_CEP_DURATION ) ) otherlv_5= ')' ) ;
+ public final EObject ruleDSL_CEP_SUM() throws RecognitionException {
+ EObject current = null;
+
+ Token otherlv_0=null;
+ Token otherlv_1=null;
+ Token otherlv_3=null;
+ Token otherlv_5=null;
+ EObject lv_ref_2_0 = null;
+
+ EObject lv_window_4_0 = null;
+
+
+
+ enterRule();
+
+ try {
+ // InternalSensinact.g:1548:2: ( (otherlv_0= 'sum' otherlv_1= '(' ( (lv_ref_2_0= ruleDSL_REF_CONDITION ) ) otherlv_3= ',' ( (lv_window_4_0= ruleDSL_CEP_DURATION ) ) otherlv_5= ')' ) )
+ // InternalSensinact.g:1549:2: (otherlv_0= 'sum' otherlv_1= '(' ( (lv_ref_2_0= ruleDSL_REF_CONDITION ) ) otherlv_3= ',' ( (lv_window_4_0= ruleDSL_CEP_DURATION ) ) otherlv_5= ')' )
+ {
+ // InternalSensinact.g:1549:2: (otherlv_0= 'sum' otherlv_1= '(' ( (lv_ref_2_0= ruleDSL_REF_CONDITION ) ) otherlv_3= ',' ( (lv_window_4_0= ruleDSL_CEP_DURATION ) ) otherlv_5= ')' )
+ // InternalSensinact.g:1550:3: otherlv_0= 'sum' otherlv_1= '(' ( (lv_ref_2_0= ruleDSL_REF_CONDITION ) ) otherlv_3= ',' ( (lv_window_4_0= ruleDSL_CEP_DURATION ) ) otherlv_5= ')'
+ {
+ otherlv_0=(Token)match(input,35,FOLLOW_20);
+
+ newLeafNode(otherlv_0, grammarAccess.getDSL_CEP_SUMAccess().getSumKeyword_0());
+
+ otherlv_1=(Token)match(input,26,FOLLOW_6);
+
+ newLeafNode(otherlv_1, grammarAccess.getDSL_CEP_SUMAccess().getLeftParenthesisKeyword_1());
+
+ // InternalSensinact.g:1558:3: ( (lv_ref_2_0= ruleDSL_REF_CONDITION ) )
+ // InternalSensinact.g:1559:4: (lv_ref_2_0= ruleDSL_REF_CONDITION )
+ {
+ // InternalSensinact.g:1559:4: (lv_ref_2_0= ruleDSL_REF_CONDITION )
+ // InternalSensinact.g:1560:5: lv_ref_2_0= ruleDSL_REF_CONDITION
+ {
+
+ newCompositeNode(grammarAccess.getDSL_CEP_SUMAccess().getRefDSL_REF_CONDITIONParserRuleCall_2_0());
+
+ pushFollow(FOLLOW_23);
+ lv_ref_2_0=ruleDSL_REF_CONDITION();
+
+ state._fsp--;
+
+
+ if (current==null) {
+ current = createModelElementForParent(grammarAccess.getDSL_CEP_SUMRule());
+ }
+ set(
+ current,
+ "ref",
+ lv_ref_2_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_REF_CONDITION");
+ afterParserOrEnumRuleCall();
+
+
+ }
+
+
+ }
+
+ otherlv_3=(Token)match(input,18,FOLLOW_17);
+
+ newLeafNode(otherlv_3, grammarAccess.getDSL_CEP_SUMAccess().getCommaKeyword_3());
+
+ // InternalSensinact.g:1581:3: ( (lv_window_4_0= ruleDSL_CEP_DURATION ) )
+ // InternalSensinact.g:1582:4: (lv_window_4_0= ruleDSL_CEP_DURATION )
+ {
+ // InternalSensinact.g:1582:4: (lv_window_4_0= ruleDSL_CEP_DURATION )
+ // InternalSensinact.g:1583:5: lv_window_4_0= ruleDSL_CEP_DURATION
+ {
+
+ newCompositeNode(grammarAccess.getDSL_CEP_SUMAccess().getWindowDSL_CEP_DURATIONParserRuleCall_4_0());
+
+ pushFollow(FOLLOW_21);
+ lv_window_4_0=ruleDSL_CEP_DURATION();
+
+ state._fsp--;
+
+
+ if (current==null) {
+ current = createModelElementForParent(grammarAccess.getDSL_CEP_SUMRule());
+ }
+ set(
+ current,
+ "window",
+ lv_window_4_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_CEP_DURATION");
+ afterParserOrEnumRuleCall();
+
+
+ }
+
+
+ }
+
+ otherlv_5=(Token)match(input,27,FOLLOW_2);
+
+ newLeafNode(otherlv_5, grammarAccess.getDSL_CEP_SUMAccess().getRightParenthesisKeyword_5());
+
+
+ }
+
+
+ }
+
+
+ leaveRule();
+
+ }
+
+ catch (RecognitionException re) {
+ recover(input,re);
+ appendSkippedTokens();
+ }
+ finally {
+ }
+ return current;
+ }
+ // $ANTLR end "ruleDSL_CEP_SUM"
+
+
+ // $ANTLR start "entryRuleDSL_CEP_COUNT"
+ // InternalSensinact.g:1608:1: entryRuleDSL_CEP_COUNT returns [EObject current=null] : iv_ruleDSL_CEP_COUNT= ruleDSL_CEP_COUNT EOF ;
+ public final EObject entryRuleDSL_CEP_COUNT() throws RecognitionException {
+ EObject current = null;
+
+ EObject iv_ruleDSL_CEP_COUNT = null;
+
+
+ try {
+ // InternalSensinact.g:1608:54: (iv_ruleDSL_CEP_COUNT= ruleDSL_CEP_COUNT EOF )
+ // InternalSensinact.g:1609:2: iv_ruleDSL_CEP_COUNT= ruleDSL_CEP_COUNT EOF
+ {
+ newCompositeNode(grammarAccess.getDSL_CEP_COUNTRule());
+ pushFollow(FOLLOW_1);
+ iv_ruleDSL_CEP_COUNT=ruleDSL_CEP_COUNT();
+
+ state._fsp--;
+
+ current =iv_ruleDSL_CEP_COUNT;
+ match(input,EOF,FOLLOW_2);
+
+ }
+
+ }
+
+ catch (RecognitionException re) {
+ recover(input,re);
+ appendSkippedTokens();
+ }
+ finally {
+ }
+ return current;
+ }
+ // $ANTLR end "entryRuleDSL_CEP_COUNT"
+
+
+ // $ANTLR start "ruleDSL_CEP_COUNT"
+ // InternalSensinact.g:1615:1: ruleDSL_CEP_COUNT returns [EObject current=null] : (otherlv_0= 'count' otherlv_1= '(' ( (lv_ref_2_0= ruleDSL_REF_CONDITION ) ) otherlv_3= ',' ( (lv_window_4_0= ruleDSL_CEP_DURATION ) ) otherlv_5= ')' ) ;
+ public final EObject ruleDSL_CEP_COUNT() throws RecognitionException {
+ EObject current = null;
+
+ Token otherlv_0=null;
+ Token otherlv_1=null;
+ Token otherlv_3=null;
+ Token otherlv_5=null;
+ EObject lv_ref_2_0 = null;
+
+ EObject lv_window_4_0 = null;
+
+
+
+ enterRule();
+
+ try {
+ // InternalSensinact.g:1621:2: ( (otherlv_0= 'count' otherlv_1= '(' ( (lv_ref_2_0= ruleDSL_REF_CONDITION ) ) otherlv_3= ',' ( (lv_window_4_0= ruleDSL_CEP_DURATION ) ) otherlv_5= ')' ) )
+ // InternalSensinact.g:1622:2: (otherlv_0= 'count' otherlv_1= '(' ( (lv_ref_2_0= ruleDSL_REF_CONDITION ) ) otherlv_3= ',' ( (lv_window_4_0= ruleDSL_CEP_DURATION ) ) otherlv_5= ')' )
+ {
+ // InternalSensinact.g:1622:2: (otherlv_0= 'count' otherlv_1= '(' ( (lv_ref_2_0= ruleDSL_REF_CONDITION ) ) otherlv_3= ',' ( (lv_window_4_0= ruleDSL_CEP_DURATION ) ) otherlv_5= ')' )
+ // InternalSensinact.g:1623:3: otherlv_0= 'count' otherlv_1= '(' ( (lv_ref_2_0= ruleDSL_REF_CONDITION ) ) otherlv_3= ',' ( (lv_window_4_0= ruleDSL_CEP_DURATION ) ) otherlv_5= ')'
+ {
+ otherlv_0=(Token)match(input,36,FOLLOW_20);
+
+ newLeafNode(otherlv_0, grammarAccess.getDSL_CEP_COUNTAccess().getCountKeyword_0());
+
+ otherlv_1=(Token)match(input,26,FOLLOW_6);
+
+ newLeafNode(otherlv_1, grammarAccess.getDSL_CEP_COUNTAccess().getLeftParenthesisKeyword_1());
+
+ // InternalSensinact.g:1631:3: ( (lv_ref_2_0= ruleDSL_REF_CONDITION ) )
+ // InternalSensinact.g:1632:4: (lv_ref_2_0= ruleDSL_REF_CONDITION )
+ {
+ // InternalSensinact.g:1632:4: (lv_ref_2_0= ruleDSL_REF_CONDITION )
+ // InternalSensinact.g:1633:5: lv_ref_2_0= ruleDSL_REF_CONDITION
+ {
+
+ newCompositeNode(grammarAccess.getDSL_CEP_COUNTAccess().getRefDSL_REF_CONDITIONParserRuleCall_2_0());
+
+ pushFollow(FOLLOW_23);
+ lv_ref_2_0=ruleDSL_REF_CONDITION();
+
+ state._fsp--;
+
+
+ if (current==null) {
+ current = createModelElementForParent(grammarAccess.getDSL_CEP_COUNTRule());
+ }
+ set(
+ current,
+ "ref",
+ lv_ref_2_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_REF_CONDITION");
+ afterParserOrEnumRuleCall();
+
+
+ }
+
+
+ }
+
+ otherlv_3=(Token)match(input,18,FOLLOW_17);
+
+ newLeafNode(otherlv_3, grammarAccess.getDSL_CEP_COUNTAccess().getCommaKeyword_3());
+
+ // InternalSensinact.g:1654:3: ( (lv_window_4_0= ruleDSL_CEP_DURATION ) )
+ // InternalSensinact.g:1655:4: (lv_window_4_0= ruleDSL_CEP_DURATION )
+ {
+ // InternalSensinact.g:1655:4: (lv_window_4_0= ruleDSL_CEP_DURATION )
+ // InternalSensinact.g:1656:5: lv_window_4_0= ruleDSL_CEP_DURATION
+ {
+
+ newCompositeNode(grammarAccess.getDSL_CEP_COUNTAccess().getWindowDSL_CEP_DURATIONParserRuleCall_4_0());
+
+ pushFollow(FOLLOW_21);
+ lv_window_4_0=ruleDSL_CEP_DURATION();
+
+ state._fsp--;
+
+
+ if (current==null) {
+ current = createModelElementForParent(grammarAccess.getDSL_CEP_COUNTRule());
+ }
+ set(
+ current,
+ "window",
+ lv_window_4_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_CEP_DURATION");
+ afterParserOrEnumRuleCall();
+
+
+ }
+
+
+ }
+
+ otherlv_5=(Token)match(input,27,FOLLOW_2);
+
+ newLeafNode(otherlv_5, grammarAccess.getDSL_CEP_COUNTAccess().getRightParenthesisKeyword_5());
+
+
+ }
+
+
+ }
+
+
+ leaveRule();
+
+ }
+
+ catch (RecognitionException re) {
+ recover(input,re);
+ appendSkippedTokens();
+ }
+ finally {
+ }
+ return current;
+ }
+ // $ANTLR end "ruleDSL_CEP_COUNT"
+
+
+ // $ANTLR start "entryRuleDSL_CEP_DURATION"
+ // InternalSensinact.g:1681:1: entryRuleDSL_CEP_DURATION returns [EObject current=null] : iv_ruleDSL_CEP_DURATION= ruleDSL_CEP_DURATION EOF ;
+ public final EObject entryRuleDSL_CEP_DURATION() throws RecognitionException {
+ EObject current = null;
+
+ EObject iv_ruleDSL_CEP_DURATION = null;
+
+
+ try {
+ // InternalSensinact.g:1681:57: (iv_ruleDSL_CEP_DURATION= ruleDSL_CEP_DURATION EOF )
+ // InternalSensinact.g:1682:2: iv_ruleDSL_CEP_DURATION= ruleDSL_CEP_DURATION EOF
+ {
+ newCompositeNode(grammarAccess.getDSL_CEP_DURATIONRule());
+ pushFollow(FOLLOW_1);
+ iv_ruleDSL_CEP_DURATION=ruleDSL_CEP_DURATION();
+
+ state._fsp--;
+
+ current =iv_ruleDSL_CEP_DURATION;
+ match(input,EOF,FOLLOW_2);
+
+ }
+
+ }
+
+ catch (RecognitionException re) {
+ recover(input,re);
+ appendSkippedTokens();
+ }
+ finally {
+ }
+ return current;
+ }
+ // $ANTLR end "entryRuleDSL_CEP_DURATION"
+
+
+ // $ANTLR start "ruleDSL_CEP_DURATION"
+ // InternalSensinact.g:1688:1: ruleDSL_CEP_DURATION returns [EObject current=null] : ( ( (lv_units_0_1= ruleDSL_CEP_DURATION_MIN | lv_units_0_2= ruleDSL_CEP_DURATION_SEC ) ) )+ ;
+ public final EObject ruleDSL_CEP_DURATION() throws RecognitionException {
+ EObject current = null;
+
+ EObject lv_units_0_1 = null;
+
+ EObject lv_units_0_2 = null;
+
+
+
+ enterRule();
+
+ try {
+ // InternalSensinact.g:1694:2: ( ( ( (lv_units_0_1= ruleDSL_CEP_DURATION_MIN | lv_units_0_2= ruleDSL_CEP_DURATION_SEC ) ) )+ )
+ // InternalSensinact.g:1695:2: ( ( (lv_units_0_1= ruleDSL_CEP_DURATION_MIN | lv_units_0_2= ruleDSL_CEP_DURATION_SEC ) ) )+
+ {
+ // InternalSensinact.g:1695:2: ( ( (lv_units_0_1= ruleDSL_CEP_DURATION_MIN | lv_units_0_2= ruleDSL_CEP_DURATION_SEC ) ) )+
+ int cnt12=0;
+ loop12:
+ do {
+ int alt12=2;
+ int LA12_0 = input.LA(1);
+
+ if ( (LA12_0==RULE_INT) ) {
+ alt12=1;
+ }
+
+
+ switch (alt12) {
+ case 1 :
+ // InternalSensinact.g:1696:3: ( (lv_units_0_1= ruleDSL_CEP_DURATION_MIN | lv_units_0_2= ruleDSL_CEP_DURATION_SEC ) )
+ {
+ // InternalSensinact.g:1696:3: ( (lv_units_0_1= ruleDSL_CEP_DURATION_MIN | lv_units_0_2= ruleDSL_CEP_DURATION_SEC ) )
+ // InternalSensinact.g:1697:4: (lv_units_0_1= ruleDSL_CEP_DURATION_MIN | lv_units_0_2= ruleDSL_CEP_DURATION_SEC )
+ {
+ // InternalSensinact.g:1697:4: (lv_units_0_1= ruleDSL_CEP_DURATION_MIN | lv_units_0_2= ruleDSL_CEP_DURATION_SEC )
+ int alt11=2;
+ int LA11_0 = input.LA(1);
+
+ if ( (LA11_0==RULE_INT) ) {
+ switch ( input.LA(2) ) {
+ case 24:
+ {
+ int LA11_2 = input.LA(3);
+
+ if ( (LA11_2==RULE_INT) ) {
+ int LA11_5 = input.LA(4);
+
+ if ( (LA11_5==32) ) {
+ alt11=1;
+ }
+ else if ( (LA11_5==37) ) {
+ alt11=2;
+ }
+ else {
+ NoViableAltException nvae =
+ new NoViableAltException("", 11, 5, input);
+
+ throw nvae;
+ }
+ }
+ else {
+ NoViableAltException nvae =
+ new NoViableAltException("", 11, 2, input);
+
+ throw nvae;
+ }
+ }
+ break;
+ case 32:
+ {
+ alt11=1;
+ }
+ break;
+ case 37:
+ {
+ alt11=2;
+ }
+ break;
+ default:
+ NoViableAltException nvae =
+ new NoViableAltException("", 11, 1, input);
+
+ throw nvae;
+ }
+
+ }
+ else {
+ NoViableAltException nvae =
+ new NoViableAltException("", 11, 0, input);
+
+ throw nvae;
+ }
+ switch (alt11) {
+ case 1 :
+ // InternalSensinact.g:1698:5: lv_units_0_1= ruleDSL_CEP_DURATION_MIN
+ {
+
+ newCompositeNode(grammarAccess.getDSL_CEP_DURATIONAccess().getUnitsDSL_CEP_DURATION_MINParserRuleCall_0_0());
+
+ pushFollow(FOLLOW_24);
+ lv_units_0_1=ruleDSL_CEP_DURATION_MIN();
+
+ state._fsp--;
+
+
+ if (current==null) {
+ current = createModelElementForParent(grammarAccess.getDSL_CEP_DURATIONRule());
+ }
+ add(
+ current,
+ "units",
+ lv_units_0_1,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_CEP_DURATION_MIN");
+ afterParserOrEnumRuleCall();
+
+
+ }
+ break;
+ case 2 :
+ // InternalSensinact.g:1714:5: lv_units_0_2= ruleDSL_CEP_DURATION_SEC
+ {
+
+ newCompositeNode(grammarAccess.getDSL_CEP_DURATIONAccess().getUnitsDSL_CEP_DURATION_SECParserRuleCall_0_1());
+
+ pushFollow(FOLLOW_24);
+ lv_units_0_2=ruleDSL_CEP_DURATION_SEC();
+
+ state._fsp--;
+
+
+ if (current==null) {
+ current = createModelElementForParent(grammarAccess.getDSL_CEP_DURATIONRule());
+ }
+ add(
+ current,
+ "units",
+ lv_units_0_2,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_CEP_DURATION_SEC");
+ afterParserOrEnumRuleCall();
+
+
+ }
+ break;
+
+ }
+
+
+ }
+
+
+ }
+ break;
+
+ default :
+ if ( cnt12 >= 1 ) break loop12;
+ EarlyExitException eee =
+ new EarlyExitException(12, input);
+ throw eee;
+ }
+ cnt12++;
+ } while (true);
+
+
+ }
+
+
+ leaveRule();
+
+ }
+
+ catch (RecognitionException re) {
+ recover(input,re);
+ appendSkippedTokens();
+ }
+ finally {
+ }
+ return current;
+ }
+ // $ANTLR end "ruleDSL_CEP_DURATION"
+
+
+ // $ANTLR start "entryRuleDSL_CEP_DURATION_MIN"
+ // InternalSensinact.g:1735:1: entryRuleDSL_CEP_DURATION_MIN returns [EObject current=null] : iv_ruleDSL_CEP_DURATION_MIN= ruleDSL_CEP_DURATION_MIN EOF ;
+ public final EObject entryRuleDSL_CEP_DURATION_MIN() throws RecognitionException {
+ EObject current = null;
+
+ EObject iv_ruleDSL_CEP_DURATION_MIN = null;
+
+
+ try {
+ // InternalSensinact.g:1735:61: (iv_ruleDSL_CEP_DURATION_MIN= ruleDSL_CEP_DURATION_MIN EOF )
+ // InternalSensinact.g:1736:2: iv_ruleDSL_CEP_DURATION_MIN= ruleDSL_CEP_DURATION_MIN EOF
+ {
+ newCompositeNode(grammarAccess.getDSL_CEP_DURATION_MINRule());
+ pushFollow(FOLLOW_1);
+ iv_ruleDSL_CEP_DURATION_MIN=ruleDSL_CEP_DURATION_MIN();
+
+ state._fsp--;
+
+ current =iv_ruleDSL_CEP_DURATION_MIN;
+ match(input,EOF,FOLLOW_2);
+
+ }
+
+ }
+
+ catch (RecognitionException re) {
+ recover(input,re);
+ appendSkippedTokens();
+ }
+ finally {
+ }
+ return current;
+ }
+ // $ANTLR end "entryRuleDSL_CEP_DURATION_MIN"
+
+
+ // $ANTLR start "ruleDSL_CEP_DURATION_MIN"
+ // InternalSensinact.g:1742:1: ruleDSL_CEP_DURATION_MIN returns [EObject current=null] : ( ( (lv_min_0_0= ruleNUMBER ) ) otherlv_1= 'min' ) ;
+ public final EObject ruleDSL_CEP_DURATION_MIN() throws RecognitionException {
+ EObject current = null;
+
+ Token otherlv_1=null;
+ AntlrDatatypeRuleToken lv_min_0_0 = null;
+
+
+
+ enterRule();
+
+ try {
+ // InternalSensinact.g:1748:2: ( ( ( (lv_min_0_0= ruleNUMBER ) ) otherlv_1= 'min' ) )
+ // InternalSensinact.g:1749:2: ( ( (lv_min_0_0= ruleNUMBER ) ) otherlv_1= 'min' )
+ {
+ // InternalSensinact.g:1749:2: ( ( (lv_min_0_0= ruleNUMBER ) ) otherlv_1= 'min' )
+ // InternalSensinact.g:1750:3: ( (lv_min_0_0= ruleNUMBER ) ) otherlv_1= 'min'
+ {
+ // InternalSensinact.g:1750:3: ( (lv_min_0_0= ruleNUMBER ) )
+ // InternalSensinact.g:1751:4: (lv_min_0_0= ruleNUMBER )
+ {
+ // InternalSensinact.g:1751:4: (lv_min_0_0= ruleNUMBER )
+ // InternalSensinact.g:1752:5: lv_min_0_0= ruleNUMBER
+ {
+
+ newCompositeNode(grammarAccess.getDSL_CEP_DURATION_MINAccess().getMinNUMBERParserRuleCall_0_0());
+
+ pushFollow(FOLLOW_25);
+ lv_min_0_0=ruleNUMBER();
+
+ state._fsp--;
+
+
+ if (current==null) {
+ current = createModelElementForParent(grammarAccess.getDSL_CEP_DURATION_MINRule());
+ }
+ set(
+ current,
+ "min",
+ lv_min_0_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.NUMBER");
+ afterParserOrEnumRuleCall();
+
+
+ }
+
+
+ }
+
+ otherlv_1=(Token)match(input,32,FOLLOW_2);
+
+ newLeafNode(otherlv_1, grammarAccess.getDSL_CEP_DURATION_MINAccess().getMinKeyword_1());
+
+
+ }
+
+
+ }
+
+
+ leaveRule();
+
+ }
+
+ catch (RecognitionException re) {
+ recover(input,re);
+ appendSkippedTokens();
+ }
+ finally {
+ }
+ return current;
+ }
+ // $ANTLR end "ruleDSL_CEP_DURATION_MIN"
+
+
+ // $ANTLR start "entryRuleDSL_CEP_DURATION_SEC"
+ // InternalSensinact.g:1777:1: entryRuleDSL_CEP_DURATION_SEC returns [EObject current=null] : iv_ruleDSL_CEP_DURATION_SEC= ruleDSL_CEP_DURATION_SEC EOF ;
+ public final EObject entryRuleDSL_CEP_DURATION_SEC() throws RecognitionException {
+ EObject current = null;
+
+ EObject iv_ruleDSL_CEP_DURATION_SEC = null;
+
+
+ try {
+ // InternalSensinact.g:1777:61: (iv_ruleDSL_CEP_DURATION_SEC= ruleDSL_CEP_DURATION_SEC EOF )
+ // InternalSensinact.g:1778:2: iv_ruleDSL_CEP_DURATION_SEC= ruleDSL_CEP_DURATION_SEC EOF
+ {
+ newCompositeNode(grammarAccess.getDSL_CEP_DURATION_SECRule());
+ pushFollow(FOLLOW_1);
+ iv_ruleDSL_CEP_DURATION_SEC=ruleDSL_CEP_DURATION_SEC();
+
+ state._fsp--;
+
+ current =iv_ruleDSL_CEP_DURATION_SEC;
+ match(input,EOF,FOLLOW_2);
+
+ }
+
+ }
+
+ catch (RecognitionException re) {
+ recover(input,re);
+ appendSkippedTokens();
+ }
+ finally {
+ }
+ return current;
+ }
+ // $ANTLR end "entryRuleDSL_CEP_DURATION_SEC"
+
+
+ // $ANTLR start "ruleDSL_CEP_DURATION_SEC"
+ // InternalSensinact.g:1784:1: ruleDSL_CEP_DURATION_SEC returns [EObject current=null] : ( ( (lv_sec_0_0= ruleNUMBER ) ) otherlv_1= 'sec' ) ;
+ public final EObject ruleDSL_CEP_DURATION_SEC() throws RecognitionException {
+ EObject current = null;
+
+ Token otherlv_1=null;
+ AntlrDatatypeRuleToken lv_sec_0_0 = null;
+
+
+
+ enterRule();
+
+ try {
+ // InternalSensinact.g:1790:2: ( ( ( (lv_sec_0_0= ruleNUMBER ) ) otherlv_1= 'sec' ) )
+ // InternalSensinact.g:1791:2: ( ( (lv_sec_0_0= ruleNUMBER ) ) otherlv_1= 'sec' )
+ {
+ // InternalSensinact.g:1791:2: ( ( (lv_sec_0_0= ruleNUMBER ) ) otherlv_1= 'sec' )
+ // InternalSensinact.g:1792:3: ( (lv_sec_0_0= ruleNUMBER ) ) otherlv_1= 'sec'
+ {
+ // InternalSensinact.g:1792:3: ( (lv_sec_0_0= ruleNUMBER ) )
+ // InternalSensinact.g:1793:4: (lv_sec_0_0= ruleNUMBER )
+ {
+ // InternalSensinact.g:1793:4: (lv_sec_0_0= ruleNUMBER )
+ // InternalSensinact.g:1794:5: lv_sec_0_0= ruleNUMBER
+ {
+
+ newCompositeNode(grammarAccess.getDSL_CEP_DURATION_SECAccess().getSecNUMBERParserRuleCall_0_0());
+
+ pushFollow(FOLLOW_26);
+ lv_sec_0_0=ruleNUMBER();
+
+ state._fsp--;
+
+
+ if (current==null) {
+ current = createModelElementForParent(grammarAccess.getDSL_CEP_DURATION_SECRule());
+ }
+ set(
+ current,
+ "sec",
+ lv_sec_0_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.NUMBER");
+ afterParserOrEnumRuleCall();
+
+
+ }
+
+
+ }
+
+ otherlv_1=(Token)match(input,37,FOLLOW_2);
+
+ newLeafNode(otherlv_1, grammarAccess.getDSL_CEP_DURATION_SECAccess().getSecKeyword_1());
+
+
+ }
+
+
+ }
+
+
+ leaveRule();
+
+ }
+
+ catch (RecognitionException re) {
+ recover(input,re);
+ appendSkippedTokens();
+ }
+ finally {
+ }
+ return current;
+ }
+ // $ANTLR end "ruleDSL_CEP_DURATION_SEC"
+
+
+ // $ANTLR start "entryRuleDSL_ListActions"
+ // InternalSensinact.g:1819:1: entryRuleDSL_ListActions returns [EObject current=null] : iv_ruleDSL_ListActions= ruleDSL_ListActions EOF ;
+ public final EObject entryRuleDSL_ListActions() throws RecognitionException {
+ EObject current = null;
+
+ EObject iv_ruleDSL_ListActions = null;
+
+
+ try {
+ // InternalSensinact.g:1819:56: (iv_ruleDSL_ListActions= ruleDSL_ListActions EOF )
+ // InternalSensinact.g:1820:2: iv_ruleDSL_ListActions= ruleDSL_ListActions EOF
+ {
+ newCompositeNode(grammarAccess.getDSL_ListActionsRule());
+ pushFollow(FOLLOW_1);
+ iv_ruleDSL_ListActions=ruleDSL_ListActions();
+
+ state._fsp--;
+
+ current =iv_ruleDSL_ListActions;
+ match(input,EOF,FOLLOW_2);
+
+ }
+
+ }
+
+ catch (RecognitionException re) {
+ recover(input,re);
+ appendSkippedTokens();
+ }
+ finally {
+ }
+ return current;
+ }
+ // $ANTLR end "entryRuleDSL_ListActions"
+
+
+ // $ANTLR start "ruleDSL_ListActions"
+ // InternalSensinact.g:1826:1: ruleDSL_ListActions returns [EObject current=null] : ( ( (lv_actionList_0_0= ruleDSL_ResourceAction ) ) (otherlv_1= ',' ( (lv_actionList_2_0= ruleDSL_ResourceAction ) ) )* ) ;
+ public final EObject ruleDSL_ListActions() throws RecognitionException {
+ EObject current = null;
+
+ Token otherlv_1=null;
+ EObject lv_actionList_0_0 = null;
+
+ EObject lv_actionList_2_0 = null;
+
+
+
+ enterRule();
+
+ try {
+ // InternalSensinact.g:1832:2: ( ( ( (lv_actionList_0_0= ruleDSL_ResourceAction ) ) (otherlv_1= ',' ( (lv_actionList_2_0= ruleDSL_ResourceAction ) ) )* ) )
+ // InternalSensinact.g:1833:2: ( ( (lv_actionList_0_0= ruleDSL_ResourceAction ) ) (otherlv_1= ',' ( (lv_actionList_2_0= ruleDSL_ResourceAction ) ) )* )
+ {
+ // InternalSensinact.g:1833:2: ( ( (lv_actionList_0_0= ruleDSL_ResourceAction ) ) (otherlv_1= ',' ( (lv_actionList_2_0= ruleDSL_ResourceAction ) ) )* )
+ // InternalSensinact.g:1834:3: ( (lv_actionList_0_0= ruleDSL_ResourceAction ) ) (otherlv_1= ',' ( (lv_actionList_2_0= ruleDSL_ResourceAction ) ) )*
+ {
+ // InternalSensinact.g:1834:3: ( (lv_actionList_0_0= ruleDSL_ResourceAction ) )
+ // InternalSensinact.g:1835:4: (lv_actionList_0_0= ruleDSL_ResourceAction )
+ {
+ // InternalSensinact.g:1835:4: (lv_actionList_0_0= ruleDSL_ResourceAction )
+ // InternalSensinact.g:1836:5: lv_actionList_0_0= ruleDSL_ResourceAction
+ {
+
+ newCompositeNode(grammarAccess.getDSL_ListActionsAccess().getActionListDSL_ResourceActionParserRuleCall_0_0());
+
+ pushFollow(FOLLOW_11);
+ lv_actionList_0_0=ruleDSL_ResourceAction();
+
+ state._fsp--;
+
+
+ if (current==null) {
+ current = createModelElementForParent(grammarAccess.getDSL_ListActionsRule());
+ }
+ add(
+ current,
+ "actionList",
+ lv_actionList_0_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_ResourceAction");
+ afterParserOrEnumRuleCall();
+
+
+ }
+
+
+ }
+
+ // InternalSensinact.g:1853:3: (otherlv_1= ',' ( (lv_actionList_2_0= ruleDSL_ResourceAction ) ) )*
+ loop13:
+ do {
+ int alt13=2;
+ int LA13_0 = input.LA(1);
+
+ if ( (LA13_0==18) ) {
+ alt13=1;
+ }
+
+
+ switch (alt13) {
+ case 1 :
+ // InternalSensinact.g:1854:4: otherlv_1= ',' ( (lv_actionList_2_0= ruleDSL_ResourceAction ) )
+ {
+ otherlv_1=(Token)match(input,18,FOLLOW_6);
+
+ newLeafNode(otherlv_1, grammarAccess.getDSL_ListActionsAccess().getCommaKeyword_1_0());
+
+ // InternalSensinact.g:1858:4: ( (lv_actionList_2_0= ruleDSL_ResourceAction ) )
+ // InternalSensinact.g:1859:5: (lv_actionList_2_0= ruleDSL_ResourceAction )
+ {
+ // InternalSensinact.g:1859:5: (lv_actionList_2_0= ruleDSL_ResourceAction )
+ // InternalSensinact.g:1860:6: lv_actionList_2_0= ruleDSL_ResourceAction
+ {
+
+ newCompositeNode(grammarAccess.getDSL_ListActionsAccess().getActionListDSL_ResourceActionParserRuleCall_1_1_0());
+
+ pushFollow(FOLLOW_11);
+ lv_actionList_2_0=ruleDSL_ResourceAction();
+
+ state._fsp--;
+
+
+ if (current==null) {
+ current = createModelElementForParent(grammarAccess.getDSL_ListActionsRule());
+ }
+ add(
+ current,
+ "actionList",
+ lv_actionList_2_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_ResourceAction");
+ afterParserOrEnumRuleCall();
+
+
+ }
+
+
+ }
+
+
+ }
+ break;
+
+ default :
+ break loop13;
+ }
+ } while (true);
+
+
+ }
+
+
+ }
+
+
+ leaveRule();
+
+ }
+
+ catch (RecognitionException re) {
+ recover(input,re);
+ appendSkippedTokens();
+ }
+ finally {
+ }
+ return current;
+ }
+ // $ANTLR end "ruleDSL_ListActions"
+
+
+ // $ANTLR start "entryRuleDSL_ResourceAction"
+ // InternalSensinact.g:1882:1: entryRuleDSL_ResourceAction returns [EObject current=null] : iv_ruleDSL_ResourceAction= ruleDSL_ResourceAction EOF ;
+ public final EObject entryRuleDSL_ResourceAction() throws RecognitionException {
+ EObject current = null;
+
+ EObject iv_ruleDSL_ResourceAction = null;
+
+
+ try {
+ // InternalSensinact.g:1882:59: (iv_ruleDSL_ResourceAction= ruleDSL_ResourceAction EOF )
+ // InternalSensinact.g:1883:2: iv_ruleDSL_ResourceAction= ruleDSL_ResourceAction EOF
+ {
+ newCompositeNode(grammarAccess.getDSL_ResourceActionRule());
+ pushFollow(FOLLOW_1);
+ iv_ruleDSL_ResourceAction=ruleDSL_ResourceAction();
+
+ state._fsp--;
+
+ current =iv_ruleDSL_ResourceAction;
+ match(input,EOF,FOLLOW_2);
+
+ }
+
+ }
+
+ catch (RecognitionException re) {
+ recover(input,re);
+ appendSkippedTokens();
+ }
+ finally {
+ }
+ return current;
+ }
+ // $ANTLR end "entryRuleDSL_ResourceAction"
+
+
+ // $ANTLR start "ruleDSL_ResourceAction"
+ // InternalSensinact.g:1889:1: ruleDSL_ResourceAction returns [EObject current=null] : ( ( ( (lv_variable_0_0= RULE_ID ) ) otherlv_1= '=' )? ( (otherlv_2= RULE_ID ) ) otherlv_3= '.' ( ( (lv_actiontype_4_1= 'act' | lv_actiontype_4_2= 'set' ) ) ) otherlv_5= '(' ( (lv_listParam_6_0= ruleDSL_ListParam ) )? otherlv_7= ')' ) ;
+ public final EObject ruleDSL_ResourceAction() throws RecognitionException {
+ EObject current = null;
+
+ Token lv_variable_0_0=null;
+ Token otherlv_1=null;
+ Token otherlv_2=null;
+ Token otherlv_3=null;
+ Token lv_actiontype_4_1=null;
+ Token lv_actiontype_4_2=null;
+ Token otherlv_5=null;
+ Token otherlv_7=null;
+ EObject lv_listParam_6_0 = null;
+
+
+
+ enterRule();
+
+ try {
+ // InternalSensinact.g:1895:2: ( ( ( ( (lv_variable_0_0= RULE_ID ) ) otherlv_1= '=' )? ( (otherlv_2= RULE_ID ) ) otherlv_3= '.' ( ( (lv_actiontype_4_1= 'act' | lv_actiontype_4_2= 'set' ) ) ) otherlv_5= '(' ( (lv_listParam_6_0= ruleDSL_ListParam ) )? otherlv_7= ')' ) )
+ // InternalSensinact.g:1896:2: ( ( ( (lv_variable_0_0= RULE_ID ) ) otherlv_1= '=' )? ( (otherlv_2= RULE_ID ) ) otherlv_3= '.' ( ( (lv_actiontype_4_1= 'act' | lv_actiontype_4_2= 'set' ) ) ) otherlv_5= '(' ( (lv_listParam_6_0= ruleDSL_ListParam ) )? otherlv_7= ')' )
+ {
+ // InternalSensinact.g:1896:2: ( ( ( (lv_variable_0_0= RULE_ID ) ) otherlv_1= '=' )? ( (otherlv_2= RULE_ID ) ) otherlv_3= '.' ( ( (lv_actiontype_4_1= 'act' | lv_actiontype_4_2= 'set' ) ) ) otherlv_5= '(' ( (lv_listParam_6_0= ruleDSL_ListParam ) )? otherlv_7= ')' )
+ // InternalSensinact.g:1897:3: ( ( (lv_variable_0_0= RULE_ID ) ) otherlv_1= '=' )? ( (otherlv_2= RULE_ID ) ) otherlv_3= '.' ( ( (lv_actiontype_4_1= 'act' | lv_actiontype_4_2= 'set' ) ) ) otherlv_5= '(' ( (lv_listParam_6_0= ruleDSL_ListParam ) )? otherlv_7= ')'
+ {
+ // InternalSensinact.g:1897:3: ( ( (lv_variable_0_0= RULE_ID ) ) otherlv_1= '=' )?
+ int alt14=2;
+ int LA14_0 = input.LA(1);
+
+ if ( (LA14_0==RULE_ID) ) {
+ int LA14_1 = input.LA(2);
+
+ if ( (LA14_1==13) ) {
+ alt14=1;
+ }
+ }
+ switch (alt14) {
+ case 1 :
+ // InternalSensinact.g:1898:4: ( (lv_variable_0_0= RULE_ID ) ) otherlv_1= '='
+ {
+ // InternalSensinact.g:1898:4: ( (lv_variable_0_0= RULE_ID ) )
+ // InternalSensinact.g:1899:5: (lv_variable_0_0= RULE_ID )
+ {
+ // InternalSensinact.g:1899:5: (lv_variable_0_0= RULE_ID )
+ // InternalSensinact.g:1900:6: lv_variable_0_0= RULE_ID
+ {
+ lv_variable_0_0=(Token)match(input,RULE_ID,FOLLOW_7);
+
+ newLeafNode(lv_variable_0_0, grammarAccess.getDSL_ResourceActionAccess().getVariableIDTerminalRuleCall_0_0_0());
+
+
+ if (current==null) {
+ current = createModelElement(grammarAccess.getDSL_ResourceActionRule());
+ }
+ setWithLastConsumed(
+ current,
+ "variable",
+ lv_variable_0_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.ID");
+
+
+ }
+
+
+ }
+
+ otherlv_1=(Token)match(input,13,FOLLOW_6);
+
+ newLeafNode(otherlv_1, grammarAccess.getDSL_ResourceActionAccess().getEqualsSignKeyword_0_1());
+
+
+ }
+ break;
+
+ }
+
+ // InternalSensinact.g:1921:3: ( (otherlv_2= RULE_ID ) )
+ // InternalSensinact.g:1922:4: (otherlv_2= RULE_ID )
+ {
+ // InternalSensinact.g:1922:4: (otherlv_2= RULE_ID )
+ // InternalSensinact.g:1923:5: otherlv_2= RULE_ID
+ {
+
+ if (current==null) {
+ current = createModelElement(grammarAccess.getDSL_ResourceActionRule());
+ }
+
+ otherlv_2=(Token)match(input,RULE_ID,FOLLOW_16);
+
+ newLeafNode(otherlv_2, grammarAccess.getDSL_ResourceActionAccess().getRefDSL_REFCrossReference_1_0());
+
+
+ }
+
+
+ }
+
+ otherlv_3=(Token)match(input,24,FOLLOW_27);
+
+ newLeafNode(otherlv_3, grammarAccess.getDSL_ResourceActionAccess().getFullStopKeyword_2());
+
+ // InternalSensinact.g:1938:3: ( ( (lv_actiontype_4_1= 'act' | lv_actiontype_4_2= 'set' ) ) )
+ // InternalSensinact.g:1939:4: ( (lv_actiontype_4_1= 'act' | lv_actiontype_4_2= 'set' ) )
+ {
+ // InternalSensinact.g:1939:4: ( (lv_actiontype_4_1= 'act' | lv_actiontype_4_2= 'set' ) )
+ // InternalSensinact.g:1940:5: (lv_actiontype_4_1= 'act' | lv_actiontype_4_2= 'set' )
+ {
+ // InternalSensinact.g:1940:5: (lv_actiontype_4_1= 'act' | lv_actiontype_4_2= 'set' )
+ int alt15=2;
+ int LA15_0 = input.LA(1);
+
+ if ( (LA15_0==38) ) {
+ alt15=1;
+ }
+ else if ( (LA15_0==39) ) {
+ alt15=2;
+ }
+ else {
+ NoViableAltException nvae =
+ new NoViableAltException("", 15, 0, input);
+
+ throw nvae;
+ }
+ switch (alt15) {
+ case 1 :
+ // InternalSensinact.g:1941:6: lv_actiontype_4_1= 'act'
+ {
+ lv_actiontype_4_1=(Token)match(input,38,FOLLOW_20);
+
+ newLeafNode(lv_actiontype_4_1, grammarAccess.getDSL_ResourceActionAccess().getActiontypeActKeyword_3_0_0());
+
+
+ if (current==null) {
+ current = createModelElement(grammarAccess.getDSL_ResourceActionRule());
+ }
+ setWithLastConsumed(current, "actiontype", lv_actiontype_4_1, null);
+
+
+ }
+ break;
+ case 2 :
+ // InternalSensinact.g:1952:6: lv_actiontype_4_2= 'set'
+ {
+ lv_actiontype_4_2=(Token)match(input,39,FOLLOW_20);
+
+ newLeafNode(lv_actiontype_4_2, grammarAccess.getDSL_ResourceActionAccess().getActiontypeSetKeyword_3_0_1());
+
+
+ if (current==null) {
+ current = createModelElement(grammarAccess.getDSL_ResourceActionRule());
+ }
+ setWithLastConsumed(current, "actiontype", lv_actiontype_4_2, null);
+
+
+ }
+ break;
+
+ }
+
+
+ }
+
+
+ }
+
+ otherlv_5=(Token)match(input,26,FOLLOW_28);
+
+ newLeafNode(otherlv_5, grammarAccess.getDSL_ResourceActionAccess().getLeftParenthesisKeyword_4());
+
+ // InternalSensinact.g:1969:3: ( (lv_listParam_6_0= ruleDSL_ListParam ) )?
+ int alt16=2;
+ int LA16_0 = input.LA(1);
+
+ if ( ((LA16_0>=RULE_ID && LA16_0<=RULE_BOOLEAN)||LA16_0==26||LA16_0==53) ) {
+ alt16=1;
+ }
+ switch (alt16) {
+ case 1 :
+ // InternalSensinact.g:1970:4: (lv_listParam_6_0= ruleDSL_ListParam )
+ {
+ // InternalSensinact.g:1970:4: (lv_listParam_6_0= ruleDSL_ListParam )
+ // InternalSensinact.g:1971:5: lv_listParam_6_0= ruleDSL_ListParam
+ {
+
+ newCompositeNode(grammarAccess.getDSL_ResourceActionAccess().getListParamDSL_ListParamParserRuleCall_5_0());
+
+ pushFollow(FOLLOW_21);
+ lv_listParam_6_0=ruleDSL_ListParam();
+
+ state._fsp--;
+
+
+ if (current==null) {
+ current = createModelElementForParent(grammarAccess.getDSL_ResourceActionRule());
+ }
+ set(
+ current,
+ "listParam",
+ lv_listParam_6_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_ListParam");
+ afterParserOrEnumRuleCall();
+
+
+ }
+
+
+ }
+ break;
+
+ }
+
+ otherlv_7=(Token)match(input,27,FOLLOW_2);
+
+ newLeafNode(otherlv_7, grammarAccess.getDSL_ResourceActionAccess().getRightParenthesisKeyword_6());
+
+
+ }
+
+
+ }
+
+
+ leaveRule();
+
+ }
+
+ catch (RecognitionException re) {
+ recover(input,re);
+ appendSkippedTokens();
+ }
+ finally {
+ }
+ return current;
+ }
+ // $ANTLR end "ruleDSL_ResourceAction"
+
+
+ // $ANTLR start "entryRuleDSL_ListParam"
+ // InternalSensinact.g:1996:1: entryRuleDSL_ListParam returns [EObject current=null] : iv_ruleDSL_ListParam= ruleDSL_ListParam EOF ;
+ public final EObject entryRuleDSL_ListParam() throws RecognitionException {
+ EObject current = null;
+
+ EObject iv_ruleDSL_ListParam = null;
+
+
+ try {
+ // InternalSensinact.g:1996:54: (iv_ruleDSL_ListParam= ruleDSL_ListParam EOF )
+ // InternalSensinact.g:1997:2: iv_ruleDSL_ListParam= ruleDSL_ListParam EOF
+ {
+ newCompositeNode(grammarAccess.getDSL_ListParamRule());
+ pushFollow(FOLLOW_1);
+ iv_ruleDSL_ListParam=ruleDSL_ListParam();
+
+ state._fsp--;
+
+ current =iv_ruleDSL_ListParam;
+ match(input,EOF,FOLLOW_2);
+
+ }
+
+ }
+
+ catch (RecognitionException re) {
+ recover(input,re);
+ appendSkippedTokens();
+ }
+ finally {
+ }
+ return current;
+ }
+ // $ANTLR end "entryRuleDSL_ListParam"
+
+
+ // $ANTLR start "ruleDSL_ListParam"
+ // InternalSensinact.g:2003:1: ruleDSL_ListParam returns [EObject current=null] : ( ( (lv_param_0_0= ruleDSL_Expression_Or ) ) (otherlv_1= ',' ( (lv_param_2_0= ruleDSL_Expression_Or ) ) )* ) ;
+ public final EObject ruleDSL_ListParam() throws RecognitionException {
+ EObject current = null;
+
+ Token otherlv_1=null;
+ EObject lv_param_0_0 = null;
+
+ EObject lv_param_2_0 = null;
+
+
+
+ enterRule();
+
+ try {
+ // InternalSensinact.g:2009:2: ( ( ( (lv_param_0_0= ruleDSL_Expression_Or ) ) (otherlv_1= ',' ( (lv_param_2_0= ruleDSL_Expression_Or ) ) )* ) )
+ // InternalSensinact.g:2010:2: ( ( (lv_param_0_0= ruleDSL_Expression_Or ) ) (otherlv_1= ',' ( (lv_param_2_0= ruleDSL_Expression_Or ) ) )* )
+ {
+ // InternalSensinact.g:2010:2: ( ( (lv_param_0_0= ruleDSL_Expression_Or ) ) (otherlv_1= ',' ( (lv_param_2_0= ruleDSL_Expression_Or ) ) )* )
+ // InternalSensinact.g:2011:3: ( (lv_param_0_0= ruleDSL_Expression_Or ) ) (otherlv_1= ',' ( (lv_param_2_0= ruleDSL_Expression_Or ) ) )*
+ {
+ // InternalSensinact.g:2011:3: ( (lv_param_0_0= ruleDSL_Expression_Or ) )
+ // InternalSensinact.g:2012:4: (lv_param_0_0= ruleDSL_Expression_Or )
+ {
+ // InternalSensinact.g:2012:4: (lv_param_0_0= ruleDSL_Expression_Or )
+ // InternalSensinact.g:2013:5: lv_param_0_0= ruleDSL_Expression_Or
+ {
+
+ newCompositeNode(grammarAccess.getDSL_ListParamAccess().getParamDSL_Expression_OrParserRuleCall_0_0());
+
+ pushFollow(FOLLOW_11);
+ lv_param_0_0=ruleDSL_Expression_Or();
+
+ state._fsp--;
+
+
+ if (current==null) {
+ current = createModelElementForParent(grammarAccess.getDSL_ListParamRule());
+ }
+ add(
+ current,
+ "param",
+ lv_param_0_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_Expression_Or");
+ afterParserOrEnumRuleCall();
+
+
+ }
+
+
+ }
+
+ // InternalSensinact.g:2030:3: (otherlv_1= ',' ( (lv_param_2_0= ruleDSL_Expression_Or ) ) )*
+ loop17:
+ do {
+ int alt17=2;
+ int LA17_0 = input.LA(1);
+
+ if ( (LA17_0==18) ) {
+ alt17=1;
+ }
+
+
+ switch (alt17) {
+ case 1 :
+ // InternalSensinact.g:2031:4: otherlv_1= ',' ( (lv_param_2_0= ruleDSL_Expression_Or ) )
+ {
+ otherlv_1=(Token)match(input,18,FOLLOW_14);
+
+ newLeafNode(otherlv_1, grammarAccess.getDSL_ListParamAccess().getCommaKeyword_1_0());
+
+ // InternalSensinact.g:2035:4: ( (lv_param_2_0= ruleDSL_Expression_Or ) )
+ // InternalSensinact.g:2036:5: (lv_param_2_0= ruleDSL_Expression_Or )
+ {
+ // InternalSensinact.g:2036:5: (lv_param_2_0= ruleDSL_Expression_Or )
+ // InternalSensinact.g:2037:6: lv_param_2_0= ruleDSL_Expression_Or
+ {
+
+ newCompositeNode(grammarAccess.getDSL_ListParamAccess().getParamDSL_Expression_OrParserRuleCall_1_1_0());
+
+ pushFollow(FOLLOW_11);
+ lv_param_2_0=ruleDSL_Expression_Or();
+
+ state._fsp--;
+
+
+ if (current==null) {
+ current = createModelElementForParent(grammarAccess.getDSL_ListParamRule());
+ }
+ add(
+ current,
+ "param",
+ lv_param_2_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_Expression_Or");
+ afterParserOrEnumRuleCall();
+
+
+ }
+
+
+ }
+
+
+ }
+ break;
+
+ default :
+ break loop17;
+ }
+ } while (true);
+
+
+ }
+
+
+ }
+
+
+ leaveRule();
+
+ }
+
+ catch (RecognitionException re) {
+ recover(input,re);
+ appendSkippedTokens();
+ }
+ finally {
+ }
+ return current;
+ }
+ // $ANTLR end "ruleDSL_ListParam"
+
+
+ // $ANTLR start "entryRuleDSL_Expression_Or"
+ // InternalSensinact.g:2059:1: entryRuleDSL_Expression_Or returns [EObject current=null] : iv_ruleDSL_Expression_Or= ruleDSL_Expression_Or EOF ;
+ public final EObject entryRuleDSL_Expression_Or() throws RecognitionException {
+ EObject current = null;
+
+ EObject iv_ruleDSL_Expression_Or = null;
+
+
+ try {
+ // InternalSensinact.g:2059:58: (iv_ruleDSL_Expression_Or= ruleDSL_Expression_Or EOF )
+ // InternalSensinact.g:2060:2: iv_ruleDSL_Expression_Or= ruleDSL_Expression_Or EOF
+ {
+ newCompositeNode(grammarAccess.getDSL_Expression_OrRule());
+ pushFollow(FOLLOW_1);
+ iv_ruleDSL_Expression_Or=ruleDSL_Expression_Or();
+
+ state._fsp--;
+
+ current =iv_ruleDSL_Expression_Or;
+ match(input,EOF,FOLLOW_2);
+
+ }
+
+ }
+
+ catch (RecognitionException re) {
+ recover(input,re);
+ appendSkippedTokens();
+ }
+ finally {
+ }
+ return current;
+ }
+ // $ANTLR end "entryRuleDSL_Expression_Or"
+
+
+ // $ANTLR start "ruleDSL_Expression_Or"
+ // InternalSensinact.g:2066:1: ruleDSL_Expression_Or returns [EObject current=null] : (this_DSL_Expression_And_0= ruleDSL_Expression_And (otherlv_1= 'or' () ( (lv_right_3_0= ruleDSL_Expression_And ) ) )* ) ;
+ public final EObject ruleDSL_Expression_Or() throws RecognitionException {
+ EObject current = null;
+
+ Token otherlv_1=null;
+ EObject this_DSL_Expression_And_0 = null;
+
+ EObject lv_right_3_0 = null;
+
+
+
+ enterRule();
+
+ try {
+ // InternalSensinact.g:2072:2: ( (this_DSL_Expression_And_0= ruleDSL_Expression_And (otherlv_1= 'or' () ( (lv_right_3_0= ruleDSL_Expression_And ) ) )* ) )
+ // InternalSensinact.g:2073:2: (this_DSL_Expression_And_0= ruleDSL_Expression_And (otherlv_1= 'or' () ( (lv_right_3_0= ruleDSL_Expression_And ) ) )* )
+ {
+ // InternalSensinact.g:2073:2: (this_DSL_Expression_And_0= ruleDSL_Expression_And (otherlv_1= 'or' () ( (lv_right_3_0= ruleDSL_Expression_And ) ) )* )
+ // InternalSensinact.g:2074:3: this_DSL_Expression_And_0= ruleDSL_Expression_And (otherlv_1= 'or' () ( (lv_right_3_0= ruleDSL_Expression_And ) ) )*
+ {
+
+ newCompositeNode(grammarAccess.getDSL_Expression_OrAccess().getDSL_Expression_AndParserRuleCall_0());
+
+ pushFollow(FOLLOW_29);
+ this_DSL_Expression_And_0=ruleDSL_Expression_And();
+
+ state._fsp--;
+
+
+ current = this_DSL_Expression_And_0;
+ afterParserOrEnumRuleCall();
+
+ // InternalSensinact.g:2082:3: (otherlv_1= 'or' () ( (lv_right_3_0= ruleDSL_Expression_And ) ) )*
+ loop18:
+ do {
+ int alt18=2;
+ int LA18_0 = input.LA(1);
+
+ if ( (LA18_0==40) ) {
+ alt18=1;
+ }
+
+
+ switch (alt18) {
+ case 1 :
+ // InternalSensinact.g:2083:4: otherlv_1= 'or' () ( (lv_right_3_0= ruleDSL_Expression_And ) )
+ {
+ otherlv_1=(Token)match(input,40,FOLLOW_14);
+
+ newLeafNode(otherlv_1, grammarAccess.getDSL_Expression_OrAccess().getOrKeyword_1_0());
+
+ // InternalSensinact.g:2087:4: ()
+ // InternalSensinact.g:2088:5:
+ {
+
+ current = forceCreateModelElementAndSet(
+ grammarAccess.getDSL_Expression_OrAccess().getDSL_Expression_OrLeftAction_1_1(),
+ current);
+
+
+ }
+
+ // InternalSensinact.g:2094:4: ( (lv_right_3_0= ruleDSL_Expression_And ) )
+ // InternalSensinact.g:2095:5: (lv_right_3_0= ruleDSL_Expression_And )
+ {
+ // InternalSensinact.g:2095:5: (lv_right_3_0= ruleDSL_Expression_And )
+ // InternalSensinact.g:2096:6: lv_right_3_0= ruleDSL_Expression_And
+ {
+
+ newCompositeNode(grammarAccess.getDSL_Expression_OrAccess().getRightDSL_Expression_AndParserRuleCall_1_2_0());
+
+ pushFollow(FOLLOW_29);
+ lv_right_3_0=ruleDSL_Expression_And();
+
+ state._fsp--;
+
+
+ if (current==null) {
+ current = createModelElementForParent(grammarAccess.getDSL_Expression_OrRule());
+ }
+ set(
+ current,
+ "right",
+ lv_right_3_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_Expression_And");
+ afterParserOrEnumRuleCall();
+
+
+ }
+
+
+ }
+
+
+ }
+ break;
+
+ default :
+ break loop18;
+ }
+ } while (true);
+
+
+ }
+
+
+ }
+
+
+ leaveRule();
+
+ }
+
+ catch (RecognitionException re) {
+ recover(input,re);
+ appendSkippedTokens();
+ }
+ finally {
+ }
+ return current;
+ }
+ // $ANTLR end "ruleDSL_Expression_Or"
+
+
+ // $ANTLR start "entryRuleDSL_Expression_And"
+ // InternalSensinact.g:2118:1: entryRuleDSL_Expression_And returns [EObject current=null] : iv_ruleDSL_Expression_And= ruleDSL_Expression_And EOF ;
+ public final EObject entryRuleDSL_Expression_And() throws RecognitionException {
+ EObject current = null;
+
+ EObject iv_ruleDSL_Expression_And = null;
+
+
+ try {
+ // InternalSensinact.g:2118:59: (iv_ruleDSL_Expression_And= ruleDSL_Expression_And EOF )
+ // InternalSensinact.g:2119:2: iv_ruleDSL_Expression_And= ruleDSL_Expression_And EOF
+ {
+ newCompositeNode(grammarAccess.getDSL_Expression_AndRule());
+ pushFollow(FOLLOW_1);
+ iv_ruleDSL_Expression_And=ruleDSL_Expression_And();
+
+ state._fsp--;
+
+ current =iv_ruleDSL_Expression_And;
+ match(input,EOF,FOLLOW_2);
+
+ }
+
+ }
+
+ catch (RecognitionException re) {
+ recover(input,re);
+ appendSkippedTokens();
+ }
+ finally {
+ }
+ return current;
+ }
+ // $ANTLR end "entryRuleDSL_Expression_And"
+
+
+ // $ANTLR start "ruleDSL_Expression_And"
+ // InternalSensinact.g:2125:1: ruleDSL_Expression_And returns [EObject current=null] : (this_DSL_Expression_DiffEqual_0= ruleDSL_Expression_DiffEqual (otherlv_1= 'and' () ( (lv_right_3_0= ruleDSL_Expression_DiffEqual ) ) )* ) ;
+ public final EObject ruleDSL_Expression_And() throws RecognitionException {
+ EObject current = null;
+
+ Token otherlv_1=null;
+ EObject this_DSL_Expression_DiffEqual_0 = null;
+
+ EObject lv_right_3_0 = null;
+
+
+
+ enterRule();
+
+ try {
+ // InternalSensinact.g:2131:2: ( (this_DSL_Expression_DiffEqual_0= ruleDSL_Expression_DiffEqual (otherlv_1= 'and' () ( (lv_right_3_0= ruleDSL_Expression_DiffEqual ) ) )* ) )
+ // InternalSensinact.g:2132:2: (this_DSL_Expression_DiffEqual_0= ruleDSL_Expression_DiffEqual (otherlv_1= 'and' () ( (lv_right_3_0= ruleDSL_Expression_DiffEqual ) ) )* )
+ {
+ // InternalSensinact.g:2132:2: (this_DSL_Expression_DiffEqual_0= ruleDSL_Expression_DiffEqual (otherlv_1= 'and' () ( (lv_right_3_0= ruleDSL_Expression_DiffEqual ) ) )* )
+ // InternalSensinact.g:2133:3: this_DSL_Expression_DiffEqual_0= ruleDSL_Expression_DiffEqual (otherlv_1= 'and' () ( (lv_right_3_0= ruleDSL_Expression_DiffEqual ) ) )*
+ {
+
+ newCompositeNode(grammarAccess.getDSL_Expression_AndAccess().getDSL_Expression_DiffEqualParserRuleCall_0());
+
+ pushFollow(FOLLOW_30);
+ this_DSL_Expression_DiffEqual_0=ruleDSL_Expression_DiffEqual();
+
+ state._fsp--;
+
+
+ current = this_DSL_Expression_DiffEqual_0;
+ afterParserOrEnumRuleCall();
+
+ // InternalSensinact.g:2141:3: (otherlv_1= 'and' () ( (lv_right_3_0= ruleDSL_Expression_DiffEqual ) ) )*
+ loop19:
+ do {
+ int alt19=2;
+ int LA19_0 = input.LA(1);
+
+ if ( (LA19_0==41) ) {
+ alt19=1;
+ }
+
+
+ switch (alt19) {
+ case 1 :
+ // InternalSensinact.g:2142:4: otherlv_1= 'and' () ( (lv_right_3_0= ruleDSL_Expression_DiffEqual ) )
+ {
+ otherlv_1=(Token)match(input,41,FOLLOW_14);
+
+ newLeafNode(otherlv_1, grammarAccess.getDSL_Expression_AndAccess().getAndKeyword_1_0());
+
+ // InternalSensinact.g:2146:4: ()
+ // InternalSensinact.g:2147:5:
+ {
+
+ current = forceCreateModelElementAndSet(
+ grammarAccess.getDSL_Expression_AndAccess().getDSL_Expression_AndLeftAction_1_1(),
+ current);
+
+
+ }
+
+ // InternalSensinact.g:2153:4: ( (lv_right_3_0= ruleDSL_Expression_DiffEqual ) )
+ // InternalSensinact.g:2154:5: (lv_right_3_0= ruleDSL_Expression_DiffEqual )
+ {
+ // InternalSensinact.g:2154:5: (lv_right_3_0= ruleDSL_Expression_DiffEqual )
+ // InternalSensinact.g:2155:6: lv_right_3_0= ruleDSL_Expression_DiffEqual
+ {
+
+ newCompositeNode(grammarAccess.getDSL_Expression_AndAccess().getRightDSL_Expression_DiffEqualParserRuleCall_1_2_0());
+
+ pushFollow(FOLLOW_30);
+ lv_right_3_0=ruleDSL_Expression_DiffEqual();
+
+ state._fsp--;
+
+
+ if (current==null) {
+ current = createModelElementForParent(grammarAccess.getDSL_Expression_AndRule());
+ }
+ set(
+ current,
+ "right",
+ lv_right_3_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_Expression_DiffEqual");
+ afterParserOrEnumRuleCall();
+
+
+ }
+
+
+ }
+
+
+ }
+ break;
+
+ default :
+ break loop19;
+ }
+ } while (true);
+
+
+ }
+
+
+ }
+
+
+ leaveRule();
+
+ }
+
+ catch (RecognitionException re) {
+ recover(input,re);
+ appendSkippedTokens();
+ }
+ finally {
+ }
+ return current;
+ }
+ // $ANTLR end "ruleDSL_Expression_And"
+
+
+ // $ANTLR start "entryRuleDSL_Expression_DiffEqual"
+ // InternalSensinact.g:2177:1: entryRuleDSL_Expression_DiffEqual returns [EObject current=null] : iv_ruleDSL_Expression_DiffEqual= ruleDSL_Expression_DiffEqual EOF ;
+ public final EObject entryRuleDSL_Expression_DiffEqual() throws RecognitionException {
+ EObject current = null;
+
+ EObject iv_ruleDSL_Expression_DiffEqual = null;
+
+
+ try {
+ // InternalSensinact.g:2177:65: (iv_ruleDSL_Expression_DiffEqual= ruleDSL_Expression_DiffEqual EOF )
+ // InternalSensinact.g:2178:2: iv_ruleDSL_Expression_DiffEqual= ruleDSL_Expression_DiffEqual EOF
+ {
+ newCompositeNode(grammarAccess.getDSL_Expression_DiffEqualRule());
+ pushFollow(FOLLOW_1);
+ iv_ruleDSL_Expression_DiffEqual=ruleDSL_Expression_DiffEqual();
+
+ state._fsp--;
+
+ current =iv_ruleDSL_Expression_DiffEqual;
+ match(input,EOF,FOLLOW_2);
+
+ }
+
+ }
+
+ catch (RecognitionException re) {
+ recover(input,re);
+ appendSkippedTokens();
+ }
+ finally {
+ }
+ return current;
+ }
+ // $ANTLR end "entryRuleDSL_Expression_DiffEqual"
+
+
+ // $ANTLR start "ruleDSL_Expression_DiffEqual"
+ // InternalSensinact.g:2184:1: ruleDSL_Expression_DiffEqual returns [EObject current=null] : (this_DSL_Expression_Compare_0= ruleDSL_Expression_Compare ( (otherlv_1= '!=' () ( (lv_right_3_0= ruleDSL_Expression_Compare ) ) ) | (otherlv_4= '==' () ( (lv_right_6_0= ruleDSL_Expression_Compare ) ) ) )* ) ;
+ public final EObject ruleDSL_Expression_DiffEqual() throws RecognitionException {
+ EObject current = null;
+
+ Token otherlv_1=null;
+ Token otherlv_4=null;
+ EObject this_DSL_Expression_Compare_0 = null;
+
+ EObject lv_right_3_0 = null;
+
+ EObject lv_right_6_0 = null;
+
+
+
+ enterRule();
+
+ try {
+ // InternalSensinact.g:2190:2: ( (this_DSL_Expression_Compare_0= ruleDSL_Expression_Compare ( (otherlv_1= '!=' () ( (lv_right_3_0= ruleDSL_Expression_Compare ) ) ) | (otherlv_4= '==' () ( (lv_right_6_0= ruleDSL_Expression_Compare ) ) ) )* ) )
+ // InternalSensinact.g:2191:2: (this_DSL_Expression_Compare_0= ruleDSL_Expression_Compare ( (otherlv_1= '!=' () ( (lv_right_3_0= ruleDSL_Expression_Compare ) ) ) | (otherlv_4= '==' () ( (lv_right_6_0= ruleDSL_Expression_Compare ) ) ) )* )
+ {
+ // InternalSensinact.g:2191:2: (this_DSL_Expression_Compare_0= ruleDSL_Expression_Compare ( (otherlv_1= '!=' () ( (lv_right_3_0= ruleDSL_Expression_Compare ) ) ) | (otherlv_4= '==' () ( (lv_right_6_0= ruleDSL_Expression_Compare ) ) ) )* )
+ // InternalSensinact.g:2192:3: this_DSL_Expression_Compare_0= ruleDSL_Expression_Compare ( (otherlv_1= '!=' () ( (lv_right_3_0= ruleDSL_Expression_Compare ) ) ) | (otherlv_4= '==' () ( (lv_right_6_0= ruleDSL_Expression_Compare ) ) ) )*
+ {
+
+ newCompositeNode(grammarAccess.getDSL_Expression_DiffEqualAccess().getDSL_Expression_CompareParserRuleCall_0());
+
+ pushFollow(FOLLOW_31);
+ this_DSL_Expression_Compare_0=ruleDSL_Expression_Compare();
+
+ state._fsp--;
+
+
+ current = this_DSL_Expression_Compare_0;
+ afterParserOrEnumRuleCall();
+
+ // InternalSensinact.g:2200:3: ( (otherlv_1= '!=' () ( (lv_right_3_0= ruleDSL_Expression_Compare ) ) ) | (otherlv_4= '==' () ( (lv_right_6_0= ruleDSL_Expression_Compare ) ) ) )*
+ loop20:
+ do {
+ int alt20=3;
+ int LA20_0 = input.LA(1);
+
+ if ( (LA20_0==42) ) {
+ alt20=1;
+ }
+ else if ( (LA20_0==43) ) {
+ alt20=2;
+ }
+
+
+ switch (alt20) {
+ case 1 :
+ // InternalSensinact.g:2201:4: (otherlv_1= '!=' () ( (lv_right_3_0= ruleDSL_Expression_Compare ) ) )
+ {
+ // InternalSensinact.g:2201:4: (otherlv_1= '!=' () ( (lv_right_3_0= ruleDSL_Expression_Compare ) ) )
+ // InternalSensinact.g:2202:5: otherlv_1= '!=' () ( (lv_right_3_0= ruleDSL_Expression_Compare ) )
+ {
+ otherlv_1=(Token)match(input,42,FOLLOW_14);
+
+ newLeafNode(otherlv_1, grammarAccess.getDSL_Expression_DiffEqualAccess().getExclamationMarkEqualsSignKeyword_1_0_0());
+
+ // InternalSensinact.g:2206:5: ()
+ // InternalSensinact.g:2207:6:
+ {
+
+ current = forceCreateModelElementAndSet(
+ grammarAccess.getDSL_Expression_DiffEqualAccess().getDSL_Expression_DiffLeftAction_1_0_1(),
+ current);
+
+
+ }
+
+ // InternalSensinact.g:2213:5: ( (lv_right_3_0= ruleDSL_Expression_Compare ) )
+ // InternalSensinact.g:2214:6: (lv_right_3_0= ruleDSL_Expression_Compare )
+ {
+ // InternalSensinact.g:2214:6: (lv_right_3_0= ruleDSL_Expression_Compare )
+ // InternalSensinact.g:2215:7: lv_right_3_0= ruleDSL_Expression_Compare
+ {
+
+ newCompositeNode(grammarAccess.getDSL_Expression_DiffEqualAccess().getRightDSL_Expression_CompareParserRuleCall_1_0_2_0());
+
+ pushFollow(FOLLOW_31);
+ lv_right_3_0=ruleDSL_Expression_Compare();
+
+ state._fsp--;
+
+
+ if (current==null) {
+ current = createModelElementForParent(grammarAccess.getDSL_Expression_DiffEqualRule());
+ }
+ set(
+ current,
+ "right",
+ lv_right_3_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_Expression_Compare");
+ afterParserOrEnumRuleCall();
+
+
+ }
+
+
+ }
+
+
+ }
+
+
+ }
+ break;
+ case 2 :
+ // InternalSensinact.g:2234:4: (otherlv_4= '==' () ( (lv_right_6_0= ruleDSL_Expression_Compare ) ) )
+ {
+ // InternalSensinact.g:2234:4: (otherlv_4= '==' () ( (lv_right_6_0= ruleDSL_Expression_Compare ) ) )
+ // InternalSensinact.g:2235:5: otherlv_4= '==' () ( (lv_right_6_0= ruleDSL_Expression_Compare ) )
+ {
+ otherlv_4=(Token)match(input,43,FOLLOW_14);
+
+ newLeafNode(otherlv_4, grammarAccess.getDSL_Expression_DiffEqualAccess().getEqualsSignEqualsSignKeyword_1_1_0());
+
+ // InternalSensinact.g:2239:5: ()
+ // InternalSensinact.g:2240:6:
+ {
+
+ current = forceCreateModelElementAndSet(
+ grammarAccess.getDSL_Expression_DiffEqualAccess().getDSL_Expression_EqualLeftAction_1_1_1(),
+ current);
+
+
+ }
+
+ // InternalSensinact.g:2246:5: ( (lv_right_6_0= ruleDSL_Expression_Compare ) )
+ // InternalSensinact.g:2247:6: (lv_right_6_0= ruleDSL_Expression_Compare )
+ {
+ // InternalSensinact.g:2247:6: (lv_right_6_0= ruleDSL_Expression_Compare )
+ // InternalSensinact.g:2248:7: lv_right_6_0= ruleDSL_Expression_Compare
+ {
+
+ newCompositeNode(grammarAccess.getDSL_Expression_DiffEqualAccess().getRightDSL_Expression_CompareParserRuleCall_1_1_2_0());
+
+ pushFollow(FOLLOW_31);
+ lv_right_6_0=ruleDSL_Expression_Compare();
+
+ state._fsp--;
+
+
+ if (current==null) {
+ current = createModelElementForParent(grammarAccess.getDSL_Expression_DiffEqualRule());
+ }
+ set(
+ current,
+ "right",
+ lv_right_6_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_Expression_Compare");
+ afterParserOrEnumRuleCall();
+
+
+ }
+
+
+ }
+
+
+ }
+
+
+ }
+ break;
+
+ default :
+ break loop20;
+ }
+ } while (true);
+
+
+ }
+
+
+ }
+
+
+ leaveRule();
+
+ }
+
+ catch (RecognitionException re) {
+ recover(input,re);
+ appendSkippedTokens();
+ }
+ finally {
+ }
+ return current;
+ }
+ // $ANTLR end "ruleDSL_Expression_DiffEqual"
+
+
+ // $ANTLR start "entryRuleDSL_Expression_Compare"
+ // InternalSensinact.g:2271:1: entryRuleDSL_Expression_Compare returns [EObject current=null] : iv_ruleDSL_Expression_Compare= ruleDSL_Expression_Compare EOF ;
+ public final EObject entryRuleDSL_Expression_Compare() throws RecognitionException {
+ EObject current = null;
+
+ EObject iv_ruleDSL_Expression_Compare = null;
+
+
+ try {
+ // InternalSensinact.g:2271:63: (iv_ruleDSL_Expression_Compare= ruleDSL_Expression_Compare EOF )
+ // InternalSensinact.g:2272:2: iv_ruleDSL_Expression_Compare= ruleDSL_Expression_Compare EOF
+ {
+ newCompositeNode(grammarAccess.getDSL_Expression_CompareRule());
+ pushFollow(FOLLOW_1);
+ iv_ruleDSL_Expression_Compare=ruleDSL_Expression_Compare();
+
+ state._fsp--;
+
+ current =iv_ruleDSL_Expression_Compare;
+ match(input,EOF,FOLLOW_2);
+
+ }
+
+ }
+
+ catch (RecognitionException re) {
+ recover(input,re);
+ appendSkippedTokens();
+ }
+ finally {
+ }
+ return current;
+ }
+ // $ANTLR end "entryRuleDSL_Expression_Compare"
+
+
+ // $ANTLR start "ruleDSL_Expression_Compare"
+ // InternalSensinact.g:2278:1: ruleDSL_Expression_Compare returns [EObject current=null] : (this_DSL_Expression_PlusMinus_0= ruleDSL_Expression_PlusMinus ( (otherlv_1= '>' () ( (lv_right_3_0= ruleDSL_Expression_PlusMinus ) ) ) | (otherlv_4= '>=' () ( (lv_right_6_0= ruleDSL_Expression_PlusMinus ) ) ) | (otherlv_7= '<' () ( (lv_right_9_0= ruleDSL_Expression_PlusMinus ) ) ) | (otherlv_10= '<=' () ( (lv_right_12_0= ruleDSL_Expression_PlusMinus ) ) ) )* ) ;
+ public final EObject ruleDSL_Expression_Compare() throws RecognitionException {
+ EObject current = null;
+
+ Token otherlv_1=null;
+ Token otherlv_4=null;
+ Token otherlv_7=null;
+ Token otherlv_10=null;
+ EObject this_DSL_Expression_PlusMinus_0 = null;
+
+ EObject lv_right_3_0 = null;
+
+ EObject lv_right_6_0 = null;
+
+ EObject lv_right_9_0 = null;
+
+ EObject lv_right_12_0 = null;
+
+
+
+ enterRule();
+
+ try {
+ // InternalSensinact.g:2284:2: ( (this_DSL_Expression_PlusMinus_0= ruleDSL_Expression_PlusMinus ( (otherlv_1= '>' () ( (lv_right_3_0= ruleDSL_Expression_PlusMinus ) ) ) | (otherlv_4= '>=' () ( (lv_right_6_0= ruleDSL_Expression_PlusMinus ) ) ) | (otherlv_7= '<' () ( (lv_right_9_0= ruleDSL_Expression_PlusMinus ) ) ) | (otherlv_10= '<=' () ( (lv_right_12_0= ruleDSL_Expression_PlusMinus ) ) ) )* ) )
+ // InternalSensinact.g:2285:2: (this_DSL_Expression_PlusMinus_0= ruleDSL_Expression_PlusMinus ( (otherlv_1= '>' () ( (lv_right_3_0= ruleDSL_Expression_PlusMinus ) ) ) | (otherlv_4= '>=' () ( (lv_right_6_0= ruleDSL_Expression_PlusMinus ) ) ) | (otherlv_7= '<' () ( (lv_right_9_0= ruleDSL_Expression_PlusMinus ) ) ) | (otherlv_10= '<=' () ( (lv_right_12_0= ruleDSL_Expression_PlusMinus ) ) ) )* )
+ {
+ // InternalSensinact.g:2285:2: (this_DSL_Expression_PlusMinus_0= ruleDSL_Expression_PlusMinus ( (otherlv_1= '>' () ( (lv_right_3_0= ruleDSL_Expression_PlusMinus ) ) ) | (otherlv_4= '>=' () ( (lv_right_6_0= ruleDSL_Expression_PlusMinus ) ) ) | (otherlv_7= '<' () ( (lv_right_9_0= ruleDSL_Expression_PlusMinus ) ) ) | (otherlv_10= '<=' () ( (lv_right_12_0= ruleDSL_Expression_PlusMinus ) ) ) )* )
+ // InternalSensinact.g:2286:3: this_DSL_Expression_PlusMinus_0= ruleDSL_Expression_PlusMinus ( (otherlv_1= '>' () ( (lv_right_3_0= ruleDSL_Expression_PlusMinus ) ) ) | (otherlv_4= '>=' () ( (lv_right_6_0= ruleDSL_Expression_PlusMinus ) ) ) | (otherlv_7= '<' () ( (lv_right_9_0= ruleDSL_Expression_PlusMinus ) ) ) | (otherlv_10= '<=' () ( (lv_right_12_0= ruleDSL_Expression_PlusMinus ) ) ) )*
+ {
+
+ newCompositeNode(grammarAccess.getDSL_Expression_CompareAccess().getDSL_Expression_PlusMinusParserRuleCall_0());
+
+ pushFollow(FOLLOW_32);
+ this_DSL_Expression_PlusMinus_0=ruleDSL_Expression_PlusMinus();
+
+ state._fsp--;
+
+
+ current = this_DSL_Expression_PlusMinus_0;
+ afterParserOrEnumRuleCall();
+
+ // InternalSensinact.g:2294:3: ( (otherlv_1= '>' () ( (lv_right_3_0= ruleDSL_Expression_PlusMinus ) ) ) | (otherlv_4= '>=' () ( (lv_right_6_0= ruleDSL_Expression_PlusMinus ) ) ) | (otherlv_7= '<' () ( (lv_right_9_0= ruleDSL_Expression_PlusMinus ) ) ) | (otherlv_10= '<=' () ( (lv_right_12_0= ruleDSL_Expression_PlusMinus ) ) ) )*
+ loop21:
+ do {
+ int alt21=5;
+ switch ( input.LA(1) ) {
+ case 44:
+ {
+ alt21=1;
+ }
+ break;
+ case 45:
+ {
+ alt21=2;
+ }
+ break;
+ case 46:
+ {
+ alt21=3;
+ }
+ break;
+ case 47:
+ {
+ alt21=4;
+ }
+ break;
+
+ }
+
+ switch (alt21) {
+ case 1 :
+ // InternalSensinact.g:2295:4: (otherlv_1= '>' () ( (lv_right_3_0= ruleDSL_Expression_PlusMinus ) ) )
+ {
+ // InternalSensinact.g:2295:4: (otherlv_1= '>' () ( (lv_right_3_0= ruleDSL_Expression_PlusMinus ) ) )
+ // InternalSensinact.g:2296:5: otherlv_1= '>' () ( (lv_right_3_0= ruleDSL_Expression_PlusMinus ) )
+ {
+ otherlv_1=(Token)match(input,44,FOLLOW_14);
+
+ newLeafNode(otherlv_1, grammarAccess.getDSL_Expression_CompareAccess().getGreaterThanSignKeyword_1_0_0());
+
+ // InternalSensinact.g:2300:5: ()
+ // InternalSensinact.g:2301:6:
+ {
+
+ current = forceCreateModelElementAndSet(
+ grammarAccess.getDSL_Expression_CompareAccess().getDSL_Expression_LargerLeftAction_1_0_1(),
+ current);
+
+
+ }
+
+ // InternalSensinact.g:2307:5: ( (lv_right_3_0= ruleDSL_Expression_PlusMinus ) )
+ // InternalSensinact.g:2308:6: (lv_right_3_0= ruleDSL_Expression_PlusMinus )
+ {
+ // InternalSensinact.g:2308:6: (lv_right_3_0= ruleDSL_Expression_PlusMinus )
+ // InternalSensinact.g:2309:7: lv_right_3_0= ruleDSL_Expression_PlusMinus
+ {
+
+ newCompositeNode(grammarAccess.getDSL_Expression_CompareAccess().getRightDSL_Expression_PlusMinusParserRuleCall_1_0_2_0());
+
+ pushFollow(FOLLOW_32);
+ lv_right_3_0=ruleDSL_Expression_PlusMinus();
+
+ state._fsp--;
+
+
+ if (current==null) {
+ current = createModelElementForParent(grammarAccess.getDSL_Expression_CompareRule());
+ }
+ set(
+ current,
+ "right",
+ lv_right_3_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_Expression_PlusMinus");
+ afterParserOrEnumRuleCall();
+
+
+ }
+
+
+ }
+
+
+ }
+
+
+ }
+ break;
+ case 2 :
+ // InternalSensinact.g:2328:4: (otherlv_4= '>=' () ( (lv_right_6_0= ruleDSL_Expression_PlusMinus ) ) )
+ {
+ // InternalSensinact.g:2328:4: (otherlv_4= '>=' () ( (lv_right_6_0= ruleDSL_Expression_PlusMinus ) ) )
+ // InternalSensinact.g:2329:5: otherlv_4= '>=' () ( (lv_right_6_0= ruleDSL_Expression_PlusMinus ) )
+ {
+ otherlv_4=(Token)match(input,45,FOLLOW_14);
+
+ newLeafNode(otherlv_4, grammarAccess.getDSL_Expression_CompareAccess().getGreaterThanSignEqualsSignKeyword_1_1_0());
+
+ // InternalSensinact.g:2333:5: ()
+ // InternalSensinact.g:2334:6:
+ {
+
+ current = forceCreateModelElementAndSet(
+ grammarAccess.getDSL_Expression_CompareAccess().getDSL_Expression_Larger_EqualLeftAction_1_1_1(),
+ current);
+
+
+ }
+
+ // InternalSensinact.g:2340:5: ( (lv_right_6_0= ruleDSL_Expression_PlusMinus ) )
+ // InternalSensinact.g:2341:6: (lv_right_6_0= ruleDSL_Expression_PlusMinus )
+ {
+ // InternalSensinact.g:2341:6: (lv_right_6_0= ruleDSL_Expression_PlusMinus )
+ // InternalSensinact.g:2342:7: lv_right_6_0= ruleDSL_Expression_PlusMinus
+ {
+
+ newCompositeNode(grammarAccess.getDSL_Expression_CompareAccess().getRightDSL_Expression_PlusMinusParserRuleCall_1_1_2_0());
+
+ pushFollow(FOLLOW_32);
+ lv_right_6_0=ruleDSL_Expression_PlusMinus();
+
+ state._fsp--;
+
+
+ if (current==null) {
+ current = createModelElementForParent(grammarAccess.getDSL_Expression_CompareRule());
+ }
+ set(
+ current,
+ "right",
+ lv_right_6_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_Expression_PlusMinus");
+ afterParserOrEnumRuleCall();
+
+
+ }
+
+
+ }
+
+
+ }
+
+
+ }
+ break;
+ case 3 :
+ // InternalSensinact.g:2361:4: (otherlv_7= '<' () ( (lv_right_9_0= ruleDSL_Expression_PlusMinus ) ) )
+ {
+ // InternalSensinact.g:2361:4: (otherlv_7= '<' () ( (lv_right_9_0= ruleDSL_Expression_PlusMinus ) ) )
+ // InternalSensinact.g:2362:5: otherlv_7= '<' () ( (lv_right_9_0= ruleDSL_Expression_PlusMinus ) )
+ {
+ otherlv_7=(Token)match(input,46,FOLLOW_14);
+
+ newLeafNode(otherlv_7, grammarAccess.getDSL_Expression_CompareAccess().getLessThanSignKeyword_1_2_0());
+
+ // InternalSensinact.g:2366:5: ()
+ // InternalSensinact.g:2367:6:
+ {
+
+ current = forceCreateModelElementAndSet(
+ grammarAccess.getDSL_Expression_CompareAccess().getDSL_Expression_SmallerLeftAction_1_2_1(),
+ current);
+
+
+ }
+
+ // InternalSensinact.g:2373:5: ( (lv_right_9_0= ruleDSL_Expression_PlusMinus ) )
+ // InternalSensinact.g:2374:6: (lv_right_9_0= ruleDSL_Expression_PlusMinus )
+ {
+ // InternalSensinact.g:2374:6: (lv_right_9_0= ruleDSL_Expression_PlusMinus )
+ // InternalSensinact.g:2375:7: lv_right_9_0= ruleDSL_Expression_PlusMinus
+ {
+
+ newCompositeNode(grammarAccess.getDSL_Expression_CompareAccess().getRightDSL_Expression_PlusMinusParserRuleCall_1_2_2_0());
+
+ pushFollow(FOLLOW_32);
+ lv_right_9_0=ruleDSL_Expression_PlusMinus();
+
+ state._fsp--;
+
+
+ if (current==null) {
+ current = createModelElementForParent(grammarAccess.getDSL_Expression_CompareRule());
+ }
+ set(
+ current,
+ "right",
+ lv_right_9_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_Expression_PlusMinus");
+ afterParserOrEnumRuleCall();
+
+
+ }
+
+
+ }
+
+
+ }
+
+
+ }
+ break;
+ case 4 :
+ // InternalSensinact.g:2394:4: (otherlv_10= '<=' () ( (lv_right_12_0= ruleDSL_Expression_PlusMinus ) ) )
+ {
+ // InternalSensinact.g:2394:4: (otherlv_10= '<=' () ( (lv_right_12_0= ruleDSL_Expression_PlusMinus ) ) )
+ // InternalSensinact.g:2395:5: otherlv_10= '<=' () ( (lv_right_12_0= ruleDSL_Expression_PlusMinus ) )
+ {
+ otherlv_10=(Token)match(input,47,FOLLOW_14);
+
+ newLeafNode(otherlv_10, grammarAccess.getDSL_Expression_CompareAccess().getLessThanSignEqualsSignKeyword_1_3_0());
+
+ // InternalSensinact.g:2399:5: ()
+ // InternalSensinact.g:2400:6:
+ {
+
+ current = forceCreateModelElementAndSet(
+ grammarAccess.getDSL_Expression_CompareAccess().getDSL_Expression_Smaller_EqualLeftAction_1_3_1(),
+ current);
+
+
+ }
+
+ // InternalSensinact.g:2406:5: ( (lv_right_12_0= ruleDSL_Expression_PlusMinus ) )
+ // InternalSensinact.g:2407:6: (lv_right_12_0= ruleDSL_Expression_PlusMinus )
+ {
+ // InternalSensinact.g:2407:6: (lv_right_12_0= ruleDSL_Expression_PlusMinus )
+ // InternalSensinact.g:2408:7: lv_right_12_0= ruleDSL_Expression_PlusMinus
+ {
+
+ newCompositeNode(grammarAccess.getDSL_Expression_CompareAccess().getRightDSL_Expression_PlusMinusParserRuleCall_1_3_2_0());
+
+ pushFollow(FOLLOW_32);
+ lv_right_12_0=ruleDSL_Expression_PlusMinus();
+
+ state._fsp--;
+
+
+ if (current==null) {
+ current = createModelElementForParent(grammarAccess.getDSL_Expression_CompareRule());
+ }
+ set(
+ current,
+ "right",
+ lv_right_12_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_Expression_PlusMinus");
+ afterParserOrEnumRuleCall();
+
+
+ }
+
+
+ }
+
+
+ }
+
+
+ }
+ break;
+
+ default :
+ break loop21;
+ }
+ } while (true);
+
+
+ }
+
+
+ }
+
+
+ leaveRule();
+
+ }
+
+ catch (RecognitionException re) {
+ recover(input,re);
+ appendSkippedTokens();
+ }
+ finally {
+ }
+ return current;
+ }
+ // $ANTLR end "ruleDSL_Expression_Compare"
+
+
+ // $ANTLR start "entryRuleDSL_Expression_PlusMinus"
+ // InternalSensinact.g:2431:1: entryRuleDSL_Expression_PlusMinus returns [EObject current=null] : iv_ruleDSL_Expression_PlusMinus= ruleDSL_Expression_PlusMinus EOF ;
+ public final EObject entryRuleDSL_Expression_PlusMinus() throws RecognitionException {
+ EObject current = null;
+
+ EObject iv_ruleDSL_Expression_PlusMinus = null;
+
+
+ try {
+ // InternalSensinact.g:2431:65: (iv_ruleDSL_Expression_PlusMinus= ruleDSL_Expression_PlusMinus EOF )
+ // InternalSensinact.g:2432:2: iv_ruleDSL_Expression_PlusMinus= ruleDSL_Expression_PlusMinus EOF
+ {
+ newCompositeNode(grammarAccess.getDSL_Expression_PlusMinusRule());
+ pushFollow(FOLLOW_1);
+ iv_ruleDSL_Expression_PlusMinus=ruleDSL_Expression_PlusMinus();
+
+ state._fsp--;
+
+ current =iv_ruleDSL_Expression_PlusMinus;
+ match(input,EOF,FOLLOW_2);
+
+ }
+
+ }
+
+ catch (RecognitionException re) {
+ recover(input,re);
+ appendSkippedTokens();
+ }
+ finally {
+ }
+ return current;
+ }
+ // $ANTLR end "entryRuleDSL_Expression_PlusMinus"
+
+
+ // $ANTLR start "ruleDSL_Expression_PlusMinus"
+ // InternalSensinact.g:2438:1: ruleDSL_Expression_PlusMinus returns [EObject current=null] : (this_DSL_Expression_MultiplicationDivision_0= ruleDSL_Expression_MultiplicationDivision ( (otherlv_1= '+' () ( (lv_right_3_0= ruleDSL_Expression_MultiplicationDivision ) ) ) | (otherlv_4= '-' () ( (lv_right_6_0= ruleDSL_Expression_MultiplicationDivision ) ) ) )* ) ;
+ public final EObject ruleDSL_Expression_PlusMinus() throws RecognitionException {
+ EObject current = null;
+
+ Token otherlv_1=null;
+ Token otherlv_4=null;
+ EObject this_DSL_Expression_MultiplicationDivision_0 = null;
+
+ EObject lv_right_3_0 = null;
+
+ EObject lv_right_6_0 = null;
+
+
+
+ enterRule();
+
+ try {
+ // InternalSensinact.g:2444:2: ( (this_DSL_Expression_MultiplicationDivision_0= ruleDSL_Expression_MultiplicationDivision ( (otherlv_1= '+' () ( (lv_right_3_0= ruleDSL_Expression_MultiplicationDivision ) ) ) | (otherlv_4= '-' () ( (lv_right_6_0= ruleDSL_Expression_MultiplicationDivision ) ) ) )* ) )
+ // InternalSensinact.g:2445:2: (this_DSL_Expression_MultiplicationDivision_0= ruleDSL_Expression_MultiplicationDivision ( (otherlv_1= '+' () ( (lv_right_3_0= ruleDSL_Expression_MultiplicationDivision ) ) ) | (otherlv_4= '-' () ( (lv_right_6_0= ruleDSL_Expression_MultiplicationDivision ) ) ) )* )
+ {
+ // InternalSensinact.g:2445:2: (this_DSL_Expression_MultiplicationDivision_0= ruleDSL_Expression_MultiplicationDivision ( (otherlv_1= '+' () ( (lv_right_3_0= ruleDSL_Expression_MultiplicationDivision ) ) ) | (otherlv_4= '-' () ( (lv_right_6_0= ruleDSL_Expression_MultiplicationDivision ) ) ) )* )
+ // InternalSensinact.g:2446:3: this_DSL_Expression_MultiplicationDivision_0= ruleDSL_Expression_MultiplicationDivision ( (otherlv_1= '+' () ( (lv_right_3_0= ruleDSL_Expression_MultiplicationDivision ) ) ) | (otherlv_4= '-' () ( (lv_right_6_0= ruleDSL_Expression_MultiplicationDivision ) ) ) )*
+ {
+
+ newCompositeNode(grammarAccess.getDSL_Expression_PlusMinusAccess().getDSL_Expression_MultiplicationDivisionParserRuleCall_0());
+
+ pushFollow(FOLLOW_33);
+ this_DSL_Expression_MultiplicationDivision_0=ruleDSL_Expression_MultiplicationDivision();
+
+ state._fsp--;
+
+
+ current = this_DSL_Expression_MultiplicationDivision_0;
+ afterParserOrEnumRuleCall();
+
+ // InternalSensinact.g:2454:3: ( (otherlv_1= '+' () ( (lv_right_3_0= ruleDSL_Expression_MultiplicationDivision ) ) ) | (otherlv_4= '-' () ( (lv_right_6_0= ruleDSL_Expression_MultiplicationDivision ) ) ) )*
+ loop22:
+ do {
+ int alt22=3;
+ int LA22_0 = input.LA(1);
+
+ if ( (LA22_0==48) ) {
+ alt22=1;
+ }
+ else if ( (LA22_0==49) ) {
+ alt22=2;
+ }
+
+
+ switch (alt22) {
+ case 1 :
+ // InternalSensinact.g:2455:4: (otherlv_1= '+' () ( (lv_right_3_0= ruleDSL_Expression_MultiplicationDivision ) ) )
+ {
+ // InternalSensinact.g:2455:4: (otherlv_1= '+' () ( (lv_right_3_0= ruleDSL_Expression_MultiplicationDivision ) ) )
+ // InternalSensinact.g:2456:5: otherlv_1= '+' () ( (lv_right_3_0= ruleDSL_Expression_MultiplicationDivision ) )
+ {
+ otherlv_1=(Token)match(input,48,FOLLOW_14);
+
+ newLeafNode(otherlv_1, grammarAccess.getDSL_Expression_PlusMinusAccess().getPlusSignKeyword_1_0_0());
+
+ // InternalSensinact.g:2460:5: ()
+ // InternalSensinact.g:2461:6:
+ {
+
+ current = forceCreateModelElementAndSet(
+ grammarAccess.getDSL_Expression_PlusMinusAccess().getDSL_Expression_PlusLeftAction_1_0_1(),
+ current);
+
+
+ }
+
+ // InternalSensinact.g:2467:5: ( (lv_right_3_0= ruleDSL_Expression_MultiplicationDivision ) )
+ // InternalSensinact.g:2468:6: (lv_right_3_0= ruleDSL_Expression_MultiplicationDivision )
+ {
+ // InternalSensinact.g:2468:6: (lv_right_3_0= ruleDSL_Expression_MultiplicationDivision )
+ // InternalSensinact.g:2469:7: lv_right_3_0= ruleDSL_Expression_MultiplicationDivision
+ {
+
+ newCompositeNode(grammarAccess.getDSL_Expression_PlusMinusAccess().getRightDSL_Expression_MultiplicationDivisionParserRuleCall_1_0_2_0());
+
+ pushFollow(FOLLOW_33);
+ lv_right_3_0=ruleDSL_Expression_MultiplicationDivision();
+
+ state._fsp--;
+
+
+ if (current==null) {
+ current = createModelElementForParent(grammarAccess.getDSL_Expression_PlusMinusRule());
+ }
+ set(
+ current,
+ "right",
+ lv_right_3_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_Expression_MultiplicationDivision");
+ afterParserOrEnumRuleCall();
+
+
+ }
+
+
+ }
+
+
+ }
+
+
+ }
+ break;
+ case 2 :
+ // InternalSensinact.g:2488:4: (otherlv_4= '-' () ( (lv_right_6_0= ruleDSL_Expression_MultiplicationDivision ) ) )
+ {
+ // InternalSensinact.g:2488:4: (otherlv_4= '-' () ( (lv_right_6_0= ruleDSL_Expression_MultiplicationDivision ) ) )
+ // InternalSensinact.g:2489:5: otherlv_4= '-' () ( (lv_right_6_0= ruleDSL_Expression_MultiplicationDivision ) )
+ {
+ otherlv_4=(Token)match(input,49,FOLLOW_14);
+
+ newLeafNode(otherlv_4, grammarAccess.getDSL_Expression_PlusMinusAccess().getHyphenMinusKeyword_1_1_0());
+
+ // InternalSensinact.g:2493:5: ()
+ // InternalSensinact.g:2494:6:
+ {
+
+ current = forceCreateModelElementAndSet(
+ grammarAccess.getDSL_Expression_PlusMinusAccess().getDSL_Expression_MinusLeftAction_1_1_1(),
+ current);
+
+
+ }
+
+ // InternalSensinact.g:2500:5: ( (lv_right_6_0= ruleDSL_Expression_MultiplicationDivision ) )
+ // InternalSensinact.g:2501:6: (lv_right_6_0= ruleDSL_Expression_MultiplicationDivision )
+ {
+ // InternalSensinact.g:2501:6: (lv_right_6_0= ruleDSL_Expression_MultiplicationDivision )
+ // InternalSensinact.g:2502:7: lv_right_6_0= ruleDSL_Expression_MultiplicationDivision
+ {
+
+ newCompositeNode(grammarAccess.getDSL_Expression_PlusMinusAccess().getRightDSL_Expression_MultiplicationDivisionParserRuleCall_1_1_2_0());
+
+ pushFollow(FOLLOW_33);
+ lv_right_6_0=ruleDSL_Expression_MultiplicationDivision();
+
+ state._fsp--;
+
+
+ if (current==null) {
+ current = createModelElementForParent(grammarAccess.getDSL_Expression_PlusMinusRule());
+ }
+ set(
+ current,
+ "right",
+ lv_right_6_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_Expression_MultiplicationDivision");
+ afterParserOrEnumRuleCall();
+
+
+ }
+
+
+ }
+
+
+ }
+
+
+ }
+ break;
+
+ default :
+ break loop22;
+ }
+ } while (true);
+
+
+ }
+
+
+ }
+
+
+ leaveRule();
+
+ }
+
+ catch (RecognitionException re) {
+ recover(input,re);
+ appendSkippedTokens();
+ }
+ finally {
+ }
+ return current;
+ }
+ // $ANTLR end "ruleDSL_Expression_PlusMinus"
+
+
+ // $ANTLR start "entryRuleDSL_Expression_MultiplicationDivision"
+ // InternalSensinact.g:2525:1: entryRuleDSL_Expression_MultiplicationDivision returns [EObject current=null] : iv_ruleDSL_Expression_MultiplicationDivision= ruleDSL_Expression_MultiplicationDivision EOF ;
+ public final EObject entryRuleDSL_Expression_MultiplicationDivision() throws RecognitionException {
+ EObject current = null;
+
+ EObject iv_ruleDSL_Expression_MultiplicationDivision = null;
+
+
+ try {
+ // InternalSensinact.g:2525:78: (iv_ruleDSL_Expression_MultiplicationDivision= ruleDSL_Expression_MultiplicationDivision EOF )
+ // InternalSensinact.g:2526:2: iv_ruleDSL_Expression_MultiplicationDivision= ruleDSL_Expression_MultiplicationDivision EOF
+ {
+ newCompositeNode(grammarAccess.getDSL_Expression_MultiplicationDivisionRule());
+ pushFollow(FOLLOW_1);
+ iv_ruleDSL_Expression_MultiplicationDivision=ruleDSL_Expression_MultiplicationDivision();
+
+ state._fsp--;
+
+ current =iv_ruleDSL_Expression_MultiplicationDivision;
+ match(input,EOF,FOLLOW_2);
+
+ }
+
+ }
+
+ catch (RecognitionException re) {
+ recover(input,re);
+ appendSkippedTokens();
+ }
+ finally {
+ }
+ return current;
+ }
+ // $ANTLR end "entryRuleDSL_Expression_MultiplicationDivision"
+
+
+ // $ANTLR start "ruleDSL_Expression_MultiplicationDivision"
+ // InternalSensinact.g:2532:1: ruleDSL_Expression_MultiplicationDivision returns [EObject current=null] : (this_DSL_Expression_Unary_0= ruleDSL_Expression_Unary ( (otherlv_1= '*' () ( (lv_right_3_0= ruleDSL_Expression_Unary ) ) ) | (otherlv_4= '/' () ( (lv_right_6_0= ruleDSL_Expression_Unary ) ) ) | (otherlv_7= '%' () ( (lv_right_9_0= ruleDSL_Expression_Unary ) ) ) )* ) ;
+ public final EObject ruleDSL_Expression_MultiplicationDivision() throws RecognitionException {
+ EObject current = null;
+
+ Token otherlv_1=null;
+ Token otherlv_4=null;
+ Token otherlv_7=null;
+ EObject this_DSL_Expression_Unary_0 = null;
+
+ EObject lv_right_3_0 = null;
+
+ EObject lv_right_6_0 = null;
+
+ EObject lv_right_9_0 = null;
+
+
+
+ enterRule();
+
+ try {
+ // InternalSensinact.g:2538:2: ( (this_DSL_Expression_Unary_0= ruleDSL_Expression_Unary ( (otherlv_1= '*' () ( (lv_right_3_0= ruleDSL_Expression_Unary ) ) ) | (otherlv_4= '/' () ( (lv_right_6_0= ruleDSL_Expression_Unary ) ) ) | (otherlv_7= '%' () ( (lv_right_9_0= ruleDSL_Expression_Unary ) ) ) )* ) )
+ // InternalSensinact.g:2539:2: (this_DSL_Expression_Unary_0= ruleDSL_Expression_Unary ( (otherlv_1= '*' () ( (lv_right_3_0= ruleDSL_Expression_Unary ) ) ) | (otherlv_4= '/' () ( (lv_right_6_0= ruleDSL_Expression_Unary ) ) ) | (otherlv_7= '%' () ( (lv_right_9_0= ruleDSL_Expression_Unary ) ) ) )* )
+ {
+ // InternalSensinact.g:2539:2: (this_DSL_Expression_Unary_0= ruleDSL_Expression_Unary ( (otherlv_1= '*' () ( (lv_right_3_0= ruleDSL_Expression_Unary ) ) ) | (otherlv_4= '/' () ( (lv_right_6_0= ruleDSL_Expression_Unary ) ) ) | (otherlv_7= '%' () ( (lv_right_9_0= ruleDSL_Expression_Unary ) ) ) )* )
+ // InternalSensinact.g:2540:3: this_DSL_Expression_Unary_0= ruleDSL_Expression_Unary ( (otherlv_1= '*' () ( (lv_right_3_0= ruleDSL_Expression_Unary ) ) ) | (otherlv_4= '/' () ( (lv_right_6_0= ruleDSL_Expression_Unary ) ) ) | (otherlv_7= '%' () ( (lv_right_9_0= ruleDSL_Expression_Unary ) ) ) )*
+ {
+
+ newCompositeNode(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getDSL_Expression_UnaryParserRuleCall_0());
+
+ pushFollow(FOLLOW_34);
+ this_DSL_Expression_Unary_0=ruleDSL_Expression_Unary();
+
+ state._fsp--;
+
+
+ current = this_DSL_Expression_Unary_0;
+ afterParserOrEnumRuleCall();
+
+ // InternalSensinact.g:2548:3: ( (otherlv_1= '*' () ( (lv_right_3_0= ruleDSL_Expression_Unary ) ) ) | (otherlv_4= '/' () ( (lv_right_6_0= ruleDSL_Expression_Unary ) ) ) | (otherlv_7= '%' () ( (lv_right_9_0= ruleDSL_Expression_Unary ) ) ) )*
+ loop23:
+ do {
+ int alt23=4;
+ switch ( input.LA(1) ) {
+ case 50:
+ {
+ alt23=1;
+ }
+ break;
+ case 15:
+ {
+ alt23=2;
+ }
+ break;
+ case 51:
+ {
+ alt23=3;
+ }
+ break;
+
+ }
+
+ switch (alt23) {
+ case 1 :
+ // InternalSensinact.g:2549:4: (otherlv_1= '*' () ( (lv_right_3_0= ruleDSL_Expression_Unary ) ) )
+ {
+ // InternalSensinact.g:2549:4: (otherlv_1= '*' () ( (lv_right_3_0= ruleDSL_Expression_Unary ) ) )
+ // InternalSensinact.g:2550:5: otherlv_1= '*' () ( (lv_right_3_0= ruleDSL_Expression_Unary ) )
+ {
+ otherlv_1=(Token)match(input,50,FOLLOW_14);
+
+ newLeafNode(otherlv_1, grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getAsteriskKeyword_1_0_0());
+
+ // InternalSensinact.g:2554:5: ()
+ // InternalSensinact.g:2555:6:
+ {
+
+ current = forceCreateModelElementAndSet(
+ grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getDSL_Expression_MultiplicationLeftAction_1_0_1(),
+ current);
+
+
+ }
+
+ // InternalSensinact.g:2561:5: ( (lv_right_3_0= ruleDSL_Expression_Unary ) )
+ // InternalSensinact.g:2562:6: (lv_right_3_0= ruleDSL_Expression_Unary )
+ {
+ // InternalSensinact.g:2562:6: (lv_right_3_0= ruleDSL_Expression_Unary )
+ // InternalSensinact.g:2563:7: lv_right_3_0= ruleDSL_Expression_Unary
+ {
+
+ newCompositeNode(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getRightDSL_Expression_UnaryParserRuleCall_1_0_2_0());
+
+ pushFollow(FOLLOW_34);
+ lv_right_3_0=ruleDSL_Expression_Unary();
+
+ state._fsp--;
+
+
+ if (current==null) {
+ current = createModelElementForParent(grammarAccess.getDSL_Expression_MultiplicationDivisionRule());
+ }
+ set(
+ current,
+ "right",
+ lv_right_3_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_Expression_Unary");
+ afterParserOrEnumRuleCall();
+
+
+ }
+
+
+ }
+
+
+ }
+
+
+ }
+ break;
+ case 2 :
+ // InternalSensinact.g:2582:4: (otherlv_4= '/' () ( (lv_right_6_0= ruleDSL_Expression_Unary ) ) )
+ {
+ // InternalSensinact.g:2582:4: (otherlv_4= '/' () ( (lv_right_6_0= ruleDSL_Expression_Unary ) ) )
+ // InternalSensinact.g:2583:5: otherlv_4= '/' () ( (lv_right_6_0= ruleDSL_Expression_Unary ) )
+ {
+ otherlv_4=(Token)match(input,15,FOLLOW_14);
+
+ newLeafNode(otherlv_4, grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getSolidusKeyword_1_1_0());
+
+ // InternalSensinact.g:2587:5: ()
+ // InternalSensinact.g:2588:6:
+ {
+
+ current = forceCreateModelElementAndSet(
+ grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getDSL_Expression_DivisionLeftAction_1_1_1(),
+ current);
+
+
+ }
+
+ // InternalSensinact.g:2594:5: ( (lv_right_6_0= ruleDSL_Expression_Unary ) )
+ // InternalSensinact.g:2595:6: (lv_right_6_0= ruleDSL_Expression_Unary )
+ {
+ // InternalSensinact.g:2595:6: (lv_right_6_0= ruleDSL_Expression_Unary )
+ // InternalSensinact.g:2596:7: lv_right_6_0= ruleDSL_Expression_Unary
+ {
+
+ newCompositeNode(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getRightDSL_Expression_UnaryParserRuleCall_1_1_2_0());
+
+ pushFollow(FOLLOW_34);
+ lv_right_6_0=ruleDSL_Expression_Unary();
+
+ state._fsp--;
+
+
+ if (current==null) {
+ current = createModelElementForParent(grammarAccess.getDSL_Expression_MultiplicationDivisionRule());
+ }
+ set(
+ current,
+ "right",
+ lv_right_6_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_Expression_Unary");
+ afterParserOrEnumRuleCall();
+
+
+ }
+
+
+ }
+
+
+ }
+
+
+ }
+ break;
+ case 3 :
+ // InternalSensinact.g:2615:4: (otherlv_7= '%' () ( (lv_right_9_0= ruleDSL_Expression_Unary ) ) )
+ {
+ // InternalSensinact.g:2615:4: (otherlv_7= '%' () ( (lv_right_9_0= ruleDSL_Expression_Unary ) ) )
+ // InternalSensinact.g:2616:5: otherlv_7= '%' () ( (lv_right_9_0= ruleDSL_Expression_Unary ) )
+ {
+ otherlv_7=(Token)match(input,51,FOLLOW_14);
+
+ newLeafNode(otherlv_7, grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getPercentSignKeyword_1_2_0());
+
+ // InternalSensinact.g:2620:5: ()
+ // InternalSensinact.g:2621:6:
+ {
+
+ current = forceCreateModelElementAndSet(
+ grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getDSL_Expression_ModuloLeftAction_1_2_1(),
+ current);
+
+
+ }
+
+ // InternalSensinact.g:2627:5: ( (lv_right_9_0= ruleDSL_Expression_Unary ) )
+ // InternalSensinact.g:2628:6: (lv_right_9_0= ruleDSL_Expression_Unary )
+ {
+ // InternalSensinact.g:2628:6: (lv_right_9_0= ruleDSL_Expression_Unary )
+ // InternalSensinact.g:2629:7: lv_right_9_0= ruleDSL_Expression_Unary
+ {
+
+ newCompositeNode(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getRightDSL_Expression_UnaryParserRuleCall_1_2_2_0());
+
+ pushFollow(FOLLOW_34);
+ lv_right_9_0=ruleDSL_Expression_Unary();
+
+ state._fsp--;
+
+
+ if (current==null) {
+ current = createModelElementForParent(grammarAccess.getDSL_Expression_MultiplicationDivisionRule());
+ }
+ set(
+ current,
+ "right",
+ lv_right_9_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_Expression_Unary");
+ afterParserOrEnumRuleCall();
+
+
+ }
+
+
+ }
+
+
+ }
+
+
+ }
+ break;
+
+ default :
+ break loop23;
+ }
+ } while (true);
+
+
+ }
+
+
+ }
+
+
+ leaveRule();
+
+ }
+
+ catch (RecognitionException re) {
+ recover(input,re);
+ appendSkippedTokens();
+ }
+ finally {
+ }
+ return current;
+ }
+ // $ANTLR end "ruleDSL_Expression_MultiplicationDivision"
+
+
+ // $ANTLR start "entryRuleDSL_Expression_Unary"
+ // InternalSensinact.g:2652:1: entryRuleDSL_Expression_Unary returns [EObject current=null] : iv_ruleDSL_Expression_Unary= ruleDSL_Expression_Unary EOF ;
+ public final EObject entryRuleDSL_Expression_Unary() throws RecognitionException {
+ EObject current = null;
+
+ EObject iv_ruleDSL_Expression_Unary = null;
+
+
+ try {
+ // InternalSensinact.g:2652:61: (iv_ruleDSL_Expression_Unary= ruleDSL_Expression_Unary EOF )
+ // InternalSensinact.g:2653:2: iv_ruleDSL_Expression_Unary= ruleDSL_Expression_Unary EOF
+ {
+ newCompositeNode(grammarAccess.getDSL_Expression_UnaryRule());
+ pushFollow(FOLLOW_1);
+ iv_ruleDSL_Expression_Unary=ruleDSL_Expression_Unary();
+
+ state._fsp--;
+
+ current =iv_ruleDSL_Expression_Unary;
+ match(input,EOF,FOLLOW_2);
+
+ }
+
+ }
+
+ catch (RecognitionException re) {
+ recover(input,re);
+ appendSkippedTokens();
+ }
+ finally {
+ }
+ return current;
+ }
+ // $ANTLR end "entryRuleDSL_Expression_Unary"
+
+
+ // $ANTLR start "ruleDSL_Expression_Unary"
+ // InternalSensinact.g:2659:1: ruleDSL_Expression_Unary returns [EObject current=null] : ( ( () ( (lv_value_1_0= ruleNUMBER ) ) ) | ( () ( (lv_value_3_0= RULE_STRING ) ) ) | ( () ( (lv_value_5_0= RULE_BOOLEAN ) ) ) | ( () ( (otherlv_7= RULE_ID ) ) otherlv_8= '.get()' ) | (otherlv_9= '(' this_DSL_Expression_Or_10= ruleDSL_Expression_Or otherlv_11= ')' ) | (otherlv_12= 'not' () ( (lv_exp_14_0= ruleDSL_Expression_Unary ) ) ) ) ;
+ public final EObject ruleDSL_Expression_Unary() throws RecognitionException {
+ EObject current = null;
+
+ Token lv_value_3_0=null;
+ Token lv_value_5_0=null;
+ Token otherlv_7=null;
+ Token otherlv_8=null;
+ Token otherlv_9=null;
+ Token otherlv_11=null;
+ Token otherlv_12=null;
+ AntlrDatatypeRuleToken lv_value_1_0 = null;
+
+ EObject this_DSL_Expression_Or_10 = null;
+
+ EObject lv_exp_14_0 = null;
+
+
+
+ enterRule();
+
+ try {
+ // InternalSensinact.g:2665:2: ( ( ( () ( (lv_value_1_0= ruleNUMBER ) ) ) | ( () ( (lv_value_3_0= RULE_STRING ) ) ) | ( () ( (lv_value_5_0= RULE_BOOLEAN ) ) ) | ( () ( (otherlv_7= RULE_ID ) ) otherlv_8= '.get()' ) | (otherlv_9= '(' this_DSL_Expression_Or_10= ruleDSL_Expression_Or otherlv_11= ')' ) | (otherlv_12= 'not' () ( (lv_exp_14_0= ruleDSL_Expression_Unary ) ) ) ) )
+ // InternalSensinact.g:2666:2: ( ( () ( (lv_value_1_0= ruleNUMBER ) ) ) | ( () ( (lv_value_3_0= RULE_STRING ) ) ) | ( () ( (lv_value_5_0= RULE_BOOLEAN ) ) ) | ( () ( (otherlv_7= RULE_ID ) ) otherlv_8= '.get()' ) | (otherlv_9= '(' this_DSL_Expression_Or_10= ruleDSL_Expression_Or otherlv_11= ')' ) | (otherlv_12= 'not' () ( (lv_exp_14_0= ruleDSL_Expression_Unary ) ) ) )
+ {
+ // InternalSensinact.g:2666:2: ( ( () ( (lv_value_1_0= ruleNUMBER ) ) ) | ( () ( (lv_value_3_0= RULE_STRING ) ) ) | ( () ( (lv_value_5_0= RULE_BOOLEAN ) ) ) | ( () ( (otherlv_7= RULE_ID ) ) otherlv_8= '.get()' ) | (otherlv_9= '(' this_DSL_Expression_Or_10= ruleDSL_Expression_Or otherlv_11= ')' ) | (otherlv_12= 'not' () ( (lv_exp_14_0= ruleDSL_Expression_Unary ) ) ) )
+ int alt24=6;
+ switch ( input.LA(1) ) {
+ case RULE_INT:
+ {
+ alt24=1;
+ }
+ break;
+ case RULE_STRING:
+ {
+ alt24=2;
+ }
+ break;
+ case RULE_BOOLEAN:
+ {
+ alt24=3;
+ }
+ break;
+ case RULE_ID:
+ {
+ alt24=4;
+ }
+ break;
+ case 26:
+ {
+ alt24=5;
+ }
+ break;
+ case 53:
+ {
+ alt24=6;
+ }
+ break;
+ default:
+ NoViableAltException nvae =
+ new NoViableAltException("", 24, 0, input);
+
+ throw nvae;
+ }
+
+ switch (alt24) {
+ case 1 :
+ // InternalSensinact.g:2667:3: ( () ( (lv_value_1_0= ruleNUMBER ) ) )
+ {
+ // InternalSensinact.g:2667:3: ( () ( (lv_value_1_0= ruleNUMBER ) ) )
+ // InternalSensinact.g:2668:4: () ( (lv_value_1_0= ruleNUMBER ) )
+ {
+ // InternalSensinact.g:2668:4: ()
+ // InternalSensinact.g:2669:5:
+ {
+
+ current = forceCreateModelElement(
+ grammarAccess.getDSL_Expression_UnaryAccess().getDSL_Object_NumberAction_0_0(),
+ current);
+
+
+ }
+
+ // InternalSensinact.g:2675:4: ( (lv_value_1_0= ruleNUMBER ) )
+ // InternalSensinact.g:2676:5: (lv_value_1_0= ruleNUMBER )
+ {
+ // InternalSensinact.g:2676:5: (lv_value_1_0= ruleNUMBER )
+ // InternalSensinact.g:2677:6: lv_value_1_0= ruleNUMBER
+ {
+
+ newCompositeNode(grammarAccess.getDSL_Expression_UnaryAccess().getValueNUMBERParserRuleCall_0_1_0());
+
+ pushFollow(FOLLOW_2);
+ lv_value_1_0=ruleNUMBER();
+
+ state._fsp--;
+
+
+ if (current==null) {
+ current = createModelElementForParent(grammarAccess.getDSL_Expression_UnaryRule());
+ }
+ set(
+ current,
+ "value",
+ lv_value_1_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.NUMBER");
+ afterParserOrEnumRuleCall();
+
+
+ }
+
+
+ }
+
+
+ }
+
+
+ }
+ break;
+ case 2 :
+ // InternalSensinact.g:2696:3: ( () ( (lv_value_3_0= RULE_STRING ) ) )
+ {
+ // InternalSensinact.g:2696:3: ( () ( (lv_value_3_0= RULE_STRING ) ) )
+ // InternalSensinact.g:2697:4: () ( (lv_value_3_0= RULE_STRING ) )
+ {
+ // InternalSensinact.g:2697:4: ()
+ // InternalSensinact.g:2698:5:
+ {
+
+ current = forceCreateModelElement(
+ grammarAccess.getDSL_Expression_UnaryAccess().getDSL_Object_StringAction_1_0(),
+ current);
+
+
+ }
+
+ // InternalSensinact.g:2704:4: ( (lv_value_3_0= RULE_STRING ) )
+ // InternalSensinact.g:2705:5: (lv_value_3_0= RULE_STRING )
+ {
+ // InternalSensinact.g:2705:5: (lv_value_3_0= RULE_STRING )
+ // InternalSensinact.g:2706:6: lv_value_3_0= RULE_STRING
+ {
+ lv_value_3_0=(Token)match(input,RULE_STRING,FOLLOW_2);
+
+ newLeafNode(lv_value_3_0, grammarAccess.getDSL_Expression_UnaryAccess().getValueSTRINGTerminalRuleCall_1_1_0());
+
+
+ if (current==null) {
+ current = createModelElement(grammarAccess.getDSL_Expression_UnaryRule());
+ }
+ setWithLastConsumed(
+ current,
+ "value",
+ lv_value_3_0,
+ "org.eclipse.xtext.common.Terminals.STRING");
+
+
+ }
+
+
+ }
+
+
+ }
+
+
+ }
+ break;
+ case 3 :
+ // InternalSensinact.g:2724:3: ( () ( (lv_value_5_0= RULE_BOOLEAN ) ) )
+ {
+ // InternalSensinact.g:2724:3: ( () ( (lv_value_5_0= RULE_BOOLEAN ) ) )
+ // InternalSensinact.g:2725:4: () ( (lv_value_5_0= RULE_BOOLEAN ) )
+ {
+ // InternalSensinact.g:2725:4: ()
+ // InternalSensinact.g:2726:5:
+ {
+
+ current = forceCreateModelElement(
+ grammarAccess.getDSL_Expression_UnaryAccess().getDSL_Object_BooleanAction_2_0(),
+ current);
+
+
+ }
+
+ // InternalSensinact.g:2732:4: ( (lv_value_5_0= RULE_BOOLEAN ) )
+ // InternalSensinact.g:2733:5: (lv_value_5_0= RULE_BOOLEAN )
+ {
+ // InternalSensinact.g:2733:5: (lv_value_5_0= RULE_BOOLEAN )
+ // InternalSensinact.g:2734:6: lv_value_5_0= RULE_BOOLEAN
+ {
+ lv_value_5_0=(Token)match(input,RULE_BOOLEAN,FOLLOW_2);
+
+ newLeafNode(lv_value_5_0, grammarAccess.getDSL_Expression_UnaryAccess().getValueBOOLEANTerminalRuleCall_2_1_0());
+
+
+ if (current==null) {
+ current = createModelElement(grammarAccess.getDSL_Expression_UnaryRule());
+ }
+ setWithLastConsumed(
+ current,
+ "value",
+ lv_value_5_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.BOOLEAN");
+
+
+ }
+
+
+ }
+
+
+ }
+
+
+ }
+ break;
+ case 4 :
+ // InternalSensinact.g:2752:3: ( () ( (otherlv_7= RULE_ID ) ) otherlv_8= '.get()' )
+ {
+ // InternalSensinact.g:2752:3: ( () ( (otherlv_7= RULE_ID ) ) otherlv_8= '.get()' )
+ // InternalSensinact.g:2753:4: () ( (otherlv_7= RULE_ID ) ) otherlv_8= '.get()'
+ {
+ // InternalSensinact.g:2753:4: ()
+ // InternalSensinact.g:2754:5:
+ {
+
+ current = forceCreateModelElement(
+ grammarAccess.getDSL_Expression_UnaryAccess().getDSL_Object_RefAction_3_0(),
+ current);
+
+
+ }
+
+ // InternalSensinact.g:2760:4: ( (otherlv_7= RULE_ID ) )
+ // InternalSensinact.g:2761:5: (otherlv_7= RULE_ID )
+ {
+ // InternalSensinact.g:2761:5: (otherlv_7= RULE_ID )
+ // InternalSensinact.g:2762:6: otherlv_7= RULE_ID
+ {
+
+ if (current==null) {
+ current = createModelElement(grammarAccess.getDSL_Expression_UnaryRule());
+ }
+
+ otherlv_7=(Token)match(input,RULE_ID,FOLLOW_35);
+
+ newLeafNode(otherlv_7, grammarAccess.getDSL_Expression_UnaryAccess().getValueDSL_REFCrossReference_3_1_0());
+
+
+ }
+
+
+ }
+
+ otherlv_8=(Token)match(input,52,FOLLOW_2);
+
+ newLeafNode(otherlv_8, grammarAccess.getDSL_Expression_UnaryAccess().getGetKeyword_3_2());
+
+
+ }
+
+
+ }
+ break;
+ case 5 :
+ // InternalSensinact.g:2779:3: (otherlv_9= '(' this_DSL_Expression_Or_10= ruleDSL_Expression_Or otherlv_11= ')' )
+ {
+ // InternalSensinact.g:2779:3: (otherlv_9= '(' this_DSL_Expression_Or_10= ruleDSL_Expression_Or otherlv_11= ')' )
+ // InternalSensinact.g:2780:4: otherlv_9= '(' this_DSL_Expression_Or_10= ruleDSL_Expression_Or otherlv_11= ')'
+ {
+ otherlv_9=(Token)match(input,26,FOLLOW_14);
+
+ newLeafNode(otherlv_9, grammarAccess.getDSL_Expression_UnaryAccess().getLeftParenthesisKeyword_4_0());
+
+
+ newCompositeNode(grammarAccess.getDSL_Expression_UnaryAccess().getDSL_Expression_OrParserRuleCall_4_1());
+
+ pushFollow(FOLLOW_21);
+ this_DSL_Expression_Or_10=ruleDSL_Expression_Or();
+
+ state._fsp--;
+
+
+ current = this_DSL_Expression_Or_10;
+ afterParserOrEnumRuleCall();
+
+ otherlv_11=(Token)match(input,27,FOLLOW_2);
+
+ newLeafNode(otherlv_11, grammarAccess.getDSL_Expression_UnaryAccess().getRightParenthesisKeyword_4_2());
+
+
+ }
+
+
+ }
+ break;
+ case 6 :
+ // InternalSensinact.g:2798:3: (otherlv_12= 'not' () ( (lv_exp_14_0= ruleDSL_Expression_Unary ) ) )
+ {
+ // InternalSensinact.g:2798:3: (otherlv_12= 'not' () ( (lv_exp_14_0= ruleDSL_Expression_Unary ) ) )
+ // InternalSensinact.g:2799:4: otherlv_12= 'not' () ( (lv_exp_14_0= ruleDSL_Expression_Unary ) )
+ {
+ otherlv_12=(Token)match(input,53,FOLLOW_14);
+
+ newLeafNode(otherlv_12, grammarAccess.getDSL_Expression_UnaryAccess().getNotKeyword_5_0());
+
+ // InternalSensinact.g:2803:4: ()
+ // InternalSensinact.g:2804:5:
+ {
+
+ current = forceCreateModelElement(
+ grammarAccess.getDSL_Expression_UnaryAccess().getDSL_Expression_NegateAction_5_1(),
+ current);
+
+
+ }
+
+ // InternalSensinact.g:2810:4: ( (lv_exp_14_0= ruleDSL_Expression_Unary ) )
+ // InternalSensinact.g:2811:5: (lv_exp_14_0= ruleDSL_Expression_Unary )
+ {
+ // InternalSensinact.g:2811:5: (lv_exp_14_0= ruleDSL_Expression_Unary )
+ // InternalSensinact.g:2812:6: lv_exp_14_0= ruleDSL_Expression_Unary
+ {
+
+ newCompositeNode(grammarAccess.getDSL_Expression_UnaryAccess().getExpDSL_Expression_UnaryParserRuleCall_5_2_0());
+
+ pushFollow(FOLLOW_2);
+ lv_exp_14_0=ruleDSL_Expression_Unary();
+
+ state._fsp--;
+
+
+ if (current==null) {
+ current = createModelElementForParent(grammarAccess.getDSL_Expression_UnaryRule());
+ }
+ set(
+ current,
+ "exp",
+ lv_exp_14_0,
+ "org.eclipse.sensinact.studio.language.Sensinact.DSL_Expression_Unary");
+ afterParserOrEnumRuleCall();
+
+
+ }
+
+
+ }
+
+
+ }
+
+
+ }
+ break;
+
+ }
+
+
+ }
+
+
+ leaveRule();
+
+ }
+
+ catch (RecognitionException re) {
+ recover(input,re);
+ appendSkippedTokens();
+ }
+ finally {
+ }
+ return current;
+ }
+ // $ANTLR end "ruleDSL_Expression_Unary"
+
+ // Delegated rules
+
+
+ protected DFA9 dfa9 = new DFA9(this);
+ protected DFA10 dfa10 = new DFA10(this);
+ static final String dfa_1s = "\10\uffff";
+ static final String dfa_2s = "\1\5\1\30\3\5\2\uffff\1\40";
+ static final String dfa_3s = "\1\5\1\45\2\33\1\5\2\uffff\1\45";
+ static final String dfa_4s = "\5\uffff\1\1\1\2\1\uffff";
+ static final String dfa_5s = "\10\uffff}>";
+ static final String[] dfa_6s = {
+ "\1\1",
+ "\1\4\7\uffff\1\3\4\uffff\1\2",
+ "\1\1\14\uffff\1\5\10\uffff\1\6",
+ "\1\1\14\uffff\1\5\10\uffff\1\6",
+ "\1\7",
+ "",
+ "",
+ "\1\3\4\uffff\1\2"
+ };
+
+ static final short[] dfa_1 = DFA.unpackEncodedString(dfa_1s);
+ static final char[] dfa_2 = DFA.unpackEncodedStringToUnsignedChars(dfa_2s);
+ static final char[] dfa_3 = DFA.unpackEncodedStringToUnsignedChars(dfa_3s);
+ static final short[] dfa_4 = DFA.unpackEncodedString(dfa_4s);
+ static final short[] dfa_5 = DFA.unpackEncodedString(dfa_5s);
+ static final short[][] dfa_6 = unpackEncodedStringArray(dfa_6s);
+
+ class DFA9 extends DFA {
+
+ public DFA9(BaseRecognizer recognizer) {
+ this.recognizer = recognizer;
+ this.decisionNumber = 9;
+ this.eot = dfa_1;
+ this.eof = dfa_1;
+ this.min = dfa_2;
+ this.max = dfa_3;
+ this.accept = dfa_4;
+ this.special = dfa_5;
+ this.transition = dfa_6;
+ }
+ public String getDescription() {
+ return "1047:3: ( ( (lv_start_6_0= ruleDSL_CEP_DURATION ) ) otherlv_7= ',' )?";
+ }
+ }
+ static final String dfa_7s = "\1\5\1\30\3\5\1\40\2\uffff";
+ static final String dfa_8s = "\1\5\1\45\1\5\2\33\1\45\2\uffff";
+ static final String dfa_9s = "\6\uffff\1\1\1\2";
+ static final String[] dfa_10s = {
+ "\1\1",
+ "\1\2\7\uffff\1\4\4\uffff\1\3",
+ "\1\5",
+ "\1\1\14\uffff\1\6\10\uffff\1\7",
+ "\1\1\14\uffff\1\6\10\uffff\1\7",
+ "\1\4\4\uffff\1\3",
+ "",
+ ""
+ };
+ static final char[] dfa_7 = DFA.unpackEncodedStringToUnsignedChars(dfa_7s);
+ static final char[] dfa_8 = DFA.unpackEncodedStringToUnsignedChars(dfa_8s);
+ static final short[] dfa_9 = DFA.unpackEncodedString(dfa_9s);
+ static final short[][] dfa_10 = unpackEncodedStringArray(dfa_10s);
+
+ class DFA10 extends DFA {
+
+ public DFA10(BaseRecognizer recognizer) {
+ this.recognizer = recognizer;
+ this.decisionNumber = 10;
+ this.eot = dfa_1;
+ this.eof = dfa_1;
+ this.min = dfa_7;
+ this.max = dfa_8;
+ this.accept = dfa_9;
+ this.special = dfa_5;
+ this.transition = dfa_10;
+ }
+ public String getDescription() {
+ return "1168:3: ( ( (lv_start_6_0= ruleDSL_CEP_DURATION ) ) otherlv_7= ',' )?";
+ }
+ }
+
+
+ public static final BitSet FOLLOW_1 = new BitSet(new long[]{0x0000000000000000L});
+ public static final BitSet FOLLOW_2 = new BitSet(new long[]{0x0000000000000002L});
+ public static final BitSet FOLLOW_3 = new BitSet(new long[]{0x0000000010021000L});
+ public static final BitSet FOLLOW_4 = new BitSet(new long[]{0x0000000010020000L});
+ public static final BitSet FOLLOW_5 = new BitSet(new long[]{0x0000000000100000L});
+ public static final BitSet FOLLOW_6 = new BitSet(new long[]{0x0000000000000010L});
+ public static final BitSet FOLLOW_7 = new BitSet(new long[]{0x0000000000002000L});
+ public static final BitSet FOLLOW_8 = new BitSet(new long[]{0x0000000000004000L});
+ public static final BitSet FOLLOW_9 = new BitSet(new long[]{0x0000000000008000L});
+ public static final BitSet FOLLOW_10 = new BitSet(new long[]{0x0000000000010000L});
+ public static final BitSet FOLLOW_11 = new BitSet(new long[]{0x0000000000040002L});
+ public static final BitSet FOLLOW_12 = new BitSet(new long[]{0x0000000000C80000L});
+ public static final BitSet FOLLOW_13 = new BitSet(new long[]{0x0000000000080000L});
+ public static final BitSet FOLLOW_14 = new BitSet(new long[]{0x00200000040000F0L});
+ public static final BitSet FOLLOW_15 = new BitSet(new long[]{0x0000000000200000L});
+ public static final BitSet FOLLOW_16 = new BitSet(new long[]{0x0000000001000000L});
+ public static final BitSet FOLLOW_17 = new BitSet(new long[]{0x0000000000000020L});
+ public static final BitSet FOLLOW_18 = new BitSet(new long[]{0x0000000001000002L});
+ public static final BitSet FOLLOW_19 = new BitSet(new long[]{0x0000000002000000L});
+ public static final BitSet FOLLOW_20 = new BitSet(new long[]{0x0000000004000000L});
+ public static final BitSet FOLLOW_21 = new BitSet(new long[]{0x0000000008000000L});
+ public static final BitSet FOLLOW_22 = new BitSet(new long[]{0x0000001FE0000000L});
+ public static final BitSet FOLLOW_23 = new BitSet(new long[]{0x0000000000040000L});
+ public static final BitSet FOLLOW_24 = new BitSet(new long[]{0x0000000000000022L});
+ public static final BitSet FOLLOW_25 = new BitSet(new long[]{0x0000000100000000L});
+ public static final BitSet FOLLOW_26 = new BitSet(new long[]{0x0000002000000000L});
+ public static final BitSet FOLLOW_27 = new BitSet(new long[]{0x000000C000000000L});
+ public static final BitSet FOLLOW_28 = new BitSet(new long[]{0x002000000C0000F0L});
+ public static final BitSet FOLLOW_29 = new BitSet(new long[]{0x0000010000000002L});
+ public static final BitSet FOLLOW_30 = new BitSet(new long[]{0x0000020000000002L});
+ public static final BitSet FOLLOW_31 = new BitSet(new long[]{0x00000C0000000002L});
+ public static final BitSet FOLLOW_32 = new BitSet(new long[]{0x0000F00000000002L});
+ public static final BitSet FOLLOW_33 = new BitSet(new long[]{0x0003000000000002L});
+ public static final BitSet FOLLOW_34 = new BitSet(new long[]{0x000C000000008002L});
+ public static final BitSet FOLLOW_35 = new BitSet(new long[]{0x0010000000000000L});
+
+}
\ No newline at end of file
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/scoping/AbstractSensinactScopeProvider.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/scoping/AbstractSensinactScopeProvider.java
new file mode 100644
index 0000000..2f96a66
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/scoping/AbstractSensinactScopeProvider.java
@@ -0,0 +1,19 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/*
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.scoping;
+
+import org.eclipse.xtext.scoping.impl.DelegatingScopeProvider;
+
+public abstract class AbstractSensinactScopeProvider extends DelegatingScopeProvider {
+}
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_CEP_AFTER.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_CEP_AFTER.java
new file mode 100644
index 0000000..0549660
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_CEP_AFTER.java
@@ -0,0 +1,143 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>DSL CEP AFTER</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_AFTER#getRef1 <em>Ref1</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_AFTER#getRef2 <em>Ref2</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_AFTER#getStart <em>Start</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_AFTER#getEnd <em>End</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_CEP_AFTER()
+ * @model
+ * @generated
+ */
+public interface DSL_CEP_AFTER extends EObject
+{
+ /**
+ * Returns the value of the '<em><b>Ref1</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Ref1</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>Ref1</em>' containment reference.
+ * @see #setRef1(DSL_REF_CONDITION)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_CEP_AFTER_Ref1()
+ * @model containment="true"
+ * @generated
+ */
+ DSL_REF_CONDITION getRef1();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_AFTER#getRef1 <em>Ref1</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Ref1</em>' containment reference.
+ * @see #getRef1()
+ * @generated
+ */
+ void setRef1(DSL_REF_CONDITION value);
+
+ /**
+ * Returns the value of the '<em><b>Ref2</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Ref2</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>Ref2</em>' containment reference.
+ * @see #setRef2(DSL_REF_CONDITION)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_CEP_AFTER_Ref2()
+ * @model containment="true"
+ * @generated
+ */
+ DSL_REF_CONDITION getRef2();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_AFTER#getRef2 <em>Ref2</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Ref2</em>' containment reference.
+ * @see #getRef2()
+ * @generated
+ */
+ void setRef2(DSL_REF_CONDITION value);
+
+ /**
+ * Returns the value of the '<em><b>Start</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Start</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>Start</em>' containment reference.
+ * @see #setStart(DSL_CEP_DURATION)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_CEP_AFTER_Start()
+ * @model containment="true"
+ * @generated
+ */
+ DSL_CEP_DURATION getStart();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_AFTER#getStart <em>Start</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Start</em>' containment reference.
+ * @see #getStart()
+ * @generated
+ */
+ void setStart(DSL_CEP_DURATION value);
+
+ /**
+ * Returns the value of the '<em><b>End</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>End</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>End</em>' containment reference.
+ * @see #setEnd(DSL_CEP_DURATION)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_CEP_AFTER_End()
+ * @model containment="true"
+ * @generated
+ */
+ DSL_CEP_DURATION getEnd();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_AFTER#getEnd <em>End</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>End</em>' containment reference.
+ * @see #getEnd()
+ * @generated
+ */
+ void setEnd(DSL_CEP_DURATION value);
+
+} // DSL_CEP_AFTER
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_CEP_AVG.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_CEP_AVG.java
new file mode 100644
index 0000000..aef02c4
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_CEP_AVG.java
@@ -0,0 +1,89 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>DSL CEP AVG</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_AVG#getRef <em>Ref</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_AVG#getWindow <em>Window</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_CEP_AVG()
+ * @model
+ * @generated
+ */
+public interface DSL_CEP_AVG extends EObject
+{
+ /**
+ * Returns the value of the '<em><b>Ref</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Ref</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>Ref</em>' containment reference.
+ * @see #setRef(DSL_REF_CONDITION)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_CEP_AVG_Ref()
+ * @model containment="true"
+ * @generated
+ */
+ DSL_REF_CONDITION getRef();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_AVG#getRef <em>Ref</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Ref</em>' containment reference.
+ * @see #getRef()
+ * @generated
+ */
+ void setRef(DSL_REF_CONDITION value);
+
+ /**
+ * Returns the value of the '<em><b>Window</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Window</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>Window</em>' containment reference.
+ * @see #setWindow(DSL_CEP_DURATION)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_CEP_AVG_Window()
+ * @model containment="true"
+ * @generated
+ */
+ DSL_CEP_DURATION getWindow();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_AVG#getWindow <em>Window</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Window</em>' containment reference.
+ * @see #getWindow()
+ * @generated
+ */
+ void setWindow(DSL_CEP_DURATION value);
+
+} // DSL_CEP_AVG
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_CEP_BEFORE.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_CEP_BEFORE.java
new file mode 100644
index 0000000..5a9c187
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_CEP_BEFORE.java
@@ -0,0 +1,143 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>DSL CEP BEFORE</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_BEFORE#getRef1 <em>Ref1</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_BEFORE#getRef2 <em>Ref2</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_BEFORE#getStart <em>Start</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_BEFORE#getEnd <em>End</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_CEP_BEFORE()
+ * @model
+ * @generated
+ */
+public interface DSL_CEP_BEFORE extends EObject
+{
+ /**
+ * Returns the value of the '<em><b>Ref1</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Ref1</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>Ref1</em>' containment reference.
+ * @see #setRef1(DSL_REF_CONDITION)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_CEP_BEFORE_Ref1()
+ * @model containment="true"
+ * @generated
+ */
+ DSL_REF_CONDITION getRef1();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_BEFORE#getRef1 <em>Ref1</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Ref1</em>' containment reference.
+ * @see #getRef1()
+ * @generated
+ */
+ void setRef1(DSL_REF_CONDITION value);
+
+ /**
+ * Returns the value of the '<em><b>Ref2</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Ref2</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>Ref2</em>' containment reference.
+ * @see #setRef2(DSL_REF_CONDITION)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_CEP_BEFORE_Ref2()
+ * @model containment="true"
+ * @generated
+ */
+ DSL_REF_CONDITION getRef2();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_BEFORE#getRef2 <em>Ref2</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Ref2</em>' containment reference.
+ * @see #getRef2()
+ * @generated
+ */
+ void setRef2(DSL_REF_CONDITION value);
+
+ /**
+ * Returns the value of the '<em><b>Start</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Start</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>Start</em>' containment reference.
+ * @see #setStart(DSL_CEP_DURATION)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_CEP_BEFORE_Start()
+ * @model containment="true"
+ * @generated
+ */
+ DSL_CEP_DURATION getStart();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_BEFORE#getStart <em>Start</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Start</em>' containment reference.
+ * @see #getStart()
+ * @generated
+ */
+ void setStart(DSL_CEP_DURATION value);
+
+ /**
+ * Returns the value of the '<em><b>End</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>End</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>End</em>' containment reference.
+ * @see #setEnd(DSL_CEP_DURATION)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_CEP_BEFORE_End()
+ * @model containment="true"
+ * @generated
+ */
+ DSL_CEP_DURATION getEnd();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_BEFORE#getEnd <em>End</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>End</em>' containment reference.
+ * @see #getEnd()
+ * @generated
+ */
+ void setEnd(DSL_CEP_DURATION value);
+
+} // DSL_CEP_BEFORE
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_CEP_COINCIDE.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_CEP_COINCIDE.java
new file mode 100644
index 0000000..cc2ebd0
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_CEP_COINCIDE.java
@@ -0,0 +1,116 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>DSL CEP COINCIDE</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_COINCIDE#getRef1 <em>Ref1</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_COINCIDE#getRef2 <em>Ref2</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_COINCIDE#getWindow <em>Window</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_CEP_COINCIDE()
+ * @model
+ * @generated
+ */
+public interface DSL_CEP_COINCIDE extends EObject
+{
+ /**
+ * Returns the value of the '<em><b>Ref1</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Ref1</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>Ref1</em>' containment reference.
+ * @see #setRef1(DSL_REF_CONDITION)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_CEP_COINCIDE_Ref1()
+ * @model containment="true"
+ * @generated
+ */
+ DSL_REF_CONDITION getRef1();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_COINCIDE#getRef1 <em>Ref1</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Ref1</em>' containment reference.
+ * @see #getRef1()
+ * @generated
+ */
+ void setRef1(DSL_REF_CONDITION value);
+
+ /**
+ * Returns the value of the '<em><b>Ref2</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Ref2</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>Ref2</em>' containment reference.
+ * @see #setRef2(DSL_REF_CONDITION)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_CEP_COINCIDE_Ref2()
+ * @model containment="true"
+ * @generated
+ */
+ DSL_REF_CONDITION getRef2();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_COINCIDE#getRef2 <em>Ref2</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Ref2</em>' containment reference.
+ * @see #getRef2()
+ * @generated
+ */
+ void setRef2(DSL_REF_CONDITION value);
+
+ /**
+ * Returns the value of the '<em><b>Window</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Window</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>Window</em>' containment reference.
+ * @see #setWindow(DSL_CEP_DURATION)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_CEP_COINCIDE_Window()
+ * @model containment="true"
+ * @generated
+ */
+ DSL_CEP_DURATION getWindow();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_COINCIDE#getWindow <em>Window</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Window</em>' containment reference.
+ * @see #getWindow()
+ * @generated
+ */
+ void setWindow(DSL_CEP_DURATION value);
+
+} // DSL_CEP_COINCIDE
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_CEP_COUNT.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_CEP_COUNT.java
new file mode 100644
index 0000000..2f2a578
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_CEP_COUNT.java
@@ -0,0 +1,89 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>DSL CEP COUNT</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_COUNT#getRef <em>Ref</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_COUNT#getWindow <em>Window</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_CEP_COUNT()
+ * @model
+ * @generated
+ */
+public interface DSL_CEP_COUNT extends EObject
+{
+ /**
+ * Returns the value of the '<em><b>Ref</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Ref</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>Ref</em>' containment reference.
+ * @see #setRef(DSL_REF_CONDITION)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_CEP_COUNT_Ref()
+ * @model containment="true"
+ * @generated
+ */
+ DSL_REF_CONDITION getRef();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_COUNT#getRef <em>Ref</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Ref</em>' containment reference.
+ * @see #getRef()
+ * @generated
+ */
+ void setRef(DSL_REF_CONDITION value);
+
+ /**
+ * Returns the value of the '<em><b>Window</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Window</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>Window</em>' containment reference.
+ * @see #setWindow(DSL_CEP_DURATION)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_CEP_COUNT_Window()
+ * @model containment="true"
+ * @generated
+ */
+ DSL_CEP_DURATION getWindow();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_COUNT#getWindow <em>Window</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Window</em>' containment reference.
+ * @see #getWindow()
+ * @generated
+ */
+ void setWindow(DSL_CEP_DURATION value);
+
+} // DSL_CEP_COUNT
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_CEP_DURATION.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_CEP_DURATION.java
new file mode 100644
index 0000000..a9153f7
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_CEP_DURATION.java
@@ -0,0 +1,54 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>DSL CEP DURATION</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_DURATION#getUnits <em>Units</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_CEP_DURATION()
+ * @model
+ * @generated
+ */
+public interface DSL_CEP_DURATION extends EObject
+{
+ /**
+ * Returns the value of the '<em><b>Units</b></em>' containment reference list.
+ * The list contents are of type {@link org.eclipse.emf.ecore.EObject}.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Units</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>Units</em>' containment reference list.
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_CEP_DURATION_Units()
+ * @model containment="true"
+ * @generated
+ */
+ EList<EObject> getUnits();
+
+} // DSL_CEP_DURATION
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_CEP_DURATION_MIN.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_CEP_DURATION_MIN.java
new file mode 100644
index 0000000..782850c
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_CEP_DURATION_MIN.java
@@ -0,0 +1,64 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact;
+
+import java.math.BigDecimal;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>DSL CEP DURATION MIN</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_DURATION_MIN#getMin <em>Min</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_CEP_DURATION_MIN()
+ * @model
+ * @generated
+ */
+public interface DSL_CEP_DURATION_MIN extends EObject
+{
+ /**
+ * Returns the value of the '<em><b>Min</b></em>' attribute.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Min</em>' attribute isn't clear,
+ * there really should be more of a description here...
+ * </p>
+ * <!-- end-user-doc -->
+ * @return the value of the '<em>Min</em>' attribute.
+ * @see #setMin(BigDecimal)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_CEP_DURATION_MIN_Min()
+ * @model
+ * @generated
+ */
+ BigDecimal getMin();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_DURATION_MIN#getMin <em>Min</em>}' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Min</em>' attribute.
+ * @see #getMin()
+ * @generated
+ */
+ void setMin(BigDecimal value);
+
+} // DSL_CEP_DURATION_MIN
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_CEP_DURATION_SEC.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_CEP_DURATION_SEC.java
new file mode 100644
index 0000000..384e007
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_CEP_DURATION_SEC.java
@@ -0,0 +1,64 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact;
+
+import java.math.BigDecimal;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>DSL CEP DURATION SEC</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_DURATION_SEC#getSec <em>Sec</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_CEP_DURATION_SEC()
+ * @model
+ * @generated
+ */
+public interface DSL_CEP_DURATION_SEC extends EObject
+{
+ /**
+ * Returns the value of the '<em><b>Sec</b></em>' attribute.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Sec</em>' attribute isn't clear,
+ * there really should be more of a description here...
+ * </p>
+ * <!-- end-user-doc -->
+ * @return the value of the '<em>Sec</em>' attribute.
+ * @see #setSec(BigDecimal)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_CEP_DURATION_SEC_Sec()
+ * @model
+ * @generated
+ */
+ BigDecimal getSec();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_DURATION_SEC#getSec <em>Sec</em>}' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Sec</em>' attribute.
+ * @see #getSec()
+ * @generated
+ */
+ void setSec(BigDecimal value);
+
+} // DSL_CEP_DURATION_SEC
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_CEP_MAX.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_CEP_MAX.java
new file mode 100644
index 0000000..ada0809
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_CEP_MAX.java
@@ -0,0 +1,89 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>DSL CEP MAX</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_MAX#getRef <em>Ref</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_MAX#getWindow <em>Window</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_CEP_MAX()
+ * @model
+ * @generated
+ */
+public interface DSL_CEP_MAX extends EObject
+{
+ /**
+ * Returns the value of the '<em><b>Ref</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Ref</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>Ref</em>' containment reference.
+ * @see #setRef(DSL_REF_CONDITION)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_CEP_MAX_Ref()
+ * @model containment="true"
+ * @generated
+ */
+ DSL_REF_CONDITION getRef();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_MAX#getRef <em>Ref</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Ref</em>' containment reference.
+ * @see #getRef()
+ * @generated
+ */
+ void setRef(DSL_REF_CONDITION value);
+
+ /**
+ * Returns the value of the '<em><b>Window</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Window</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>Window</em>' containment reference.
+ * @see #setWindow(DSL_CEP_DURATION)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_CEP_MAX_Window()
+ * @model containment="true"
+ * @generated
+ */
+ DSL_CEP_DURATION getWindow();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_MAX#getWindow <em>Window</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Window</em>' containment reference.
+ * @see #getWindow()
+ * @generated
+ */
+ void setWindow(DSL_CEP_DURATION value);
+
+} // DSL_CEP_MAX
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_CEP_MIN.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_CEP_MIN.java
new file mode 100644
index 0000000..31dafbb
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_CEP_MIN.java
@@ -0,0 +1,89 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>DSL CEP MIN</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_MIN#getRef <em>Ref</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_MIN#getWindow <em>Window</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_CEP_MIN()
+ * @model
+ * @generated
+ */
+public interface DSL_CEP_MIN extends EObject
+{
+ /**
+ * Returns the value of the '<em><b>Ref</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Ref</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>Ref</em>' containment reference.
+ * @see #setRef(DSL_REF_CONDITION)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_CEP_MIN_Ref()
+ * @model containment="true"
+ * @generated
+ */
+ DSL_REF_CONDITION getRef();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_MIN#getRef <em>Ref</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Ref</em>' containment reference.
+ * @see #getRef()
+ * @generated
+ */
+ void setRef(DSL_REF_CONDITION value);
+
+ /**
+ * Returns the value of the '<em><b>Window</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Window</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>Window</em>' containment reference.
+ * @see #setWindow(DSL_CEP_DURATION)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_CEP_MIN_Window()
+ * @model containment="true"
+ * @generated
+ */
+ DSL_CEP_DURATION getWindow();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_MIN#getWindow <em>Window</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Window</em>' containment reference.
+ * @see #getWindow()
+ * @generated
+ */
+ void setWindow(DSL_CEP_DURATION value);
+
+} // DSL_CEP_MIN
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_CEP_STATEMENT.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_CEP_STATEMENT.java
new file mode 100644
index 0000000..1e14c31
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_CEP_STATEMENT.java
@@ -0,0 +1,62 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>DSL CEP STATEMENT</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_STATEMENT#getOperation <em>Operation</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_CEP_STATEMENT()
+ * @model
+ * @generated
+ */
+public interface DSL_CEP_STATEMENT extends DSL_REF
+{
+ /**
+ * Returns the value of the '<em><b>Operation</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Operation</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>Operation</em>' containment reference.
+ * @see #setOperation(EObject)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_CEP_STATEMENT_Operation()
+ * @model containment="true"
+ * @generated
+ */
+ EObject getOperation();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_STATEMENT#getOperation <em>Operation</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Operation</em>' containment reference.
+ * @see #getOperation()
+ * @generated
+ */
+ void setOperation(EObject value);
+
+} // DSL_CEP_STATEMENT
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_CEP_SUM.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_CEP_SUM.java
new file mode 100644
index 0000000..27934ad
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_CEP_SUM.java
@@ -0,0 +1,89 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>DSL CEP SUM</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_SUM#getRef <em>Ref</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_SUM#getWindow <em>Window</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_CEP_SUM()
+ * @model
+ * @generated
+ */
+public interface DSL_CEP_SUM extends EObject
+{
+ /**
+ * Returns the value of the '<em><b>Ref</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Ref</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>Ref</em>' containment reference.
+ * @see #setRef(DSL_REF_CONDITION)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_CEP_SUM_Ref()
+ * @model containment="true"
+ * @generated
+ */
+ DSL_REF_CONDITION getRef();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_SUM#getRef <em>Ref</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Ref</em>' containment reference.
+ * @see #getRef()
+ * @generated
+ */
+ void setRef(DSL_REF_CONDITION value);
+
+ /**
+ * Returns the value of the '<em><b>Window</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Window</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>Window</em>' containment reference.
+ * @see #setWindow(DSL_CEP_DURATION)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_CEP_SUM_Window()
+ * @model containment="true"
+ * @generated
+ */
+ DSL_CEP_DURATION getWindow();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_SUM#getWindow <em>Window</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Window</em>' containment reference.
+ * @see #getWindow()
+ * @generated
+ */
+ void setWindow(DSL_CEP_DURATION value);
+
+} // DSL_CEP_SUM
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_ECA_STATEMENT.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_ECA_STATEMENT.java
new file mode 100644
index 0000000..727e8a7
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_ECA_STATEMENT.java
@@ -0,0 +1,108 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>DSL ECA STATEMENT</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_ECA_STATEMENT#getIfdo <em>Ifdo</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_ECA_STATEMENT#getElseIfdo <em>Else Ifdo</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_ECA_STATEMENT#getElsedo <em>Elsedo</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_ECA_STATEMENT()
+ * @model
+ * @generated
+ */
+public interface DSL_ECA_STATEMENT extends EObject
+{
+ /**
+ * Returns the value of the '<em><b>Ifdo</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Ifdo</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>Ifdo</em>' containment reference.
+ * @see #setIfdo(DSL_IfDo)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_ECA_STATEMENT_Ifdo()
+ * @model containment="true"
+ * @generated
+ */
+ DSL_IfDo getIfdo();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_ECA_STATEMENT#getIfdo <em>Ifdo</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Ifdo</em>' containment reference.
+ * @see #getIfdo()
+ * @generated
+ */
+ void setIfdo(DSL_IfDo value);
+
+ /**
+ * Returns the value of the '<em><b>Else Ifdo</b></em>' containment reference list.
+ * The list contents are of type {@link org.eclipse.sensinact.studio.language.sensinact.DSL_ElseIfDo}.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Else Ifdo</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>Else Ifdo</em>' containment reference list.
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_ECA_STATEMENT_ElseIfdo()
+ * @model containment="true"
+ * @generated
+ */
+ EList<DSL_ElseIfDo> getElseIfdo();
+
+ /**
+ * Returns the value of the '<em><b>Elsedo</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Elsedo</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>Elsedo</em>' containment reference.
+ * @see #setElsedo(DSL_ElseDo)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_ECA_STATEMENT_Elsedo()
+ * @model containment="true"
+ * @generated
+ */
+ DSL_ElseDo getElsedo();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_ECA_STATEMENT#getElsedo <em>Elsedo</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Elsedo</em>' containment reference.
+ * @see #getElsedo()
+ * @generated
+ */
+ void setElsedo(DSL_ElseDo value);
+
+} // DSL_ECA_STATEMENT
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_ElseDo.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_ElseDo.java
new file mode 100644
index 0000000..f9b1fda
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_ElseDo.java
@@ -0,0 +1,62 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>DSL Else Do</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_ElseDo#getActions <em>Actions</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_ElseDo()
+ * @model
+ * @generated
+ */
+public interface DSL_ElseDo extends EObject
+{
+ /**
+ * Returns the value of the '<em><b>Actions</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Actions</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>Actions</em>' containment reference.
+ * @see #setActions(DSL_ListActions)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_ElseDo_Actions()
+ * @model containment="true"
+ * @generated
+ */
+ DSL_ListActions getActions();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_ElseDo#getActions <em>Actions</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Actions</em>' containment reference.
+ * @see #getActions()
+ * @generated
+ */
+ void setActions(DSL_ListActions value);
+
+} // DSL_ElseDo
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_ElseIfDo.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_ElseIfDo.java
new file mode 100644
index 0000000..052ea3b
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_ElseIfDo.java
@@ -0,0 +1,89 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>DSL Else If Do</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_ElseIfDo#getCondition <em>Condition</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_ElseIfDo#getActions <em>Actions</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_ElseIfDo()
+ * @model
+ * @generated
+ */
+public interface DSL_ElseIfDo extends EObject
+{
+ /**
+ * Returns the value of the '<em><b>Condition</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Condition</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>Condition</em>' containment reference.
+ * @see #setCondition(DSL_Expression)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_ElseIfDo_Condition()
+ * @model containment="true"
+ * @generated
+ */
+ DSL_Expression getCondition();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_ElseIfDo#getCondition <em>Condition</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Condition</em>' containment reference.
+ * @see #getCondition()
+ * @generated
+ */
+ void setCondition(DSL_Expression value);
+
+ /**
+ * Returns the value of the '<em><b>Actions</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Actions</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>Actions</em>' containment reference.
+ * @see #setActions(DSL_ListActions)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_ElseIfDo_Actions()
+ * @model containment="true"
+ * @generated
+ */
+ DSL_ListActions getActions();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_ElseIfDo#getActions <em>Actions</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Actions</em>' containment reference.
+ * @see #getActions()
+ * @generated
+ */
+ void setActions(DSL_ListActions value);
+
+} // DSL_ElseIfDo
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_Expression.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_Expression.java
new file mode 100644
index 0000000..0ab9c5f
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_Expression.java
@@ -0,0 +1,30 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>DSL Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_Expression()
+ * @model
+ * @generated
+ */
+public interface DSL_Expression extends EObject
+{
+} // DSL_Expression
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_Expression_And.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_Expression_And.java
new file mode 100644
index 0000000..c12f307
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_Expression_And.java
@@ -0,0 +1,88 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>DSL Expression And</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_And#getLeft <em>Left</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_And#getRight <em>Right</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_Expression_And()
+ * @model
+ * @generated
+ */
+public interface DSL_Expression_And extends DSL_Expression
+{
+ /**
+ * Returns the value of the '<em><b>Left</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Left</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>Left</em>' containment reference.
+ * @see #setLeft(DSL_Expression)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_Expression_And_Left()
+ * @model containment="true"
+ * @generated
+ */
+ DSL_Expression getLeft();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_And#getLeft <em>Left</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Left</em>' containment reference.
+ * @see #getLeft()
+ * @generated
+ */
+ void setLeft(DSL_Expression value);
+
+ /**
+ * Returns the value of the '<em><b>Right</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Right</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>Right</em>' containment reference.
+ * @see #setRight(DSL_Expression)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_Expression_And_Right()
+ * @model containment="true"
+ * @generated
+ */
+ DSL_Expression getRight();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_And#getRight <em>Right</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Right</em>' containment reference.
+ * @see #getRight()
+ * @generated
+ */
+ void setRight(DSL_Expression value);
+
+} // DSL_Expression_And
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_Expression_Diff.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_Expression_Diff.java
new file mode 100644
index 0000000..3ea32d1
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_Expression_Diff.java
@@ -0,0 +1,88 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>DSL Expression Diff</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Diff#getLeft <em>Left</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Diff#getRight <em>Right</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_Expression_Diff()
+ * @model
+ * @generated
+ */
+public interface DSL_Expression_Diff extends DSL_Expression
+{
+ /**
+ * Returns the value of the '<em><b>Left</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Left</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>Left</em>' containment reference.
+ * @see #setLeft(DSL_Expression)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_Expression_Diff_Left()
+ * @model containment="true"
+ * @generated
+ */
+ DSL_Expression getLeft();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Diff#getLeft <em>Left</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Left</em>' containment reference.
+ * @see #getLeft()
+ * @generated
+ */
+ void setLeft(DSL_Expression value);
+
+ /**
+ * Returns the value of the '<em><b>Right</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Right</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>Right</em>' containment reference.
+ * @see #setRight(DSL_Expression)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_Expression_Diff_Right()
+ * @model containment="true"
+ * @generated
+ */
+ DSL_Expression getRight();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Diff#getRight <em>Right</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Right</em>' containment reference.
+ * @see #getRight()
+ * @generated
+ */
+ void setRight(DSL_Expression value);
+
+} // DSL_Expression_Diff
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_Expression_Division.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_Expression_Division.java
new file mode 100644
index 0000000..d10ca13
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_Expression_Division.java
@@ -0,0 +1,88 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>DSL Expression Division</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Division#getLeft <em>Left</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Division#getRight <em>Right</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_Expression_Division()
+ * @model
+ * @generated
+ */
+public interface DSL_Expression_Division extends DSL_Expression
+{
+ /**
+ * Returns the value of the '<em><b>Left</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Left</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>Left</em>' containment reference.
+ * @see #setLeft(DSL_Expression)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_Expression_Division_Left()
+ * @model containment="true"
+ * @generated
+ */
+ DSL_Expression getLeft();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Division#getLeft <em>Left</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Left</em>' containment reference.
+ * @see #getLeft()
+ * @generated
+ */
+ void setLeft(DSL_Expression value);
+
+ /**
+ * Returns the value of the '<em><b>Right</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Right</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>Right</em>' containment reference.
+ * @see #setRight(DSL_Expression)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_Expression_Division_Right()
+ * @model containment="true"
+ * @generated
+ */
+ DSL_Expression getRight();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Division#getRight <em>Right</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Right</em>' containment reference.
+ * @see #getRight()
+ * @generated
+ */
+ void setRight(DSL_Expression value);
+
+} // DSL_Expression_Division
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_Expression_Equal.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_Expression_Equal.java
new file mode 100644
index 0000000..55e4867
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_Expression_Equal.java
@@ -0,0 +1,88 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>DSL Expression Equal</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Equal#getLeft <em>Left</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Equal#getRight <em>Right</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_Expression_Equal()
+ * @model
+ * @generated
+ */
+public interface DSL_Expression_Equal extends DSL_Expression
+{
+ /**
+ * Returns the value of the '<em><b>Left</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Left</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>Left</em>' containment reference.
+ * @see #setLeft(DSL_Expression)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_Expression_Equal_Left()
+ * @model containment="true"
+ * @generated
+ */
+ DSL_Expression getLeft();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Equal#getLeft <em>Left</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Left</em>' containment reference.
+ * @see #getLeft()
+ * @generated
+ */
+ void setLeft(DSL_Expression value);
+
+ /**
+ * Returns the value of the '<em><b>Right</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Right</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>Right</em>' containment reference.
+ * @see #setRight(DSL_Expression)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_Expression_Equal_Right()
+ * @model containment="true"
+ * @generated
+ */
+ DSL_Expression getRight();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Equal#getRight <em>Right</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Right</em>' containment reference.
+ * @see #getRight()
+ * @generated
+ */
+ void setRight(DSL_Expression value);
+
+} // DSL_Expression_Equal
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_Expression_Larger.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_Expression_Larger.java
new file mode 100644
index 0000000..902c3bc
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_Expression_Larger.java
@@ -0,0 +1,88 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>DSL Expression Larger</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Larger#getLeft <em>Left</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Larger#getRight <em>Right</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_Expression_Larger()
+ * @model
+ * @generated
+ */
+public interface DSL_Expression_Larger extends DSL_Expression
+{
+ /**
+ * Returns the value of the '<em><b>Left</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Left</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>Left</em>' containment reference.
+ * @see #setLeft(DSL_Expression)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_Expression_Larger_Left()
+ * @model containment="true"
+ * @generated
+ */
+ DSL_Expression getLeft();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Larger#getLeft <em>Left</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Left</em>' containment reference.
+ * @see #getLeft()
+ * @generated
+ */
+ void setLeft(DSL_Expression value);
+
+ /**
+ * Returns the value of the '<em><b>Right</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Right</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>Right</em>' containment reference.
+ * @see #setRight(DSL_Expression)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_Expression_Larger_Right()
+ * @model containment="true"
+ * @generated
+ */
+ DSL_Expression getRight();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Larger#getRight <em>Right</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Right</em>' containment reference.
+ * @see #getRight()
+ * @generated
+ */
+ void setRight(DSL_Expression value);
+
+} // DSL_Expression_Larger
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_Expression_Larger_Equal.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_Expression_Larger_Equal.java
new file mode 100644
index 0000000..e8cc90c
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_Expression_Larger_Equal.java
@@ -0,0 +1,88 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>DSL Expression Larger Equal</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Larger_Equal#getLeft <em>Left</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Larger_Equal#getRight <em>Right</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_Expression_Larger_Equal()
+ * @model
+ * @generated
+ */
+public interface DSL_Expression_Larger_Equal extends DSL_Expression
+{
+ /**
+ * Returns the value of the '<em><b>Left</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Left</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>Left</em>' containment reference.
+ * @see #setLeft(DSL_Expression)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_Expression_Larger_Equal_Left()
+ * @model containment="true"
+ * @generated
+ */
+ DSL_Expression getLeft();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Larger_Equal#getLeft <em>Left</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Left</em>' containment reference.
+ * @see #getLeft()
+ * @generated
+ */
+ void setLeft(DSL_Expression value);
+
+ /**
+ * Returns the value of the '<em><b>Right</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Right</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>Right</em>' containment reference.
+ * @see #setRight(DSL_Expression)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_Expression_Larger_Equal_Right()
+ * @model containment="true"
+ * @generated
+ */
+ DSL_Expression getRight();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Larger_Equal#getRight <em>Right</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Right</em>' containment reference.
+ * @see #getRight()
+ * @generated
+ */
+ void setRight(DSL_Expression value);
+
+} // DSL_Expression_Larger_Equal
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_Expression_Minus.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_Expression_Minus.java
new file mode 100644
index 0000000..5784fdd
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_Expression_Minus.java
@@ -0,0 +1,88 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>DSL Expression Minus</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Minus#getLeft <em>Left</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Minus#getRight <em>Right</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_Expression_Minus()
+ * @model
+ * @generated
+ */
+public interface DSL_Expression_Minus extends DSL_Expression
+{
+ /**
+ * Returns the value of the '<em><b>Left</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Left</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>Left</em>' containment reference.
+ * @see #setLeft(DSL_Expression)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_Expression_Minus_Left()
+ * @model containment="true"
+ * @generated
+ */
+ DSL_Expression getLeft();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Minus#getLeft <em>Left</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Left</em>' containment reference.
+ * @see #getLeft()
+ * @generated
+ */
+ void setLeft(DSL_Expression value);
+
+ /**
+ * Returns the value of the '<em><b>Right</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Right</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>Right</em>' containment reference.
+ * @see #setRight(DSL_Expression)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_Expression_Minus_Right()
+ * @model containment="true"
+ * @generated
+ */
+ DSL_Expression getRight();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Minus#getRight <em>Right</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Right</em>' containment reference.
+ * @see #getRight()
+ * @generated
+ */
+ void setRight(DSL_Expression value);
+
+} // DSL_Expression_Minus
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_Expression_Modulo.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_Expression_Modulo.java
new file mode 100644
index 0000000..8ae829b
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_Expression_Modulo.java
@@ -0,0 +1,88 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>DSL Expression Modulo</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Modulo#getLeft <em>Left</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Modulo#getRight <em>Right</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_Expression_Modulo()
+ * @model
+ * @generated
+ */
+public interface DSL_Expression_Modulo extends DSL_Expression
+{
+ /**
+ * Returns the value of the '<em><b>Left</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Left</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>Left</em>' containment reference.
+ * @see #setLeft(DSL_Expression)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_Expression_Modulo_Left()
+ * @model containment="true"
+ * @generated
+ */
+ DSL_Expression getLeft();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Modulo#getLeft <em>Left</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Left</em>' containment reference.
+ * @see #getLeft()
+ * @generated
+ */
+ void setLeft(DSL_Expression value);
+
+ /**
+ * Returns the value of the '<em><b>Right</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Right</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>Right</em>' containment reference.
+ * @see #setRight(DSL_Expression)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_Expression_Modulo_Right()
+ * @model containment="true"
+ * @generated
+ */
+ DSL_Expression getRight();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Modulo#getRight <em>Right</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Right</em>' containment reference.
+ * @see #getRight()
+ * @generated
+ */
+ void setRight(DSL_Expression value);
+
+} // DSL_Expression_Modulo
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_Expression_Multiplication.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_Expression_Multiplication.java
new file mode 100644
index 0000000..926bcdd
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_Expression_Multiplication.java
@@ -0,0 +1,88 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>DSL Expression Multiplication</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Multiplication#getLeft <em>Left</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Multiplication#getRight <em>Right</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_Expression_Multiplication()
+ * @model
+ * @generated
+ */
+public interface DSL_Expression_Multiplication extends DSL_Expression
+{
+ /**
+ * Returns the value of the '<em><b>Left</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Left</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>Left</em>' containment reference.
+ * @see #setLeft(DSL_Expression)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_Expression_Multiplication_Left()
+ * @model containment="true"
+ * @generated
+ */
+ DSL_Expression getLeft();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Multiplication#getLeft <em>Left</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Left</em>' containment reference.
+ * @see #getLeft()
+ * @generated
+ */
+ void setLeft(DSL_Expression value);
+
+ /**
+ * Returns the value of the '<em><b>Right</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Right</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>Right</em>' containment reference.
+ * @see #setRight(DSL_Expression)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_Expression_Multiplication_Right()
+ * @model containment="true"
+ * @generated
+ */
+ DSL_Expression getRight();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Multiplication#getRight <em>Right</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Right</em>' containment reference.
+ * @see #getRight()
+ * @generated
+ */
+ void setRight(DSL_Expression value);
+
+} // DSL_Expression_Multiplication
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_Expression_Negate.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_Expression_Negate.java
new file mode 100644
index 0000000..720d921
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_Expression_Negate.java
@@ -0,0 +1,61 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>DSL Expression Negate</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Negate#getExp <em>Exp</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_Expression_Negate()
+ * @model
+ * @generated
+ */
+public interface DSL_Expression_Negate extends DSL_Expression
+{
+ /**
+ * Returns the value of the '<em><b>Exp</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Exp</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>Exp</em>' containment reference.
+ * @see #setExp(DSL_Expression)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_Expression_Negate_Exp()
+ * @model containment="true"
+ * @generated
+ */
+ DSL_Expression getExp();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Negate#getExp <em>Exp</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Exp</em>' containment reference.
+ * @see #getExp()
+ * @generated
+ */
+ void setExp(DSL_Expression value);
+
+} // DSL_Expression_Negate
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_Expression_Or.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_Expression_Or.java
new file mode 100644
index 0000000..10de8ce
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_Expression_Or.java
@@ -0,0 +1,88 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>DSL Expression Or</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Or#getLeft <em>Left</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Or#getRight <em>Right</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_Expression_Or()
+ * @model
+ * @generated
+ */
+public interface DSL_Expression_Or extends DSL_Expression
+{
+ /**
+ * Returns the value of the '<em><b>Left</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Left</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>Left</em>' containment reference.
+ * @see #setLeft(DSL_Expression)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_Expression_Or_Left()
+ * @model containment="true"
+ * @generated
+ */
+ DSL_Expression getLeft();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Or#getLeft <em>Left</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Left</em>' containment reference.
+ * @see #getLeft()
+ * @generated
+ */
+ void setLeft(DSL_Expression value);
+
+ /**
+ * Returns the value of the '<em><b>Right</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Right</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>Right</em>' containment reference.
+ * @see #setRight(DSL_Expression)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_Expression_Or_Right()
+ * @model containment="true"
+ * @generated
+ */
+ DSL_Expression getRight();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Or#getRight <em>Right</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Right</em>' containment reference.
+ * @see #getRight()
+ * @generated
+ */
+ void setRight(DSL_Expression value);
+
+} // DSL_Expression_Or
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_Expression_Plus.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_Expression_Plus.java
new file mode 100644
index 0000000..ad9e4bd
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_Expression_Plus.java
@@ -0,0 +1,88 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>DSL Expression Plus</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Plus#getLeft <em>Left</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Plus#getRight <em>Right</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_Expression_Plus()
+ * @model
+ * @generated
+ */
+public interface DSL_Expression_Plus extends DSL_Expression
+{
+ /**
+ * Returns the value of the '<em><b>Left</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Left</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>Left</em>' containment reference.
+ * @see #setLeft(DSL_Expression)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_Expression_Plus_Left()
+ * @model containment="true"
+ * @generated
+ */
+ DSL_Expression getLeft();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Plus#getLeft <em>Left</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Left</em>' containment reference.
+ * @see #getLeft()
+ * @generated
+ */
+ void setLeft(DSL_Expression value);
+
+ /**
+ * Returns the value of the '<em><b>Right</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Right</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>Right</em>' containment reference.
+ * @see #setRight(DSL_Expression)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_Expression_Plus_Right()
+ * @model containment="true"
+ * @generated
+ */
+ DSL_Expression getRight();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Plus#getRight <em>Right</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Right</em>' containment reference.
+ * @see #getRight()
+ * @generated
+ */
+ void setRight(DSL_Expression value);
+
+} // DSL_Expression_Plus
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_Expression_Smaller.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_Expression_Smaller.java
new file mode 100644
index 0000000..a06fdd8
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_Expression_Smaller.java
@@ -0,0 +1,88 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>DSL Expression Smaller</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Smaller#getLeft <em>Left</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Smaller#getRight <em>Right</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_Expression_Smaller()
+ * @model
+ * @generated
+ */
+public interface DSL_Expression_Smaller extends DSL_Expression
+{
+ /**
+ * Returns the value of the '<em><b>Left</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Left</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>Left</em>' containment reference.
+ * @see #setLeft(DSL_Expression)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_Expression_Smaller_Left()
+ * @model containment="true"
+ * @generated
+ */
+ DSL_Expression getLeft();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Smaller#getLeft <em>Left</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Left</em>' containment reference.
+ * @see #getLeft()
+ * @generated
+ */
+ void setLeft(DSL_Expression value);
+
+ /**
+ * Returns the value of the '<em><b>Right</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Right</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>Right</em>' containment reference.
+ * @see #setRight(DSL_Expression)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_Expression_Smaller_Right()
+ * @model containment="true"
+ * @generated
+ */
+ DSL_Expression getRight();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Smaller#getRight <em>Right</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Right</em>' containment reference.
+ * @see #getRight()
+ * @generated
+ */
+ void setRight(DSL_Expression value);
+
+} // DSL_Expression_Smaller
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_Expression_Smaller_Equal.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_Expression_Smaller_Equal.java
new file mode 100644
index 0000000..8994ac7
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_Expression_Smaller_Equal.java
@@ -0,0 +1,88 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>DSL Expression Smaller Equal</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Smaller_Equal#getLeft <em>Left</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Smaller_Equal#getRight <em>Right</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_Expression_Smaller_Equal()
+ * @model
+ * @generated
+ */
+public interface DSL_Expression_Smaller_Equal extends DSL_Expression
+{
+ /**
+ * Returns the value of the '<em><b>Left</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Left</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>Left</em>' containment reference.
+ * @see #setLeft(DSL_Expression)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_Expression_Smaller_Equal_Left()
+ * @model containment="true"
+ * @generated
+ */
+ DSL_Expression getLeft();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Smaller_Equal#getLeft <em>Left</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Left</em>' containment reference.
+ * @see #getLeft()
+ * @generated
+ */
+ void setLeft(DSL_Expression value);
+
+ /**
+ * Returns the value of the '<em><b>Right</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Right</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>Right</em>' containment reference.
+ * @see #setRight(DSL_Expression)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_Expression_Smaller_Equal_Right()
+ * @model containment="true"
+ * @generated
+ */
+ DSL_Expression getRight();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Smaller_Equal#getRight <em>Right</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Right</em>' containment reference.
+ * @see #getRight()
+ * @generated
+ */
+ void setRight(DSL_Expression value);
+
+} // DSL_Expression_Smaller_Equal
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_IfDo.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_IfDo.java
new file mode 100644
index 0000000..a5187c9
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_IfDo.java
@@ -0,0 +1,89 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>DSL If Do</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_IfDo#getCondition <em>Condition</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_IfDo#getActions <em>Actions</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_IfDo()
+ * @model
+ * @generated
+ */
+public interface DSL_IfDo extends EObject
+{
+ /**
+ * Returns the value of the '<em><b>Condition</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Condition</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>Condition</em>' containment reference.
+ * @see #setCondition(DSL_Expression)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_IfDo_Condition()
+ * @model containment="true"
+ * @generated
+ */
+ DSL_Expression getCondition();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_IfDo#getCondition <em>Condition</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Condition</em>' containment reference.
+ * @see #getCondition()
+ * @generated
+ */
+ void setCondition(DSL_Expression value);
+
+ /**
+ * Returns the value of the '<em><b>Actions</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Actions</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>Actions</em>' containment reference.
+ * @see #setActions(DSL_ListActions)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_IfDo_Actions()
+ * @model containment="true"
+ * @generated
+ */
+ DSL_ListActions getActions();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_IfDo#getActions <em>Actions</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Actions</em>' containment reference.
+ * @see #getActions()
+ * @generated
+ */
+ void setActions(DSL_ListActions value);
+
+} // DSL_IfDo
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_ListActions.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_ListActions.java
new file mode 100644
index 0000000..44938d9
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_ListActions.java
@@ -0,0 +1,54 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>DSL List Actions</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_ListActions#getActionList <em>Action List</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_ListActions()
+ * @model
+ * @generated
+ */
+public interface DSL_ListActions extends EObject
+{
+ /**
+ * Returns the value of the '<em><b>Action List</b></em>' containment reference list.
+ * The list contents are of type {@link org.eclipse.sensinact.studio.language.sensinact.DSL_ResourceAction}.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Action List</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>Action List</em>' containment reference list.
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_ListActions_ActionList()
+ * @model containment="true"
+ * @generated
+ */
+ EList<DSL_ResourceAction> getActionList();
+
+} // DSL_ListActions
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_ListParam.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_ListParam.java
new file mode 100644
index 0000000..40e499c
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_ListParam.java
@@ -0,0 +1,54 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>DSL List Param</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_ListParam#getParam <em>Param</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_ListParam()
+ * @model
+ * @generated
+ */
+public interface DSL_ListParam extends EObject
+{
+ /**
+ * Returns the value of the '<em><b>Param</b></em>' containment reference list.
+ * The list contents are of type {@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression}.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Param</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>Param</em>' containment reference list.
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_ListParam_Param()
+ * @model containment="true"
+ * @generated
+ */
+ EList<DSL_Expression> getParam();
+
+} // DSL_ListParam
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_Object_Boolean.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_Object_Boolean.java
new file mode 100644
index 0000000..5435ebd
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_Object_Boolean.java
@@ -0,0 +1,61 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>DSL Object Boolean</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Object_Boolean#isValue <em>Value</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_Object_Boolean()
+ * @model
+ * @generated
+ */
+public interface DSL_Object_Boolean extends DSL_Expression
+{
+ /**
+ * 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(boolean)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_Object_Boolean_Value()
+ * @model
+ * @generated
+ */
+ boolean isValue();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Object_Boolean#isValue <em>Value</em>}' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Value</em>' attribute.
+ * @see #isValue()
+ * @generated
+ */
+ void setValue(boolean value);
+
+} // DSL_Object_Boolean
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_Object_Number.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_Object_Number.java
new file mode 100644
index 0000000..ce83b93
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_Object_Number.java
@@ -0,0 +1,62 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact;
+
+import java.math.BigDecimal;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>DSL Object Number</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Object_Number#getValue <em>Value</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_Object_Number()
+ * @model
+ * @generated
+ */
+public interface DSL_Object_Number extends DSL_Expression
+{
+ /**
+ * 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(BigDecimal)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_Object_Number_Value()
+ * @model
+ * @generated
+ */
+ BigDecimal getValue();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Object_Number#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(BigDecimal value);
+
+} // DSL_Object_Number
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_Object_Ref.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_Object_Ref.java
new file mode 100644
index 0000000..bc39822
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_Object_Ref.java
@@ -0,0 +1,61 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>DSL Object Ref</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Object_Ref#getValue <em>Value</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_Object_Ref()
+ * @model
+ * @generated
+ */
+public interface DSL_Object_Ref extends DSL_Expression
+{
+ /**
+ * Returns the value of the '<em><b>Value</b></em>' reference.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Value</em>' reference isn't clear,
+ * there really should be more of a description here...
+ * </p>
+ * <!-- end-user-doc -->
+ * @return the value of the '<em>Value</em>' reference.
+ * @see #setValue(DSL_REF)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_Object_Ref_Value()
+ * @model
+ * @generated
+ */
+ DSL_REF getValue();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Object_Ref#getValue <em>Value</em>}' reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Value</em>' reference.
+ * @see #getValue()
+ * @generated
+ */
+ void setValue(DSL_REF value);
+
+} // DSL_Object_Ref
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_Object_String.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_Object_String.java
new file mode 100644
index 0000000..3ef956d
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_Object_String.java
@@ -0,0 +1,61 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>DSL Object String</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Object_String#getValue <em>Value</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_Object_String()
+ * @model
+ * @generated
+ */
+public interface DSL_Object_String extends DSL_Expression
+{
+ /**
+ * 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(String)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_Object_String_Value()
+ * @model
+ * @generated
+ */
+ String getValue();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Object_String#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(String value);
+
+} // DSL_Object_String
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_On.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_On.java
new file mode 100644
index 0000000..29ea729
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_On.java
@@ -0,0 +1,54 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>DSL On</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_On#getTriggers <em>Triggers</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_On()
+ * @model
+ * @generated
+ */
+public interface DSL_On extends EObject
+{
+ /**
+ * Returns the value of the '<em><b>Triggers</b></em>' containment reference list.
+ * The list contents are of type {@link org.eclipse.sensinact.studio.language.sensinact.DSL_REF_CONDITION}.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Triggers</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>Triggers</em>' containment reference list.
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_On_Triggers()
+ * @model containment="true"
+ * @generated
+ */
+ EList<DSL_REF_CONDITION> getTriggers();
+
+} // DSL_On
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_REF.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_REF.java
new file mode 100644
index 0000000..fa2cee6
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_REF.java
@@ -0,0 +1,62 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>DSL REF</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_REF#getName <em>Name</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_REF()
+ * @model
+ * @generated
+ */
+public interface DSL_REF 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 org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_REF_Name()
+ * @model
+ * @generated
+ */
+ String getName();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_REF#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);
+
+} // DSL_REF
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_REF_CONDITION.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_REF_CONDITION.java
new file mode 100644
index 0000000..224edde
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_REF_CONDITION.java
@@ -0,0 +1,62 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>DSL REF CONDITION</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_REF_CONDITION#getRef <em>Ref</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_REF_CONDITION()
+ * @model
+ * @generated
+ */
+public interface DSL_REF_CONDITION extends EObject
+{
+ /**
+ * Returns the value of the '<em><b>Ref</b></em>' reference.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Ref</em>' reference isn't clear,
+ * there really should be more of a description here...
+ * </p>
+ * <!-- end-user-doc -->
+ * @return the value of the '<em>Ref</em>' reference.
+ * @see #setRef(DSL_REF)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_REF_CONDITION_Ref()
+ * @model
+ * @generated
+ */
+ DSL_REF getRef();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_REF_CONDITION#getRef <em>Ref</em>}' reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Ref</em>' reference.
+ * @see #getRef()
+ * @generated
+ */
+ void setRef(DSL_REF value);
+
+} // DSL_REF_CONDITION
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_Resource.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_Resource.java
new file mode 100644
index 0000000..b5882cf
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_Resource.java
@@ -0,0 +1,142 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>DSL Resource</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Resource#getGatewayID <em>Gateway ID</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Resource#getDeviceID <em>Device ID</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Resource#getServiceID <em>Service ID</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Resource#getResourceID <em>Resource ID</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_Resource()
+ * @model
+ * @generated
+ */
+public interface DSL_Resource extends DSL_REF
+{
+ /**
+ * Returns the value of the '<em><b>Gateway ID</b></em>' attribute.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Gateway ID</em>' attribute isn't clear,
+ * there really should be more of a description here...
+ * </p>
+ * <!-- end-user-doc -->
+ * @return the value of the '<em>Gateway ID</em>' attribute.
+ * @see #setGatewayID(String)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_Resource_GatewayID()
+ * @model
+ * @generated
+ */
+ String getGatewayID();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Resource#getGatewayID <em>Gateway ID</em>}' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Gateway ID</em>' attribute.
+ * @see #getGatewayID()
+ * @generated
+ */
+ void setGatewayID(String value);
+
+ /**
+ * Returns the value of the '<em><b>Device ID</b></em>' attribute.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Device ID</em>' attribute isn't clear,
+ * there really should be more of a description here...
+ * </p>
+ * <!-- end-user-doc -->
+ * @return the value of the '<em>Device ID</em>' attribute.
+ * @see #setDeviceID(String)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_Resource_DeviceID()
+ * @model
+ * @generated
+ */
+ String getDeviceID();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Resource#getDeviceID <em>Device ID</em>}' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Device ID</em>' attribute.
+ * @see #getDeviceID()
+ * @generated
+ */
+ void setDeviceID(String value);
+
+ /**
+ * Returns the value of the '<em><b>Service ID</b></em>' attribute.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Service ID</em>' attribute isn't clear,
+ * there really should be more of a description here...
+ * </p>
+ * <!-- end-user-doc -->
+ * @return the value of the '<em>Service ID</em>' attribute.
+ * @see #setServiceID(String)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_Resource_ServiceID()
+ * @model
+ * @generated
+ */
+ String getServiceID();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Resource#getServiceID <em>Service ID</em>}' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Service ID</em>' attribute.
+ * @see #getServiceID()
+ * @generated
+ */
+ void setServiceID(String value);
+
+ /**
+ * Returns the value of the '<em><b>Resource ID</b></em>' attribute.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Resource ID</em>' attribute isn't clear,
+ * there really should be more of a description here...
+ * </p>
+ * <!-- end-user-doc -->
+ * @return the value of the '<em>Resource ID</em>' attribute.
+ * @see #setResourceID(String)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_Resource_ResourceID()
+ * @model
+ * @generated
+ */
+ String getResourceID();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Resource#getResourceID <em>Resource ID</em>}' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Resource ID</em>' attribute.
+ * @see #getResourceID()
+ * @generated
+ */
+ void setResourceID(String value);
+
+} // DSL_Resource
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_ResourceAction.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_ResourceAction.java
new file mode 100644
index 0000000..7ecec6e
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_ResourceAction.java
@@ -0,0 +1,143 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>DSL Resource Action</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_ResourceAction#getVariable <em>Variable</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_ResourceAction#getRef <em>Ref</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_ResourceAction#getActiontype <em>Actiontype</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_ResourceAction#getListParam <em>List Param</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_ResourceAction()
+ * @model
+ * @generated
+ */
+public interface DSL_ResourceAction extends EObject
+{
+ /**
+ * Returns the value of the '<em><b>Variable</b></em>' attribute.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Variable</em>' attribute isn't clear,
+ * there really should be more of a description here...
+ * </p>
+ * <!-- end-user-doc -->
+ * @return the value of the '<em>Variable</em>' attribute.
+ * @see #setVariable(String)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_ResourceAction_Variable()
+ * @model
+ * @generated
+ */
+ String getVariable();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_ResourceAction#getVariable <em>Variable</em>}' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Variable</em>' attribute.
+ * @see #getVariable()
+ * @generated
+ */
+ void setVariable(String value);
+
+ /**
+ * Returns the value of the '<em><b>Ref</b></em>' reference.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Ref</em>' reference isn't clear,
+ * there really should be more of a description here...
+ * </p>
+ * <!-- end-user-doc -->
+ * @return the value of the '<em>Ref</em>' reference.
+ * @see #setRef(DSL_REF)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_ResourceAction_Ref()
+ * @model
+ * @generated
+ */
+ DSL_REF getRef();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_ResourceAction#getRef <em>Ref</em>}' reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Ref</em>' reference.
+ * @see #getRef()
+ * @generated
+ */
+ void setRef(DSL_REF value);
+
+ /**
+ * Returns the value of the '<em><b>Actiontype</b></em>' attribute.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Actiontype</em>' attribute isn't clear,
+ * there really should be more of a description here...
+ * </p>
+ * <!-- end-user-doc -->
+ * @return the value of the '<em>Actiontype</em>' attribute.
+ * @see #setActiontype(String)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_ResourceAction_Actiontype()
+ * @model
+ * @generated
+ */
+ String getActiontype();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_ResourceAction#getActiontype <em>Actiontype</em>}' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Actiontype</em>' attribute.
+ * @see #getActiontype()
+ * @generated
+ */
+ void setActiontype(String value);
+
+ /**
+ * Returns the value of the '<em><b>List Param</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>List Param</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>List Param</em>' containment reference.
+ * @see #setListParam(DSL_ListParam)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_ResourceAction_ListParam()
+ * @model containment="true"
+ * @generated
+ */
+ DSL_ListParam getListParam();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_ResourceAction#getListParam <em>List Param</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>List Param</em>' containment reference.
+ * @see #getListParam()
+ * @generated
+ */
+ void setListParam(DSL_ListParam value);
+
+} // DSL_ResourceAction
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_SENSINACT.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_SENSINACT.java
new file mode 100644
index 0000000..019ad6f
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/DSL_SENSINACT.java
@@ -0,0 +1,125 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>DSL SENSINACT</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_SENSINACT#getResources <em>Resources</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_SENSINACT#getCep <em>Cep</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_SENSINACT#getOn <em>On</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.DSL_SENSINACT#getEca <em>Eca</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_SENSINACT()
+ * @model
+ * @generated
+ */
+public interface DSL_SENSINACT extends EObject
+{
+ /**
+ * Returns the value of the '<em><b>Resources</b></em>' containment reference list.
+ * The list contents are of type {@link org.eclipse.sensinact.studio.language.sensinact.DSL_Resource}.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Resources</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>Resources</em>' containment reference list.
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_SENSINACT_Resources()
+ * @model containment="true"
+ * @generated
+ */
+ EList<DSL_Resource> getResources();
+
+ /**
+ * Returns the value of the '<em><b>Cep</b></em>' containment reference list.
+ * The list contents are of type {@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_STATEMENT}.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Cep</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>Cep</em>' containment reference list.
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_SENSINACT_Cep()
+ * @model containment="true"
+ * @generated
+ */
+ EList<DSL_CEP_STATEMENT> getCep();
+
+ /**
+ * Returns the value of the '<em><b>On</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>On</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>On</em>' containment reference.
+ * @see #setOn(DSL_On)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_SENSINACT_On()
+ * @model containment="true"
+ * @generated
+ */
+ DSL_On getOn();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_SENSINACT#getOn <em>On</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>On</em>' containment reference.
+ * @see #getOn()
+ * @generated
+ */
+ void setOn(DSL_On value);
+
+ /**
+ * Returns the value of the '<em><b>Eca</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Eca</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>Eca</em>' containment reference.
+ * @see #setEca(DSL_ECA_STATEMENT)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getDSL_SENSINACT_Eca()
+ * @model containment="true"
+ * @generated
+ */
+ DSL_ECA_STATEMENT getEca();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_SENSINACT#getEca <em>Eca</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Eca</em>' containment reference.
+ * @see #getEca()
+ * @generated
+ */
+ void setEca(DSL_ECA_STATEMENT value);
+
+} // DSL_SENSINACT
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/Sensinact.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/Sensinact.java
new file mode 100644
index 0000000..9897672
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/Sensinact.java
@@ -0,0 +1,62 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Sensinact</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.Sensinact#getEca <em>Eca</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getSensinact()
+ * @model
+ * @generated
+ */
+public interface Sensinact extends EObject
+{
+ /**
+ * Returns the value of the '<em><b>Eca</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Eca</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>Eca</em>' containment reference.
+ * @see #setEca(DSL_SENSINACT)
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#getSensinact_Eca()
+ * @model containment="true"
+ * @generated
+ */
+ DSL_SENSINACT getEca();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.sensinact.studio.language.sensinact.Sensinact#getEca <em>Eca</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Eca</em>' containment reference.
+ * @see #getEca()
+ * @generated
+ */
+ void setEca(DSL_SENSINACT value);
+
+} // Sensinact
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/SensinactFactory.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/SensinactFactory.java
new file mode 100644
index 0000000..750a2f4
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/SensinactFactory.java
@@ -0,0 +1,441 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact;
+
+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 org.eclipse.sensinact.studio.language.sensinact.SensinactPackage
+ * @generated
+ */
+public interface SensinactFactory extends EFactory
+{
+ /**
+ * The singleton instance of the factory.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ SensinactFactory eINSTANCE = org.eclipse.sensinact.studio.language.sensinact.impl.SensinactFactoryImpl.init();
+
+ /**
+ * Returns a new object of class '<em>Sensinact</em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return a new object of class '<em>Sensinact</em>'.
+ * @generated
+ */
+ Sensinact createSensinact();
+
+ /**
+ * Returns a new object of class '<em>DSL SENSINACT</em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return a new object of class '<em>DSL SENSINACT</em>'.
+ * @generated
+ */
+ DSL_SENSINACT createDSL_SENSINACT();
+
+ /**
+ * Returns a new object of class '<em>DSL Resource</em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return a new object of class '<em>DSL Resource</em>'.
+ * @generated
+ */
+ DSL_Resource createDSL_Resource();
+
+ /**
+ * Returns a new object of class '<em>DSL On</em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return a new object of class '<em>DSL On</em>'.
+ * @generated
+ */
+ DSL_On createDSL_On();
+
+ /**
+ * Returns a new object of class '<em>DSL ECA STATEMENT</em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return a new object of class '<em>DSL ECA STATEMENT</em>'.
+ * @generated
+ */
+ DSL_ECA_STATEMENT createDSL_ECA_STATEMENT();
+
+ /**
+ * Returns a new object of class '<em>DSL If Do</em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return a new object of class '<em>DSL If Do</em>'.
+ * @generated
+ */
+ DSL_IfDo createDSL_IfDo();
+
+ /**
+ * Returns a new object of class '<em>DSL Else If Do</em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return a new object of class '<em>DSL Else If Do</em>'.
+ * @generated
+ */
+ DSL_ElseIfDo createDSL_ElseIfDo();
+
+ /**
+ * Returns a new object of class '<em>DSL Else Do</em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return a new object of class '<em>DSL Else Do</em>'.
+ * @generated
+ */
+ DSL_ElseDo createDSL_ElseDo();
+
+ /**
+ * Returns a new object of class '<em>DSL REF</em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return a new object of class '<em>DSL REF</em>'.
+ * @generated
+ */
+ DSL_REF createDSL_REF();
+
+ /**
+ * Returns a new object of class '<em>DSL REF CONDITION</em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return a new object of class '<em>DSL REF CONDITION</em>'.
+ * @generated
+ */
+ DSL_REF_CONDITION createDSL_REF_CONDITION();
+
+ /**
+ * Returns a new object of class '<em>DSL CEP STATEMENT</em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return a new object of class '<em>DSL CEP STATEMENT</em>'.
+ * @generated
+ */
+ DSL_CEP_STATEMENT createDSL_CEP_STATEMENT();
+
+ /**
+ * Returns a new object of class '<em>DSL CEP AFTER</em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return a new object of class '<em>DSL CEP AFTER</em>'.
+ * @generated
+ */
+ DSL_CEP_AFTER createDSL_CEP_AFTER();
+
+ /**
+ * Returns a new object of class '<em>DSL CEP BEFORE</em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return a new object of class '<em>DSL CEP BEFORE</em>'.
+ * @generated
+ */
+ DSL_CEP_BEFORE createDSL_CEP_BEFORE();
+
+ /**
+ * Returns a new object of class '<em>DSL CEP COINCIDE</em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return a new object of class '<em>DSL CEP COINCIDE</em>'.
+ * @generated
+ */
+ DSL_CEP_COINCIDE createDSL_CEP_COINCIDE();
+
+ /**
+ * Returns a new object of class '<em>DSL CEP MIN</em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return a new object of class '<em>DSL CEP MIN</em>'.
+ * @generated
+ */
+ DSL_CEP_MIN createDSL_CEP_MIN();
+
+ /**
+ * Returns a new object of class '<em>DSL CEP MAX</em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return a new object of class '<em>DSL CEP MAX</em>'.
+ * @generated
+ */
+ DSL_CEP_MAX createDSL_CEP_MAX();
+
+ /**
+ * Returns a new object of class '<em>DSL CEP AVG</em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return a new object of class '<em>DSL CEP AVG</em>'.
+ * @generated
+ */
+ DSL_CEP_AVG createDSL_CEP_AVG();
+
+ /**
+ * Returns a new object of class '<em>DSL CEP SUM</em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return a new object of class '<em>DSL CEP SUM</em>'.
+ * @generated
+ */
+ DSL_CEP_SUM createDSL_CEP_SUM();
+
+ /**
+ * Returns a new object of class '<em>DSL CEP COUNT</em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return a new object of class '<em>DSL CEP COUNT</em>'.
+ * @generated
+ */
+ DSL_CEP_COUNT createDSL_CEP_COUNT();
+
+ /**
+ * Returns a new object of class '<em>DSL CEP DURATION</em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return a new object of class '<em>DSL CEP DURATION</em>'.
+ * @generated
+ */
+ DSL_CEP_DURATION createDSL_CEP_DURATION();
+
+ /**
+ * Returns a new object of class '<em>DSL CEP DURATION MIN</em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return a new object of class '<em>DSL CEP DURATION MIN</em>'.
+ * @generated
+ */
+ DSL_CEP_DURATION_MIN createDSL_CEP_DURATION_MIN();
+
+ /**
+ * Returns a new object of class '<em>DSL CEP DURATION SEC</em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return a new object of class '<em>DSL CEP DURATION SEC</em>'.
+ * @generated
+ */
+ DSL_CEP_DURATION_SEC createDSL_CEP_DURATION_SEC();
+
+ /**
+ * Returns a new object of class '<em>DSL List Actions</em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return a new object of class '<em>DSL List Actions</em>'.
+ * @generated
+ */
+ DSL_ListActions createDSL_ListActions();
+
+ /**
+ * Returns a new object of class '<em>DSL Resource Action</em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return a new object of class '<em>DSL Resource Action</em>'.
+ * @generated
+ */
+ DSL_ResourceAction createDSL_ResourceAction();
+
+ /**
+ * Returns a new object of class '<em>DSL List Param</em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return a new object of class '<em>DSL List Param</em>'.
+ * @generated
+ */
+ DSL_ListParam createDSL_ListParam();
+
+ /**
+ * Returns a new object of class '<em>DSL Expression</em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return a new object of class '<em>DSL Expression</em>'.
+ * @generated
+ */
+ DSL_Expression createDSL_Expression();
+
+ /**
+ * Returns a new object of class '<em>DSL Expression Or</em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return a new object of class '<em>DSL Expression Or</em>'.
+ * @generated
+ */
+ DSL_Expression_Or createDSL_Expression_Or();
+
+ /**
+ * Returns a new object of class '<em>DSL Expression And</em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return a new object of class '<em>DSL Expression And</em>'.
+ * @generated
+ */
+ DSL_Expression_And createDSL_Expression_And();
+
+ /**
+ * Returns a new object of class '<em>DSL Expression Diff</em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return a new object of class '<em>DSL Expression Diff</em>'.
+ * @generated
+ */
+ DSL_Expression_Diff createDSL_Expression_Diff();
+
+ /**
+ * Returns a new object of class '<em>DSL Expression Equal</em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return a new object of class '<em>DSL Expression Equal</em>'.
+ * @generated
+ */
+ DSL_Expression_Equal createDSL_Expression_Equal();
+
+ /**
+ * Returns a new object of class '<em>DSL Expression Larger</em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return a new object of class '<em>DSL Expression Larger</em>'.
+ * @generated
+ */
+ DSL_Expression_Larger createDSL_Expression_Larger();
+
+ /**
+ * Returns a new object of class '<em>DSL Expression Larger Equal</em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return a new object of class '<em>DSL Expression Larger Equal</em>'.
+ * @generated
+ */
+ DSL_Expression_Larger_Equal createDSL_Expression_Larger_Equal();
+
+ /**
+ * Returns a new object of class '<em>DSL Expression Smaller</em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return a new object of class '<em>DSL Expression Smaller</em>'.
+ * @generated
+ */
+ DSL_Expression_Smaller createDSL_Expression_Smaller();
+
+ /**
+ * Returns a new object of class '<em>DSL Expression Smaller Equal</em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return a new object of class '<em>DSL Expression Smaller Equal</em>'.
+ * @generated
+ */
+ DSL_Expression_Smaller_Equal createDSL_Expression_Smaller_Equal();
+
+ /**
+ * Returns a new object of class '<em>DSL Expression Plus</em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return a new object of class '<em>DSL Expression Plus</em>'.
+ * @generated
+ */
+ DSL_Expression_Plus createDSL_Expression_Plus();
+
+ /**
+ * Returns a new object of class '<em>DSL Expression Minus</em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return a new object of class '<em>DSL Expression Minus</em>'.
+ * @generated
+ */
+ DSL_Expression_Minus createDSL_Expression_Minus();
+
+ /**
+ * Returns a new object of class '<em>DSL Expression Multiplication</em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return a new object of class '<em>DSL Expression Multiplication</em>'.
+ * @generated
+ */
+ DSL_Expression_Multiplication createDSL_Expression_Multiplication();
+
+ /**
+ * Returns a new object of class '<em>DSL Expression Division</em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return a new object of class '<em>DSL Expression Division</em>'.
+ * @generated
+ */
+ DSL_Expression_Division createDSL_Expression_Division();
+
+ /**
+ * Returns a new object of class '<em>DSL Expression Modulo</em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return a new object of class '<em>DSL Expression Modulo</em>'.
+ * @generated
+ */
+ DSL_Expression_Modulo createDSL_Expression_Modulo();
+
+ /**
+ * Returns a new object of class '<em>DSL Object Number</em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return a new object of class '<em>DSL Object Number</em>'.
+ * @generated
+ */
+ DSL_Object_Number createDSL_Object_Number();
+
+ /**
+ * Returns a new object of class '<em>DSL Object String</em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return a new object of class '<em>DSL Object String</em>'.
+ * @generated
+ */
+ DSL_Object_String createDSL_Object_String();
+
+ /**
+ * Returns a new object of class '<em>DSL Object Boolean</em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return a new object of class '<em>DSL Object Boolean</em>'.
+ * @generated
+ */
+ DSL_Object_Boolean createDSL_Object_Boolean();
+
+ /**
+ * Returns a new object of class '<em>DSL Object Ref</em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return a new object of class '<em>DSL Object Ref</em>'.
+ * @generated
+ */
+ DSL_Object_Ref createDSL_Object_Ref();
+
+ /**
+ * Returns a new object of class '<em>DSL Expression Negate</em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return a new object of class '<em>DSL Expression Negate</em>'.
+ * @generated
+ */
+ DSL_Expression_Negate createDSL_Expression_Negate();
+
+ /**
+ * Returns the package supported by this factory.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the package supported by this factory.
+ * @generated
+ */
+ SensinactPackage getSensinactPackage();
+
+} //SensinactFactory
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/SensinactPackage.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/SensinactPackage.java
new file mode 100644
index 0000000..b8e6324
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/SensinactPackage.java
@@ -0,0 +1,4126 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact;
+
+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 enum,</li>
+ * <li>and each data type</li>
+ * </ul>
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.SensinactFactory
+ * @model kind="package"
+ * @generated
+ */
+public interface SensinactPackage extends EPackage
+{
+ /**
+ * The package name.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ String eNAME = "sensinact";
+
+ /**
+ * The package namespace URI.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ String eNS_URI = "http://www.eclipse.org/sensinact/studio/language/Sensinact";
+
+ /**
+ * The package namespace name.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ String eNS_PREFIX = "sensinact";
+
+ /**
+ * The singleton instance of the package.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ SensinactPackage eINSTANCE = org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl.init();
+
+ /**
+ * The meta object id for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.SensinactImpl <em>Sensinact</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getSensinact()
+ * @generated
+ */
+ int SENSINACT = 0;
+
+ /**
+ * The feature id for the '<em><b>Eca</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int SENSINACT__ECA = 0;
+
+ /**
+ * The number of structural features of the '<em>Sensinact</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int SENSINACT_FEATURE_COUNT = 1;
+
+ /**
+ * The meta object id for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_SENSINACTImpl <em>DSL SENSINACT</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_SENSINACTImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_SENSINACT()
+ * @generated
+ */
+ int DSL_SENSINACT = 1;
+
+ /**
+ * The feature id for the '<em><b>Resources</b></em>' containment reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_SENSINACT__RESOURCES = 0;
+
+ /**
+ * The feature id for the '<em><b>Cep</b></em>' containment reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_SENSINACT__CEP = 1;
+
+ /**
+ * The feature id for the '<em><b>On</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_SENSINACT__ON = 2;
+
+ /**
+ * The feature id for the '<em><b>Eca</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_SENSINACT__ECA = 3;
+
+ /**
+ * The number of structural features of the '<em>DSL SENSINACT</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_SENSINACT_FEATURE_COUNT = 4;
+
+ /**
+ * The meta object id for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_REFImpl <em>DSL REF</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_REFImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_REF()
+ * @generated
+ */
+ int DSL_REF = 8;
+
+ /**
+ * The feature id for the '<em><b>Name</b></em>' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_REF__NAME = 0;
+
+ /**
+ * The number of structural features of the '<em>DSL REF</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_REF_FEATURE_COUNT = 1;
+
+ /**
+ * The meta object id for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_ResourceImpl <em>DSL Resource</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_ResourceImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_Resource()
+ * @generated
+ */
+ int DSL_RESOURCE = 2;
+
+ /**
+ * The feature id for the '<em><b>Name</b></em>' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_RESOURCE__NAME = DSL_REF__NAME;
+
+ /**
+ * The feature id for the '<em><b>Gateway ID</b></em>' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_RESOURCE__GATEWAY_ID = DSL_REF_FEATURE_COUNT + 0;
+
+ /**
+ * The feature id for the '<em><b>Device ID</b></em>' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_RESOURCE__DEVICE_ID = DSL_REF_FEATURE_COUNT + 1;
+
+ /**
+ * The feature id for the '<em><b>Service ID</b></em>' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_RESOURCE__SERVICE_ID = DSL_REF_FEATURE_COUNT + 2;
+
+ /**
+ * The feature id for the '<em><b>Resource ID</b></em>' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_RESOURCE__RESOURCE_ID = DSL_REF_FEATURE_COUNT + 3;
+
+ /**
+ * The number of structural features of the '<em>DSL Resource</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_RESOURCE_FEATURE_COUNT = DSL_REF_FEATURE_COUNT + 4;
+
+ /**
+ * The meta object id for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_OnImpl <em>DSL On</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_OnImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_On()
+ * @generated
+ */
+ int DSL_ON = 3;
+
+ /**
+ * The feature id for the '<em><b>Triggers</b></em>' containment reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_ON__TRIGGERS = 0;
+
+ /**
+ * The number of structural features of the '<em>DSL On</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_ON_FEATURE_COUNT = 1;
+
+ /**
+ * The meta object id for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_ECA_STATEMENTImpl <em>DSL ECA STATEMENT</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_ECA_STATEMENTImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_ECA_STATEMENT()
+ * @generated
+ */
+ int DSL_ECA_STATEMENT = 4;
+
+ /**
+ * The feature id for the '<em><b>Ifdo</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_ECA_STATEMENT__IFDO = 0;
+
+ /**
+ * The feature id for the '<em><b>Else Ifdo</b></em>' containment reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_ECA_STATEMENT__ELSE_IFDO = 1;
+
+ /**
+ * The feature id for the '<em><b>Elsedo</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_ECA_STATEMENT__ELSEDO = 2;
+
+ /**
+ * The number of structural features of the '<em>DSL ECA STATEMENT</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_ECA_STATEMENT_FEATURE_COUNT = 3;
+
+ /**
+ * The meta object id for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_IfDoImpl <em>DSL If Do</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_IfDoImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_IfDo()
+ * @generated
+ */
+ int DSL_IF_DO = 5;
+
+ /**
+ * The feature id for the '<em><b>Condition</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_IF_DO__CONDITION = 0;
+
+ /**
+ * The feature id for the '<em><b>Actions</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_IF_DO__ACTIONS = 1;
+
+ /**
+ * The number of structural features of the '<em>DSL If Do</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_IF_DO_FEATURE_COUNT = 2;
+
+ /**
+ * The meta object id for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_ElseIfDoImpl <em>DSL Else If Do</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_ElseIfDoImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_ElseIfDo()
+ * @generated
+ */
+ int DSL_ELSE_IF_DO = 6;
+
+ /**
+ * The feature id for the '<em><b>Condition</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_ELSE_IF_DO__CONDITION = 0;
+
+ /**
+ * The feature id for the '<em><b>Actions</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_ELSE_IF_DO__ACTIONS = 1;
+
+ /**
+ * The number of structural features of the '<em>DSL Else If Do</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_ELSE_IF_DO_FEATURE_COUNT = 2;
+
+ /**
+ * The meta object id for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_ElseDoImpl <em>DSL Else Do</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_ElseDoImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_ElseDo()
+ * @generated
+ */
+ int DSL_ELSE_DO = 7;
+
+ /**
+ * The feature id for the '<em><b>Actions</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_ELSE_DO__ACTIONS = 0;
+
+ /**
+ * The number of structural features of the '<em>DSL Else Do</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_ELSE_DO_FEATURE_COUNT = 1;
+
+ /**
+ * The meta object id for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_REF_CONDITIONImpl <em>DSL REF CONDITION</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_REF_CONDITIONImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_REF_CONDITION()
+ * @generated
+ */
+ int DSL_REF_CONDITION = 9;
+
+ /**
+ * The feature id for the '<em><b>Ref</b></em>' reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_REF_CONDITION__REF = 0;
+
+ /**
+ * The number of structural features of the '<em>DSL REF CONDITION</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_REF_CONDITION_FEATURE_COUNT = 1;
+
+ /**
+ * The meta object id for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_STATEMENTImpl <em>DSL CEP STATEMENT</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_STATEMENTImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_CEP_STATEMENT()
+ * @generated
+ */
+ int DSL_CEP_STATEMENT = 10;
+
+ /**
+ * The feature id for the '<em><b>Name</b></em>' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_CEP_STATEMENT__NAME = DSL_REF__NAME;
+
+ /**
+ * The feature id for the '<em><b>Operation</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_CEP_STATEMENT__OPERATION = DSL_REF_FEATURE_COUNT + 0;
+
+ /**
+ * The number of structural features of the '<em>DSL CEP STATEMENT</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_CEP_STATEMENT_FEATURE_COUNT = DSL_REF_FEATURE_COUNT + 1;
+
+ /**
+ * The meta object id for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_AFTERImpl <em>DSL CEP AFTER</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_AFTERImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_CEP_AFTER()
+ * @generated
+ */
+ int DSL_CEP_AFTER = 11;
+
+ /**
+ * The feature id for the '<em><b>Ref1</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_CEP_AFTER__REF1 = 0;
+
+ /**
+ * The feature id for the '<em><b>Ref2</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_CEP_AFTER__REF2 = 1;
+
+ /**
+ * The feature id for the '<em><b>Start</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_CEP_AFTER__START = 2;
+
+ /**
+ * The feature id for the '<em><b>End</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_CEP_AFTER__END = 3;
+
+ /**
+ * The number of structural features of the '<em>DSL CEP AFTER</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_CEP_AFTER_FEATURE_COUNT = 4;
+
+ /**
+ * The meta object id for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_BEFOREImpl <em>DSL CEP BEFORE</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_BEFOREImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_CEP_BEFORE()
+ * @generated
+ */
+ int DSL_CEP_BEFORE = 12;
+
+ /**
+ * The feature id for the '<em><b>Ref1</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_CEP_BEFORE__REF1 = 0;
+
+ /**
+ * The feature id for the '<em><b>Ref2</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_CEP_BEFORE__REF2 = 1;
+
+ /**
+ * The feature id for the '<em><b>Start</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_CEP_BEFORE__START = 2;
+
+ /**
+ * The feature id for the '<em><b>End</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_CEP_BEFORE__END = 3;
+
+ /**
+ * The number of structural features of the '<em>DSL CEP BEFORE</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_CEP_BEFORE_FEATURE_COUNT = 4;
+
+ /**
+ * The meta object id for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_COINCIDEImpl <em>DSL CEP COINCIDE</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_COINCIDEImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_CEP_COINCIDE()
+ * @generated
+ */
+ int DSL_CEP_COINCIDE = 13;
+
+ /**
+ * The feature id for the '<em><b>Ref1</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_CEP_COINCIDE__REF1 = 0;
+
+ /**
+ * The feature id for the '<em><b>Ref2</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_CEP_COINCIDE__REF2 = 1;
+
+ /**
+ * The feature id for the '<em><b>Window</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_CEP_COINCIDE__WINDOW = 2;
+
+ /**
+ * The number of structural features of the '<em>DSL CEP COINCIDE</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_CEP_COINCIDE_FEATURE_COUNT = 3;
+
+ /**
+ * The meta object id for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_MINImpl <em>DSL CEP MIN</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_MINImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_CEP_MIN()
+ * @generated
+ */
+ int DSL_CEP_MIN = 14;
+
+ /**
+ * The feature id for the '<em><b>Ref</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_CEP_MIN__REF = 0;
+
+ /**
+ * The feature id for the '<em><b>Window</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_CEP_MIN__WINDOW = 1;
+
+ /**
+ * The number of structural features of the '<em>DSL CEP MIN</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_CEP_MIN_FEATURE_COUNT = 2;
+
+ /**
+ * The meta object id for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_MAXImpl <em>DSL CEP MAX</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_MAXImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_CEP_MAX()
+ * @generated
+ */
+ int DSL_CEP_MAX = 15;
+
+ /**
+ * The feature id for the '<em><b>Ref</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_CEP_MAX__REF = 0;
+
+ /**
+ * The feature id for the '<em><b>Window</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_CEP_MAX__WINDOW = 1;
+
+ /**
+ * The number of structural features of the '<em>DSL CEP MAX</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_CEP_MAX_FEATURE_COUNT = 2;
+
+ /**
+ * The meta object id for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_AVGImpl <em>DSL CEP AVG</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_AVGImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_CEP_AVG()
+ * @generated
+ */
+ int DSL_CEP_AVG = 16;
+
+ /**
+ * The feature id for the '<em><b>Ref</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_CEP_AVG__REF = 0;
+
+ /**
+ * The feature id for the '<em><b>Window</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_CEP_AVG__WINDOW = 1;
+
+ /**
+ * The number of structural features of the '<em>DSL CEP AVG</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_CEP_AVG_FEATURE_COUNT = 2;
+
+ /**
+ * The meta object id for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_SUMImpl <em>DSL CEP SUM</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_SUMImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_CEP_SUM()
+ * @generated
+ */
+ int DSL_CEP_SUM = 17;
+
+ /**
+ * The feature id for the '<em><b>Ref</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_CEP_SUM__REF = 0;
+
+ /**
+ * The feature id for the '<em><b>Window</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_CEP_SUM__WINDOW = 1;
+
+ /**
+ * The number of structural features of the '<em>DSL CEP SUM</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_CEP_SUM_FEATURE_COUNT = 2;
+
+ /**
+ * The meta object id for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_COUNTImpl <em>DSL CEP COUNT</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_COUNTImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_CEP_COUNT()
+ * @generated
+ */
+ int DSL_CEP_COUNT = 18;
+
+ /**
+ * The feature id for the '<em><b>Ref</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_CEP_COUNT__REF = 0;
+
+ /**
+ * The feature id for the '<em><b>Window</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_CEP_COUNT__WINDOW = 1;
+
+ /**
+ * The number of structural features of the '<em>DSL CEP COUNT</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_CEP_COUNT_FEATURE_COUNT = 2;
+
+ /**
+ * The meta object id for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_DURATIONImpl <em>DSL CEP DURATION</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_DURATIONImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_CEP_DURATION()
+ * @generated
+ */
+ int DSL_CEP_DURATION = 19;
+
+ /**
+ * The feature id for the '<em><b>Units</b></em>' containment reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_CEP_DURATION__UNITS = 0;
+
+ /**
+ * The number of structural features of the '<em>DSL CEP DURATION</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_CEP_DURATION_FEATURE_COUNT = 1;
+
+ /**
+ * The meta object id for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_DURATION_MINImpl <em>DSL CEP DURATION MIN</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_DURATION_MINImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_CEP_DURATION_MIN()
+ * @generated
+ */
+ int DSL_CEP_DURATION_MIN = 20;
+
+ /**
+ * The feature id for the '<em><b>Min</b></em>' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_CEP_DURATION_MIN__MIN = 0;
+
+ /**
+ * The number of structural features of the '<em>DSL CEP DURATION MIN</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_CEP_DURATION_MIN_FEATURE_COUNT = 1;
+
+ /**
+ * The meta object id for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_DURATION_SECImpl <em>DSL CEP DURATION SEC</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_DURATION_SECImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_CEP_DURATION_SEC()
+ * @generated
+ */
+ int DSL_CEP_DURATION_SEC = 21;
+
+ /**
+ * The feature id for the '<em><b>Sec</b></em>' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_CEP_DURATION_SEC__SEC = 0;
+
+ /**
+ * The number of structural features of the '<em>DSL CEP DURATION SEC</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_CEP_DURATION_SEC_FEATURE_COUNT = 1;
+
+ /**
+ * The meta object id for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_ListActionsImpl <em>DSL List Actions</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_ListActionsImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_ListActions()
+ * @generated
+ */
+ int DSL_LIST_ACTIONS = 22;
+
+ /**
+ * The feature id for the '<em><b>Action List</b></em>' containment reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_LIST_ACTIONS__ACTION_LIST = 0;
+
+ /**
+ * The number of structural features of the '<em>DSL List Actions</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_LIST_ACTIONS_FEATURE_COUNT = 1;
+
+ /**
+ * The meta object id for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_ResourceActionImpl <em>DSL Resource Action</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_ResourceActionImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_ResourceAction()
+ * @generated
+ */
+ int DSL_RESOURCE_ACTION = 23;
+
+ /**
+ * The feature id for the '<em><b>Variable</b></em>' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_RESOURCE_ACTION__VARIABLE = 0;
+
+ /**
+ * The feature id for the '<em><b>Ref</b></em>' reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_RESOURCE_ACTION__REF = 1;
+
+ /**
+ * The feature id for the '<em><b>Actiontype</b></em>' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_RESOURCE_ACTION__ACTIONTYPE = 2;
+
+ /**
+ * The feature id for the '<em><b>List Param</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_RESOURCE_ACTION__LIST_PARAM = 3;
+
+ /**
+ * The number of structural features of the '<em>DSL Resource Action</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_RESOURCE_ACTION_FEATURE_COUNT = 4;
+
+ /**
+ * The meta object id for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_ListParamImpl <em>DSL List Param</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_ListParamImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_ListParam()
+ * @generated
+ */
+ int DSL_LIST_PARAM = 24;
+
+ /**
+ * The feature id for the '<em><b>Param</b></em>' containment reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_LIST_PARAM__PARAM = 0;
+
+ /**
+ * The number of structural features of the '<em>DSL List Param</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_LIST_PARAM_FEATURE_COUNT = 1;
+
+ /**
+ * The meta object id for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_ExpressionImpl <em>DSL Expression</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_ExpressionImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_Expression()
+ * @generated
+ */
+ int DSL_EXPRESSION = 25;
+
+ /**
+ * The number of structural features of the '<em>DSL Expression</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_EXPRESSION_FEATURE_COUNT = 0;
+
+ /**
+ * The meta object id for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_OrImpl <em>DSL Expression Or</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_OrImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_Expression_Or()
+ * @generated
+ */
+ int DSL_EXPRESSION_OR = 26;
+
+ /**
+ * The feature id for the '<em><b>Left</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_EXPRESSION_OR__LEFT = DSL_EXPRESSION_FEATURE_COUNT + 0;
+
+ /**
+ * The feature id for the '<em><b>Right</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_EXPRESSION_OR__RIGHT = DSL_EXPRESSION_FEATURE_COUNT + 1;
+
+ /**
+ * The number of structural features of the '<em>DSL Expression Or</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_EXPRESSION_OR_FEATURE_COUNT = DSL_EXPRESSION_FEATURE_COUNT + 2;
+
+ /**
+ * The meta object id for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_AndImpl <em>DSL Expression And</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_AndImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_Expression_And()
+ * @generated
+ */
+ int DSL_EXPRESSION_AND = 27;
+
+ /**
+ * The feature id for the '<em><b>Left</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_EXPRESSION_AND__LEFT = DSL_EXPRESSION_FEATURE_COUNT + 0;
+
+ /**
+ * The feature id for the '<em><b>Right</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_EXPRESSION_AND__RIGHT = DSL_EXPRESSION_FEATURE_COUNT + 1;
+
+ /**
+ * The number of structural features of the '<em>DSL Expression And</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_EXPRESSION_AND_FEATURE_COUNT = DSL_EXPRESSION_FEATURE_COUNT + 2;
+
+ /**
+ * The meta object id for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_DiffImpl <em>DSL Expression Diff</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_DiffImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_Expression_Diff()
+ * @generated
+ */
+ int DSL_EXPRESSION_DIFF = 28;
+
+ /**
+ * The feature id for the '<em><b>Left</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_EXPRESSION_DIFF__LEFT = DSL_EXPRESSION_FEATURE_COUNT + 0;
+
+ /**
+ * The feature id for the '<em><b>Right</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_EXPRESSION_DIFF__RIGHT = DSL_EXPRESSION_FEATURE_COUNT + 1;
+
+ /**
+ * The number of structural features of the '<em>DSL Expression Diff</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_EXPRESSION_DIFF_FEATURE_COUNT = DSL_EXPRESSION_FEATURE_COUNT + 2;
+
+ /**
+ * The meta object id for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_EqualImpl <em>DSL Expression Equal</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_EqualImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_Expression_Equal()
+ * @generated
+ */
+ int DSL_EXPRESSION_EQUAL = 29;
+
+ /**
+ * The feature id for the '<em><b>Left</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_EXPRESSION_EQUAL__LEFT = DSL_EXPRESSION_FEATURE_COUNT + 0;
+
+ /**
+ * The feature id for the '<em><b>Right</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_EXPRESSION_EQUAL__RIGHT = DSL_EXPRESSION_FEATURE_COUNT + 1;
+
+ /**
+ * The number of structural features of the '<em>DSL Expression Equal</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_EXPRESSION_EQUAL_FEATURE_COUNT = DSL_EXPRESSION_FEATURE_COUNT + 2;
+
+ /**
+ * The meta object id for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_LargerImpl <em>DSL Expression Larger</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_LargerImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_Expression_Larger()
+ * @generated
+ */
+ int DSL_EXPRESSION_LARGER = 30;
+
+ /**
+ * The feature id for the '<em><b>Left</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_EXPRESSION_LARGER__LEFT = DSL_EXPRESSION_FEATURE_COUNT + 0;
+
+ /**
+ * The feature id for the '<em><b>Right</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_EXPRESSION_LARGER__RIGHT = DSL_EXPRESSION_FEATURE_COUNT + 1;
+
+ /**
+ * The number of structural features of the '<em>DSL Expression Larger</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_EXPRESSION_LARGER_FEATURE_COUNT = DSL_EXPRESSION_FEATURE_COUNT + 2;
+
+ /**
+ * The meta object id for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_Larger_EqualImpl <em>DSL Expression Larger Equal</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_Larger_EqualImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_Expression_Larger_Equal()
+ * @generated
+ */
+ int DSL_EXPRESSION_LARGER_EQUAL = 31;
+
+ /**
+ * The feature id for the '<em><b>Left</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_EXPRESSION_LARGER_EQUAL__LEFT = DSL_EXPRESSION_FEATURE_COUNT + 0;
+
+ /**
+ * The feature id for the '<em><b>Right</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_EXPRESSION_LARGER_EQUAL__RIGHT = DSL_EXPRESSION_FEATURE_COUNT + 1;
+
+ /**
+ * The number of structural features of the '<em>DSL Expression Larger Equal</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_EXPRESSION_LARGER_EQUAL_FEATURE_COUNT = DSL_EXPRESSION_FEATURE_COUNT + 2;
+
+ /**
+ * The meta object id for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_SmallerImpl <em>DSL Expression Smaller</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_SmallerImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_Expression_Smaller()
+ * @generated
+ */
+ int DSL_EXPRESSION_SMALLER = 32;
+
+ /**
+ * The feature id for the '<em><b>Left</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_EXPRESSION_SMALLER__LEFT = DSL_EXPRESSION_FEATURE_COUNT + 0;
+
+ /**
+ * The feature id for the '<em><b>Right</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_EXPRESSION_SMALLER__RIGHT = DSL_EXPRESSION_FEATURE_COUNT + 1;
+
+ /**
+ * The number of structural features of the '<em>DSL Expression Smaller</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_EXPRESSION_SMALLER_FEATURE_COUNT = DSL_EXPRESSION_FEATURE_COUNT + 2;
+
+ /**
+ * The meta object id for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_Smaller_EqualImpl <em>DSL Expression Smaller Equal</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_Smaller_EqualImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_Expression_Smaller_Equal()
+ * @generated
+ */
+ int DSL_EXPRESSION_SMALLER_EQUAL = 33;
+
+ /**
+ * The feature id for the '<em><b>Left</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_EXPRESSION_SMALLER_EQUAL__LEFT = DSL_EXPRESSION_FEATURE_COUNT + 0;
+
+ /**
+ * The feature id for the '<em><b>Right</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_EXPRESSION_SMALLER_EQUAL__RIGHT = DSL_EXPRESSION_FEATURE_COUNT + 1;
+
+ /**
+ * The number of structural features of the '<em>DSL Expression Smaller Equal</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_EXPRESSION_SMALLER_EQUAL_FEATURE_COUNT = DSL_EXPRESSION_FEATURE_COUNT + 2;
+
+ /**
+ * The meta object id for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_PlusImpl <em>DSL Expression Plus</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_PlusImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_Expression_Plus()
+ * @generated
+ */
+ int DSL_EXPRESSION_PLUS = 34;
+
+ /**
+ * The feature id for the '<em><b>Left</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_EXPRESSION_PLUS__LEFT = DSL_EXPRESSION_FEATURE_COUNT + 0;
+
+ /**
+ * The feature id for the '<em><b>Right</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_EXPRESSION_PLUS__RIGHT = DSL_EXPRESSION_FEATURE_COUNT + 1;
+
+ /**
+ * The number of structural features of the '<em>DSL Expression Plus</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_EXPRESSION_PLUS_FEATURE_COUNT = DSL_EXPRESSION_FEATURE_COUNT + 2;
+
+ /**
+ * The meta object id for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_MinusImpl <em>DSL Expression Minus</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_MinusImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_Expression_Minus()
+ * @generated
+ */
+ int DSL_EXPRESSION_MINUS = 35;
+
+ /**
+ * The feature id for the '<em><b>Left</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_EXPRESSION_MINUS__LEFT = DSL_EXPRESSION_FEATURE_COUNT + 0;
+
+ /**
+ * The feature id for the '<em><b>Right</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_EXPRESSION_MINUS__RIGHT = DSL_EXPRESSION_FEATURE_COUNT + 1;
+
+ /**
+ * The number of structural features of the '<em>DSL Expression Minus</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_EXPRESSION_MINUS_FEATURE_COUNT = DSL_EXPRESSION_FEATURE_COUNT + 2;
+
+ /**
+ * The meta object id for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_MultiplicationImpl <em>DSL Expression Multiplication</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_MultiplicationImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_Expression_Multiplication()
+ * @generated
+ */
+ int DSL_EXPRESSION_MULTIPLICATION = 36;
+
+ /**
+ * The feature id for the '<em><b>Left</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_EXPRESSION_MULTIPLICATION__LEFT = DSL_EXPRESSION_FEATURE_COUNT + 0;
+
+ /**
+ * The feature id for the '<em><b>Right</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_EXPRESSION_MULTIPLICATION__RIGHT = DSL_EXPRESSION_FEATURE_COUNT + 1;
+
+ /**
+ * The number of structural features of the '<em>DSL Expression Multiplication</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_EXPRESSION_MULTIPLICATION_FEATURE_COUNT = DSL_EXPRESSION_FEATURE_COUNT + 2;
+
+ /**
+ * The meta object id for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_DivisionImpl <em>DSL Expression Division</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_DivisionImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_Expression_Division()
+ * @generated
+ */
+ int DSL_EXPRESSION_DIVISION = 37;
+
+ /**
+ * The feature id for the '<em><b>Left</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_EXPRESSION_DIVISION__LEFT = DSL_EXPRESSION_FEATURE_COUNT + 0;
+
+ /**
+ * The feature id for the '<em><b>Right</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_EXPRESSION_DIVISION__RIGHT = DSL_EXPRESSION_FEATURE_COUNT + 1;
+
+ /**
+ * The number of structural features of the '<em>DSL Expression Division</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_EXPRESSION_DIVISION_FEATURE_COUNT = DSL_EXPRESSION_FEATURE_COUNT + 2;
+
+ /**
+ * The meta object id for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_ModuloImpl <em>DSL Expression Modulo</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_ModuloImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_Expression_Modulo()
+ * @generated
+ */
+ int DSL_EXPRESSION_MODULO = 38;
+
+ /**
+ * The feature id for the '<em><b>Left</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_EXPRESSION_MODULO__LEFT = DSL_EXPRESSION_FEATURE_COUNT + 0;
+
+ /**
+ * The feature id for the '<em><b>Right</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_EXPRESSION_MODULO__RIGHT = DSL_EXPRESSION_FEATURE_COUNT + 1;
+
+ /**
+ * The number of structural features of the '<em>DSL Expression Modulo</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_EXPRESSION_MODULO_FEATURE_COUNT = DSL_EXPRESSION_FEATURE_COUNT + 2;
+
+ /**
+ * The meta object id for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Object_NumberImpl <em>DSL Object Number</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Object_NumberImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_Object_Number()
+ * @generated
+ */
+ int DSL_OBJECT_NUMBER = 39;
+
+ /**
+ * The feature id for the '<em><b>Value</b></em>' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_OBJECT_NUMBER__VALUE = DSL_EXPRESSION_FEATURE_COUNT + 0;
+
+ /**
+ * The number of structural features of the '<em>DSL Object Number</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_OBJECT_NUMBER_FEATURE_COUNT = DSL_EXPRESSION_FEATURE_COUNT + 1;
+
+ /**
+ * The meta object id for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Object_StringImpl <em>DSL Object String</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Object_StringImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_Object_String()
+ * @generated
+ */
+ int DSL_OBJECT_STRING = 40;
+
+ /**
+ * The feature id for the '<em><b>Value</b></em>' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_OBJECT_STRING__VALUE = DSL_EXPRESSION_FEATURE_COUNT + 0;
+
+ /**
+ * The number of structural features of the '<em>DSL Object String</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_OBJECT_STRING_FEATURE_COUNT = DSL_EXPRESSION_FEATURE_COUNT + 1;
+
+ /**
+ * The meta object id for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Object_BooleanImpl <em>DSL Object Boolean</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Object_BooleanImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_Object_Boolean()
+ * @generated
+ */
+ int DSL_OBJECT_BOOLEAN = 41;
+
+ /**
+ * The feature id for the '<em><b>Value</b></em>' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_OBJECT_BOOLEAN__VALUE = DSL_EXPRESSION_FEATURE_COUNT + 0;
+
+ /**
+ * The number of structural features of the '<em>DSL Object Boolean</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_OBJECT_BOOLEAN_FEATURE_COUNT = DSL_EXPRESSION_FEATURE_COUNT + 1;
+
+ /**
+ * The meta object id for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Object_RefImpl <em>DSL Object Ref</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Object_RefImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_Object_Ref()
+ * @generated
+ */
+ int DSL_OBJECT_REF = 42;
+
+ /**
+ * The feature id for the '<em><b>Value</b></em>' reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_OBJECT_REF__VALUE = DSL_EXPRESSION_FEATURE_COUNT + 0;
+
+ /**
+ * The number of structural features of the '<em>DSL Object Ref</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_OBJECT_REF_FEATURE_COUNT = DSL_EXPRESSION_FEATURE_COUNT + 1;
+
+ /**
+ * The meta object id for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_NegateImpl <em>DSL Expression Negate</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_NegateImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_Expression_Negate()
+ * @generated
+ */
+ int DSL_EXPRESSION_NEGATE = 43;
+
+ /**
+ * The feature id for the '<em><b>Exp</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_EXPRESSION_NEGATE__EXP = DSL_EXPRESSION_FEATURE_COUNT + 0;
+
+ /**
+ * The number of structural features of the '<em>DSL Expression Negate</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DSL_EXPRESSION_NEGATE_FEATURE_COUNT = DSL_EXPRESSION_FEATURE_COUNT + 1;
+
+
+ /**
+ * Returns the meta object for class '{@link org.eclipse.sensinact.studio.language.sensinact.Sensinact <em>Sensinact</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for class '<em>Sensinact</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.Sensinact
+ * @generated
+ */
+ EClass getSensinact();
+
+ /**
+ * Returns the meta object for the containment reference '{@link org.eclipse.sensinact.studio.language.sensinact.Sensinact#getEca <em>Eca</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference '<em>Eca</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.Sensinact#getEca()
+ * @see #getSensinact()
+ * @generated
+ */
+ EReference getSensinact_Eca();
+
+ /**
+ * Returns the meta object for class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_SENSINACT <em>DSL SENSINACT</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for class '<em>DSL SENSINACT</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_SENSINACT
+ * @generated
+ */
+ EClass getDSL_SENSINACT();
+
+ /**
+ * Returns the meta object for the containment reference list '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_SENSINACT#getResources <em>Resources</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference list '<em>Resources</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_SENSINACT#getResources()
+ * @see #getDSL_SENSINACT()
+ * @generated
+ */
+ EReference getDSL_SENSINACT_Resources();
+
+ /**
+ * Returns the meta object for the containment reference list '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_SENSINACT#getCep <em>Cep</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference list '<em>Cep</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_SENSINACT#getCep()
+ * @see #getDSL_SENSINACT()
+ * @generated
+ */
+ EReference getDSL_SENSINACT_Cep();
+
+ /**
+ * Returns the meta object for the containment reference '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_SENSINACT#getOn <em>On</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference '<em>On</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_SENSINACT#getOn()
+ * @see #getDSL_SENSINACT()
+ * @generated
+ */
+ EReference getDSL_SENSINACT_On();
+
+ /**
+ * Returns the meta object for the containment reference '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_SENSINACT#getEca <em>Eca</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference '<em>Eca</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_SENSINACT#getEca()
+ * @see #getDSL_SENSINACT()
+ * @generated
+ */
+ EReference getDSL_SENSINACT_Eca();
+
+ /**
+ * Returns the meta object for class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Resource <em>DSL Resource</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for class '<em>DSL Resource</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_Resource
+ * @generated
+ */
+ EClass getDSL_Resource();
+
+ /**
+ * Returns the meta object for the attribute '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Resource#getGatewayID <em>Gateway ID</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the attribute '<em>Gateway ID</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_Resource#getGatewayID()
+ * @see #getDSL_Resource()
+ * @generated
+ */
+ EAttribute getDSL_Resource_GatewayID();
+
+ /**
+ * Returns the meta object for the attribute '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Resource#getDeviceID <em>Device ID</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the attribute '<em>Device ID</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_Resource#getDeviceID()
+ * @see #getDSL_Resource()
+ * @generated
+ */
+ EAttribute getDSL_Resource_DeviceID();
+
+ /**
+ * Returns the meta object for the attribute '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Resource#getServiceID <em>Service ID</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the attribute '<em>Service ID</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_Resource#getServiceID()
+ * @see #getDSL_Resource()
+ * @generated
+ */
+ EAttribute getDSL_Resource_ServiceID();
+
+ /**
+ * Returns the meta object for the attribute '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Resource#getResourceID <em>Resource ID</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the attribute '<em>Resource ID</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_Resource#getResourceID()
+ * @see #getDSL_Resource()
+ * @generated
+ */
+ EAttribute getDSL_Resource_ResourceID();
+
+ /**
+ * Returns the meta object for class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_On <em>DSL On</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for class '<em>DSL On</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_On
+ * @generated
+ */
+ EClass getDSL_On();
+
+ /**
+ * Returns the meta object for the containment reference list '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_On#getTriggers <em>Triggers</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference list '<em>Triggers</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_On#getTriggers()
+ * @see #getDSL_On()
+ * @generated
+ */
+ EReference getDSL_On_Triggers();
+
+ /**
+ * Returns the meta object for class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_ECA_STATEMENT <em>DSL ECA STATEMENT</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for class '<em>DSL ECA STATEMENT</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_ECA_STATEMENT
+ * @generated
+ */
+ EClass getDSL_ECA_STATEMENT();
+
+ /**
+ * Returns the meta object for the containment reference '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_ECA_STATEMENT#getIfdo <em>Ifdo</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference '<em>Ifdo</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_ECA_STATEMENT#getIfdo()
+ * @see #getDSL_ECA_STATEMENT()
+ * @generated
+ */
+ EReference getDSL_ECA_STATEMENT_Ifdo();
+
+ /**
+ * Returns the meta object for the containment reference list '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_ECA_STATEMENT#getElseIfdo <em>Else Ifdo</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference list '<em>Else Ifdo</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_ECA_STATEMENT#getElseIfdo()
+ * @see #getDSL_ECA_STATEMENT()
+ * @generated
+ */
+ EReference getDSL_ECA_STATEMENT_ElseIfdo();
+
+ /**
+ * Returns the meta object for the containment reference '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_ECA_STATEMENT#getElsedo <em>Elsedo</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference '<em>Elsedo</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_ECA_STATEMENT#getElsedo()
+ * @see #getDSL_ECA_STATEMENT()
+ * @generated
+ */
+ EReference getDSL_ECA_STATEMENT_Elsedo();
+
+ /**
+ * Returns the meta object for class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_IfDo <em>DSL If Do</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for class '<em>DSL If Do</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_IfDo
+ * @generated
+ */
+ EClass getDSL_IfDo();
+
+ /**
+ * Returns the meta object for the containment reference '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_IfDo#getCondition <em>Condition</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference '<em>Condition</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_IfDo#getCondition()
+ * @see #getDSL_IfDo()
+ * @generated
+ */
+ EReference getDSL_IfDo_Condition();
+
+ /**
+ * Returns the meta object for the containment reference '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_IfDo#getActions <em>Actions</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference '<em>Actions</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_IfDo#getActions()
+ * @see #getDSL_IfDo()
+ * @generated
+ */
+ EReference getDSL_IfDo_Actions();
+
+ /**
+ * Returns the meta object for class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_ElseIfDo <em>DSL Else If Do</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for class '<em>DSL Else If Do</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_ElseIfDo
+ * @generated
+ */
+ EClass getDSL_ElseIfDo();
+
+ /**
+ * Returns the meta object for the containment reference '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_ElseIfDo#getCondition <em>Condition</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference '<em>Condition</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_ElseIfDo#getCondition()
+ * @see #getDSL_ElseIfDo()
+ * @generated
+ */
+ EReference getDSL_ElseIfDo_Condition();
+
+ /**
+ * Returns the meta object for the containment reference '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_ElseIfDo#getActions <em>Actions</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference '<em>Actions</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_ElseIfDo#getActions()
+ * @see #getDSL_ElseIfDo()
+ * @generated
+ */
+ EReference getDSL_ElseIfDo_Actions();
+
+ /**
+ * Returns the meta object for class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_ElseDo <em>DSL Else Do</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for class '<em>DSL Else Do</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_ElseDo
+ * @generated
+ */
+ EClass getDSL_ElseDo();
+
+ /**
+ * Returns the meta object for the containment reference '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_ElseDo#getActions <em>Actions</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference '<em>Actions</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_ElseDo#getActions()
+ * @see #getDSL_ElseDo()
+ * @generated
+ */
+ EReference getDSL_ElseDo_Actions();
+
+ /**
+ * Returns the meta object for class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_REF <em>DSL REF</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for class '<em>DSL REF</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_REF
+ * @generated
+ */
+ EClass getDSL_REF();
+
+ /**
+ * Returns the meta object for the attribute '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_REF#getName <em>Name</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the attribute '<em>Name</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_REF#getName()
+ * @see #getDSL_REF()
+ * @generated
+ */
+ EAttribute getDSL_REF_Name();
+
+ /**
+ * Returns the meta object for class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_REF_CONDITION <em>DSL REF CONDITION</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for class '<em>DSL REF CONDITION</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_REF_CONDITION
+ * @generated
+ */
+ EClass getDSL_REF_CONDITION();
+
+ /**
+ * Returns the meta object for the reference '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_REF_CONDITION#getRef <em>Ref</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the reference '<em>Ref</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_REF_CONDITION#getRef()
+ * @see #getDSL_REF_CONDITION()
+ * @generated
+ */
+ EReference getDSL_REF_CONDITION_Ref();
+
+ /**
+ * Returns the meta object for class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_STATEMENT <em>DSL CEP STATEMENT</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for class '<em>DSL CEP STATEMENT</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_STATEMENT
+ * @generated
+ */
+ EClass getDSL_CEP_STATEMENT();
+
+ /**
+ * Returns the meta object for the containment reference '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_STATEMENT#getOperation <em>Operation</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference '<em>Operation</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_STATEMENT#getOperation()
+ * @see #getDSL_CEP_STATEMENT()
+ * @generated
+ */
+ EReference getDSL_CEP_STATEMENT_Operation();
+
+ /**
+ * Returns the meta object for class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_AFTER <em>DSL CEP AFTER</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for class '<em>DSL CEP AFTER</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_AFTER
+ * @generated
+ */
+ EClass getDSL_CEP_AFTER();
+
+ /**
+ * Returns the meta object for the containment reference '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_AFTER#getRef1 <em>Ref1</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference '<em>Ref1</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_AFTER#getRef1()
+ * @see #getDSL_CEP_AFTER()
+ * @generated
+ */
+ EReference getDSL_CEP_AFTER_Ref1();
+
+ /**
+ * Returns the meta object for the containment reference '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_AFTER#getRef2 <em>Ref2</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference '<em>Ref2</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_AFTER#getRef2()
+ * @see #getDSL_CEP_AFTER()
+ * @generated
+ */
+ EReference getDSL_CEP_AFTER_Ref2();
+
+ /**
+ * Returns the meta object for the containment reference '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_AFTER#getStart <em>Start</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference '<em>Start</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_AFTER#getStart()
+ * @see #getDSL_CEP_AFTER()
+ * @generated
+ */
+ EReference getDSL_CEP_AFTER_Start();
+
+ /**
+ * Returns the meta object for the containment reference '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_AFTER#getEnd <em>End</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference '<em>End</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_AFTER#getEnd()
+ * @see #getDSL_CEP_AFTER()
+ * @generated
+ */
+ EReference getDSL_CEP_AFTER_End();
+
+ /**
+ * Returns the meta object for class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_BEFORE <em>DSL CEP BEFORE</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for class '<em>DSL CEP BEFORE</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_BEFORE
+ * @generated
+ */
+ EClass getDSL_CEP_BEFORE();
+
+ /**
+ * Returns the meta object for the containment reference '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_BEFORE#getRef1 <em>Ref1</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference '<em>Ref1</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_BEFORE#getRef1()
+ * @see #getDSL_CEP_BEFORE()
+ * @generated
+ */
+ EReference getDSL_CEP_BEFORE_Ref1();
+
+ /**
+ * Returns the meta object for the containment reference '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_BEFORE#getRef2 <em>Ref2</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference '<em>Ref2</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_BEFORE#getRef2()
+ * @see #getDSL_CEP_BEFORE()
+ * @generated
+ */
+ EReference getDSL_CEP_BEFORE_Ref2();
+
+ /**
+ * Returns the meta object for the containment reference '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_BEFORE#getStart <em>Start</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference '<em>Start</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_BEFORE#getStart()
+ * @see #getDSL_CEP_BEFORE()
+ * @generated
+ */
+ EReference getDSL_CEP_BEFORE_Start();
+
+ /**
+ * Returns the meta object for the containment reference '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_BEFORE#getEnd <em>End</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference '<em>End</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_BEFORE#getEnd()
+ * @see #getDSL_CEP_BEFORE()
+ * @generated
+ */
+ EReference getDSL_CEP_BEFORE_End();
+
+ /**
+ * Returns the meta object for class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_COINCIDE <em>DSL CEP COINCIDE</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for class '<em>DSL CEP COINCIDE</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_COINCIDE
+ * @generated
+ */
+ EClass getDSL_CEP_COINCIDE();
+
+ /**
+ * Returns the meta object for the containment reference '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_COINCIDE#getRef1 <em>Ref1</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference '<em>Ref1</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_COINCIDE#getRef1()
+ * @see #getDSL_CEP_COINCIDE()
+ * @generated
+ */
+ EReference getDSL_CEP_COINCIDE_Ref1();
+
+ /**
+ * Returns the meta object for the containment reference '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_COINCIDE#getRef2 <em>Ref2</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference '<em>Ref2</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_COINCIDE#getRef2()
+ * @see #getDSL_CEP_COINCIDE()
+ * @generated
+ */
+ EReference getDSL_CEP_COINCIDE_Ref2();
+
+ /**
+ * Returns the meta object for the containment reference '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_COINCIDE#getWindow <em>Window</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference '<em>Window</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_COINCIDE#getWindow()
+ * @see #getDSL_CEP_COINCIDE()
+ * @generated
+ */
+ EReference getDSL_CEP_COINCIDE_Window();
+
+ /**
+ * Returns the meta object for class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_MIN <em>DSL CEP MIN</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for class '<em>DSL CEP MIN</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_MIN
+ * @generated
+ */
+ EClass getDSL_CEP_MIN();
+
+ /**
+ * Returns the meta object for the containment reference '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_MIN#getRef <em>Ref</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference '<em>Ref</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_MIN#getRef()
+ * @see #getDSL_CEP_MIN()
+ * @generated
+ */
+ EReference getDSL_CEP_MIN_Ref();
+
+ /**
+ * Returns the meta object for the containment reference '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_MIN#getWindow <em>Window</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference '<em>Window</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_MIN#getWindow()
+ * @see #getDSL_CEP_MIN()
+ * @generated
+ */
+ EReference getDSL_CEP_MIN_Window();
+
+ /**
+ * Returns the meta object for class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_MAX <em>DSL CEP MAX</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for class '<em>DSL CEP MAX</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_MAX
+ * @generated
+ */
+ EClass getDSL_CEP_MAX();
+
+ /**
+ * Returns the meta object for the containment reference '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_MAX#getRef <em>Ref</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference '<em>Ref</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_MAX#getRef()
+ * @see #getDSL_CEP_MAX()
+ * @generated
+ */
+ EReference getDSL_CEP_MAX_Ref();
+
+ /**
+ * Returns the meta object for the containment reference '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_MAX#getWindow <em>Window</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference '<em>Window</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_MAX#getWindow()
+ * @see #getDSL_CEP_MAX()
+ * @generated
+ */
+ EReference getDSL_CEP_MAX_Window();
+
+ /**
+ * Returns the meta object for class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_AVG <em>DSL CEP AVG</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for class '<em>DSL CEP AVG</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_AVG
+ * @generated
+ */
+ EClass getDSL_CEP_AVG();
+
+ /**
+ * Returns the meta object for the containment reference '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_AVG#getRef <em>Ref</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference '<em>Ref</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_AVG#getRef()
+ * @see #getDSL_CEP_AVG()
+ * @generated
+ */
+ EReference getDSL_CEP_AVG_Ref();
+
+ /**
+ * Returns the meta object for the containment reference '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_AVG#getWindow <em>Window</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference '<em>Window</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_AVG#getWindow()
+ * @see #getDSL_CEP_AVG()
+ * @generated
+ */
+ EReference getDSL_CEP_AVG_Window();
+
+ /**
+ * Returns the meta object for class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_SUM <em>DSL CEP SUM</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for class '<em>DSL CEP SUM</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_SUM
+ * @generated
+ */
+ EClass getDSL_CEP_SUM();
+
+ /**
+ * Returns the meta object for the containment reference '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_SUM#getRef <em>Ref</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference '<em>Ref</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_SUM#getRef()
+ * @see #getDSL_CEP_SUM()
+ * @generated
+ */
+ EReference getDSL_CEP_SUM_Ref();
+
+ /**
+ * Returns the meta object for the containment reference '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_SUM#getWindow <em>Window</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference '<em>Window</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_SUM#getWindow()
+ * @see #getDSL_CEP_SUM()
+ * @generated
+ */
+ EReference getDSL_CEP_SUM_Window();
+
+ /**
+ * Returns the meta object for class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_COUNT <em>DSL CEP COUNT</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for class '<em>DSL CEP COUNT</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_COUNT
+ * @generated
+ */
+ EClass getDSL_CEP_COUNT();
+
+ /**
+ * Returns the meta object for the containment reference '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_COUNT#getRef <em>Ref</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference '<em>Ref</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_COUNT#getRef()
+ * @see #getDSL_CEP_COUNT()
+ * @generated
+ */
+ EReference getDSL_CEP_COUNT_Ref();
+
+ /**
+ * Returns the meta object for the containment reference '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_COUNT#getWindow <em>Window</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference '<em>Window</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_COUNT#getWindow()
+ * @see #getDSL_CEP_COUNT()
+ * @generated
+ */
+ EReference getDSL_CEP_COUNT_Window();
+
+ /**
+ * Returns the meta object for class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_DURATION <em>DSL CEP DURATION</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for class '<em>DSL CEP DURATION</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_DURATION
+ * @generated
+ */
+ EClass getDSL_CEP_DURATION();
+
+ /**
+ * Returns the meta object for the containment reference list '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_DURATION#getUnits <em>Units</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference list '<em>Units</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_DURATION#getUnits()
+ * @see #getDSL_CEP_DURATION()
+ * @generated
+ */
+ EReference getDSL_CEP_DURATION_Units();
+
+ /**
+ * Returns the meta object for class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_DURATION_MIN <em>DSL CEP DURATION MIN</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for class '<em>DSL CEP DURATION MIN</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_DURATION_MIN
+ * @generated
+ */
+ EClass getDSL_CEP_DURATION_MIN();
+
+ /**
+ * Returns the meta object for the attribute '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_DURATION_MIN#getMin <em>Min</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the attribute '<em>Min</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_DURATION_MIN#getMin()
+ * @see #getDSL_CEP_DURATION_MIN()
+ * @generated
+ */
+ EAttribute getDSL_CEP_DURATION_MIN_Min();
+
+ /**
+ * Returns the meta object for class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_DURATION_SEC <em>DSL CEP DURATION SEC</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for class '<em>DSL CEP DURATION SEC</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_DURATION_SEC
+ * @generated
+ */
+ EClass getDSL_CEP_DURATION_SEC();
+
+ /**
+ * Returns the meta object for the attribute '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_DURATION_SEC#getSec <em>Sec</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the attribute '<em>Sec</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_DURATION_SEC#getSec()
+ * @see #getDSL_CEP_DURATION_SEC()
+ * @generated
+ */
+ EAttribute getDSL_CEP_DURATION_SEC_Sec();
+
+ /**
+ * Returns the meta object for class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_ListActions <em>DSL List Actions</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for class '<em>DSL List Actions</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_ListActions
+ * @generated
+ */
+ EClass getDSL_ListActions();
+
+ /**
+ * Returns the meta object for the containment reference list '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_ListActions#getActionList <em>Action List</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference list '<em>Action List</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_ListActions#getActionList()
+ * @see #getDSL_ListActions()
+ * @generated
+ */
+ EReference getDSL_ListActions_ActionList();
+
+ /**
+ * Returns the meta object for class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_ResourceAction <em>DSL Resource Action</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for class '<em>DSL Resource Action</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_ResourceAction
+ * @generated
+ */
+ EClass getDSL_ResourceAction();
+
+ /**
+ * Returns the meta object for the attribute '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_ResourceAction#getVariable <em>Variable</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the attribute '<em>Variable</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_ResourceAction#getVariable()
+ * @see #getDSL_ResourceAction()
+ * @generated
+ */
+ EAttribute getDSL_ResourceAction_Variable();
+
+ /**
+ * Returns the meta object for the reference '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_ResourceAction#getRef <em>Ref</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the reference '<em>Ref</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_ResourceAction#getRef()
+ * @see #getDSL_ResourceAction()
+ * @generated
+ */
+ EReference getDSL_ResourceAction_Ref();
+
+ /**
+ * Returns the meta object for the attribute '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_ResourceAction#getActiontype <em>Actiontype</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the attribute '<em>Actiontype</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_ResourceAction#getActiontype()
+ * @see #getDSL_ResourceAction()
+ * @generated
+ */
+ EAttribute getDSL_ResourceAction_Actiontype();
+
+ /**
+ * Returns the meta object for the containment reference '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_ResourceAction#getListParam <em>List Param</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference '<em>List Param</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_ResourceAction#getListParam()
+ * @see #getDSL_ResourceAction()
+ * @generated
+ */
+ EReference getDSL_ResourceAction_ListParam();
+
+ /**
+ * Returns the meta object for class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_ListParam <em>DSL List Param</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for class '<em>DSL List Param</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_ListParam
+ * @generated
+ */
+ EClass getDSL_ListParam();
+
+ /**
+ * Returns the meta object for the containment reference list '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_ListParam#getParam <em>Param</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference list '<em>Param</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_ListParam#getParam()
+ * @see #getDSL_ListParam()
+ * @generated
+ */
+ EReference getDSL_ListParam_Param();
+
+ /**
+ * Returns the meta object for class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression <em>DSL Expression</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for class '<em>DSL Expression</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_Expression
+ * @generated
+ */
+ EClass getDSL_Expression();
+
+ /**
+ * Returns the meta object for class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Or <em>DSL Expression Or</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for class '<em>DSL Expression Or</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Or
+ * @generated
+ */
+ EClass getDSL_Expression_Or();
+
+ /**
+ * Returns the meta object for the containment reference '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Or#getLeft <em>Left</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference '<em>Left</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Or#getLeft()
+ * @see #getDSL_Expression_Or()
+ * @generated
+ */
+ EReference getDSL_Expression_Or_Left();
+
+ /**
+ * Returns the meta object for the containment reference '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Or#getRight <em>Right</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference '<em>Right</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Or#getRight()
+ * @see #getDSL_Expression_Or()
+ * @generated
+ */
+ EReference getDSL_Expression_Or_Right();
+
+ /**
+ * Returns the meta object for class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_And <em>DSL Expression And</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for class '<em>DSL Expression And</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_And
+ * @generated
+ */
+ EClass getDSL_Expression_And();
+
+ /**
+ * Returns the meta object for the containment reference '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_And#getLeft <em>Left</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference '<em>Left</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_And#getLeft()
+ * @see #getDSL_Expression_And()
+ * @generated
+ */
+ EReference getDSL_Expression_And_Left();
+
+ /**
+ * Returns the meta object for the containment reference '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_And#getRight <em>Right</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference '<em>Right</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_And#getRight()
+ * @see #getDSL_Expression_And()
+ * @generated
+ */
+ EReference getDSL_Expression_And_Right();
+
+ /**
+ * Returns the meta object for class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Diff <em>DSL Expression Diff</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for class '<em>DSL Expression Diff</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Diff
+ * @generated
+ */
+ EClass getDSL_Expression_Diff();
+
+ /**
+ * Returns the meta object for the containment reference '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Diff#getLeft <em>Left</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference '<em>Left</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Diff#getLeft()
+ * @see #getDSL_Expression_Diff()
+ * @generated
+ */
+ EReference getDSL_Expression_Diff_Left();
+
+ /**
+ * Returns the meta object for the containment reference '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Diff#getRight <em>Right</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference '<em>Right</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Diff#getRight()
+ * @see #getDSL_Expression_Diff()
+ * @generated
+ */
+ EReference getDSL_Expression_Diff_Right();
+
+ /**
+ * Returns the meta object for class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Equal <em>DSL Expression Equal</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for class '<em>DSL Expression Equal</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Equal
+ * @generated
+ */
+ EClass getDSL_Expression_Equal();
+
+ /**
+ * Returns the meta object for the containment reference '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Equal#getLeft <em>Left</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference '<em>Left</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Equal#getLeft()
+ * @see #getDSL_Expression_Equal()
+ * @generated
+ */
+ EReference getDSL_Expression_Equal_Left();
+
+ /**
+ * Returns the meta object for the containment reference '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Equal#getRight <em>Right</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference '<em>Right</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Equal#getRight()
+ * @see #getDSL_Expression_Equal()
+ * @generated
+ */
+ EReference getDSL_Expression_Equal_Right();
+
+ /**
+ * Returns the meta object for class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Larger <em>DSL Expression Larger</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for class '<em>DSL Expression Larger</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Larger
+ * @generated
+ */
+ EClass getDSL_Expression_Larger();
+
+ /**
+ * Returns the meta object for the containment reference '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Larger#getLeft <em>Left</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference '<em>Left</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Larger#getLeft()
+ * @see #getDSL_Expression_Larger()
+ * @generated
+ */
+ EReference getDSL_Expression_Larger_Left();
+
+ /**
+ * Returns the meta object for the containment reference '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Larger#getRight <em>Right</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference '<em>Right</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Larger#getRight()
+ * @see #getDSL_Expression_Larger()
+ * @generated
+ */
+ EReference getDSL_Expression_Larger_Right();
+
+ /**
+ * Returns the meta object for class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Larger_Equal <em>DSL Expression Larger Equal</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for class '<em>DSL Expression Larger Equal</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Larger_Equal
+ * @generated
+ */
+ EClass getDSL_Expression_Larger_Equal();
+
+ /**
+ * Returns the meta object for the containment reference '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Larger_Equal#getLeft <em>Left</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference '<em>Left</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Larger_Equal#getLeft()
+ * @see #getDSL_Expression_Larger_Equal()
+ * @generated
+ */
+ EReference getDSL_Expression_Larger_Equal_Left();
+
+ /**
+ * Returns the meta object for the containment reference '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Larger_Equal#getRight <em>Right</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference '<em>Right</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Larger_Equal#getRight()
+ * @see #getDSL_Expression_Larger_Equal()
+ * @generated
+ */
+ EReference getDSL_Expression_Larger_Equal_Right();
+
+ /**
+ * Returns the meta object for class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Smaller <em>DSL Expression Smaller</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for class '<em>DSL Expression Smaller</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Smaller
+ * @generated
+ */
+ EClass getDSL_Expression_Smaller();
+
+ /**
+ * Returns the meta object for the containment reference '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Smaller#getLeft <em>Left</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference '<em>Left</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Smaller#getLeft()
+ * @see #getDSL_Expression_Smaller()
+ * @generated
+ */
+ EReference getDSL_Expression_Smaller_Left();
+
+ /**
+ * Returns the meta object for the containment reference '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Smaller#getRight <em>Right</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference '<em>Right</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Smaller#getRight()
+ * @see #getDSL_Expression_Smaller()
+ * @generated
+ */
+ EReference getDSL_Expression_Smaller_Right();
+
+ /**
+ * Returns the meta object for class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Smaller_Equal <em>DSL Expression Smaller Equal</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for class '<em>DSL Expression Smaller Equal</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Smaller_Equal
+ * @generated
+ */
+ EClass getDSL_Expression_Smaller_Equal();
+
+ /**
+ * Returns the meta object for the containment reference '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Smaller_Equal#getLeft <em>Left</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference '<em>Left</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Smaller_Equal#getLeft()
+ * @see #getDSL_Expression_Smaller_Equal()
+ * @generated
+ */
+ EReference getDSL_Expression_Smaller_Equal_Left();
+
+ /**
+ * Returns the meta object for the containment reference '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Smaller_Equal#getRight <em>Right</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference '<em>Right</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Smaller_Equal#getRight()
+ * @see #getDSL_Expression_Smaller_Equal()
+ * @generated
+ */
+ EReference getDSL_Expression_Smaller_Equal_Right();
+
+ /**
+ * Returns the meta object for class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Plus <em>DSL Expression Plus</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for class '<em>DSL Expression Plus</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Plus
+ * @generated
+ */
+ EClass getDSL_Expression_Plus();
+
+ /**
+ * Returns the meta object for the containment reference '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Plus#getLeft <em>Left</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference '<em>Left</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Plus#getLeft()
+ * @see #getDSL_Expression_Plus()
+ * @generated
+ */
+ EReference getDSL_Expression_Plus_Left();
+
+ /**
+ * Returns the meta object for the containment reference '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Plus#getRight <em>Right</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference '<em>Right</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Plus#getRight()
+ * @see #getDSL_Expression_Plus()
+ * @generated
+ */
+ EReference getDSL_Expression_Plus_Right();
+
+ /**
+ * Returns the meta object for class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Minus <em>DSL Expression Minus</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for class '<em>DSL Expression Minus</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Minus
+ * @generated
+ */
+ EClass getDSL_Expression_Minus();
+
+ /**
+ * Returns the meta object for the containment reference '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Minus#getLeft <em>Left</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference '<em>Left</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Minus#getLeft()
+ * @see #getDSL_Expression_Minus()
+ * @generated
+ */
+ EReference getDSL_Expression_Minus_Left();
+
+ /**
+ * Returns the meta object for the containment reference '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Minus#getRight <em>Right</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference '<em>Right</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Minus#getRight()
+ * @see #getDSL_Expression_Minus()
+ * @generated
+ */
+ EReference getDSL_Expression_Minus_Right();
+
+ /**
+ * Returns the meta object for class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Multiplication <em>DSL Expression Multiplication</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for class '<em>DSL Expression Multiplication</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Multiplication
+ * @generated
+ */
+ EClass getDSL_Expression_Multiplication();
+
+ /**
+ * Returns the meta object for the containment reference '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Multiplication#getLeft <em>Left</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference '<em>Left</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Multiplication#getLeft()
+ * @see #getDSL_Expression_Multiplication()
+ * @generated
+ */
+ EReference getDSL_Expression_Multiplication_Left();
+
+ /**
+ * Returns the meta object for the containment reference '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Multiplication#getRight <em>Right</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference '<em>Right</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Multiplication#getRight()
+ * @see #getDSL_Expression_Multiplication()
+ * @generated
+ */
+ EReference getDSL_Expression_Multiplication_Right();
+
+ /**
+ * Returns the meta object for class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Division <em>DSL Expression Division</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for class '<em>DSL Expression Division</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Division
+ * @generated
+ */
+ EClass getDSL_Expression_Division();
+
+ /**
+ * Returns the meta object for the containment reference '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Division#getLeft <em>Left</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference '<em>Left</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Division#getLeft()
+ * @see #getDSL_Expression_Division()
+ * @generated
+ */
+ EReference getDSL_Expression_Division_Left();
+
+ /**
+ * Returns the meta object for the containment reference '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Division#getRight <em>Right</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference '<em>Right</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Division#getRight()
+ * @see #getDSL_Expression_Division()
+ * @generated
+ */
+ EReference getDSL_Expression_Division_Right();
+
+ /**
+ * Returns the meta object for class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Modulo <em>DSL Expression Modulo</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for class '<em>DSL Expression Modulo</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Modulo
+ * @generated
+ */
+ EClass getDSL_Expression_Modulo();
+
+ /**
+ * Returns the meta object for the containment reference '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Modulo#getLeft <em>Left</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference '<em>Left</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Modulo#getLeft()
+ * @see #getDSL_Expression_Modulo()
+ * @generated
+ */
+ EReference getDSL_Expression_Modulo_Left();
+
+ /**
+ * Returns the meta object for the containment reference '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Modulo#getRight <em>Right</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference '<em>Right</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Modulo#getRight()
+ * @see #getDSL_Expression_Modulo()
+ * @generated
+ */
+ EReference getDSL_Expression_Modulo_Right();
+
+ /**
+ * Returns the meta object for class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Object_Number <em>DSL Object Number</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for class '<em>DSL Object Number</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_Object_Number
+ * @generated
+ */
+ EClass getDSL_Object_Number();
+
+ /**
+ * Returns the meta object for the attribute '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Object_Number#getValue <em>Value</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the attribute '<em>Value</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_Object_Number#getValue()
+ * @see #getDSL_Object_Number()
+ * @generated
+ */
+ EAttribute getDSL_Object_Number_Value();
+
+ /**
+ * Returns the meta object for class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Object_String <em>DSL Object String</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for class '<em>DSL Object String</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_Object_String
+ * @generated
+ */
+ EClass getDSL_Object_String();
+
+ /**
+ * Returns the meta object for the attribute '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Object_String#getValue <em>Value</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the attribute '<em>Value</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_Object_String#getValue()
+ * @see #getDSL_Object_String()
+ * @generated
+ */
+ EAttribute getDSL_Object_String_Value();
+
+ /**
+ * Returns the meta object for class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Object_Boolean <em>DSL Object Boolean</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for class '<em>DSL Object Boolean</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_Object_Boolean
+ * @generated
+ */
+ EClass getDSL_Object_Boolean();
+
+ /**
+ * Returns the meta object for the attribute '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Object_Boolean#isValue <em>Value</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the attribute '<em>Value</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_Object_Boolean#isValue()
+ * @see #getDSL_Object_Boolean()
+ * @generated
+ */
+ EAttribute getDSL_Object_Boolean_Value();
+
+ /**
+ * Returns the meta object for class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Object_Ref <em>DSL Object Ref</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for class '<em>DSL Object Ref</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_Object_Ref
+ * @generated
+ */
+ EClass getDSL_Object_Ref();
+
+ /**
+ * Returns the meta object for the reference '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Object_Ref#getValue <em>Value</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the reference '<em>Value</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_Object_Ref#getValue()
+ * @see #getDSL_Object_Ref()
+ * @generated
+ */
+ EReference getDSL_Object_Ref_Value();
+
+ /**
+ * Returns the meta object for class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Negate <em>DSL Expression Negate</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for class '<em>DSL Expression Negate</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Negate
+ * @generated
+ */
+ EClass getDSL_Expression_Negate();
+
+ /**
+ * Returns the meta object for the containment reference '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Negate#getExp <em>Exp</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference '<em>Exp</em>'.
+ * @see org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Negate#getExp()
+ * @see #getDSL_Expression_Negate()
+ * @generated
+ */
+ EReference getDSL_Expression_Negate_Exp();
+
+ /**
+ * 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
+ */
+ SensinactFactory getSensinactFactory();
+
+ /**
+ * <!-- 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 enum,</li>
+ * <li>and each data type</li>
+ * </ul>
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ interface Literals
+ {
+ /**
+ * The meta object literal for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.SensinactImpl <em>Sensinact</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getSensinact()
+ * @generated
+ */
+ EClass SENSINACT = eINSTANCE.getSensinact();
+
+ /**
+ * The meta object literal for the '<em><b>Eca</b></em>' containment reference feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference SENSINACT__ECA = eINSTANCE.getSensinact_Eca();
+
+ /**
+ * The meta object literal for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_SENSINACTImpl <em>DSL SENSINACT</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_SENSINACTImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_SENSINACT()
+ * @generated
+ */
+ EClass DSL_SENSINACT = eINSTANCE.getDSL_SENSINACT();
+
+ /**
+ * The meta object literal for the '<em><b>Resources</b></em>' containment reference list feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference DSL_SENSINACT__RESOURCES = eINSTANCE.getDSL_SENSINACT_Resources();
+
+ /**
+ * The meta object literal for the '<em><b>Cep</b></em>' containment reference list feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference DSL_SENSINACT__CEP = eINSTANCE.getDSL_SENSINACT_Cep();
+
+ /**
+ * The meta object literal for the '<em><b>On</b></em>' containment reference feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference DSL_SENSINACT__ON = eINSTANCE.getDSL_SENSINACT_On();
+
+ /**
+ * The meta object literal for the '<em><b>Eca</b></em>' containment reference feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference DSL_SENSINACT__ECA = eINSTANCE.getDSL_SENSINACT_Eca();
+
+ /**
+ * The meta object literal for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_ResourceImpl <em>DSL Resource</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_ResourceImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_Resource()
+ * @generated
+ */
+ EClass DSL_RESOURCE = eINSTANCE.getDSL_Resource();
+
+ /**
+ * The meta object literal for the '<em><b>Gateway ID</b></em>' attribute feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EAttribute DSL_RESOURCE__GATEWAY_ID = eINSTANCE.getDSL_Resource_GatewayID();
+
+ /**
+ * The meta object literal for the '<em><b>Device ID</b></em>' attribute feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EAttribute DSL_RESOURCE__DEVICE_ID = eINSTANCE.getDSL_Resource_DeviceID();
+
+ /**
+ * The meta object literal for the '<em><b>Service ID</b></em>' attribute feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EAttribute DSL_RESOURCE__SERVICE_ID = eINSTANCE.getDSL_Resource_ServiceID();
+
+ /**
+ * The meta object literal for the '<em><b>Resource ID</b></em>' attribute feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EAttribute DSL_RESOURCE__RESOURCE_ID = eINSTANCE.getDSL_Resource_ResourceID();
+
+ /**
+ * The meta object literal for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_OnImpl <em>DSL On</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_OnImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_On()
+ * @generated
+ */
+ EClass DSL_ON = eINSTANCE.getDSL_On();
+
+ /**
+ * The meta object literal for the '<em><b>Triggers</b></em>' containment reference list feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference DSL_ON__TRIGGERS = eINSTANCE.getDSL_On_Triggers();
+
+ /**
+ * The meta object literal for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_ECA_STATEMENTImpl <em>DSL ECA STATEMENT</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_ECA_STATEMENTImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_ECA_STATEMENT()
+ * @generated
+ */
+ EClass DSL_ECA_STATEMENT = eINSTANCE.getDSL_ECA_STATEMENT();
+
+ /**
+ * The meta object literal for the '<em><b>Ifdo</b></em>' containment reference feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference DSL_ECA_STATEMENT__IFDO = eINSTANCE.getDSL_ECA_STATEMENT_Ifdo();
+
+ /**
+ * The meta object literal for the '<em><b>Else Ifdo</b></em>' containment reference list feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference DSL_ECA_STATEMENT__ELSE_IFDO = eINSTANCE.getDSL_ECA_STATEMENT_ElseIfdo();
+
+ /**
+ * The meta object literal for the '<em><b>Elsedo</b></em>' containment reference feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference DSL_ECA_STATEMENT__ELSEDO = eINSTANCE.getDSL_ECA_STATEMENT_Elsedo();
+
+ /**
+ * The meta object literal for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_IfDoImpl <em>DSL If Do</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_IfDoImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_IfDo()
+ * @generated
+ */
+ EClass DSL_IF_DO = eINSTANCE.getDSL_IfDo();
+
+ /**
+ * The meta object literal for the '<em><b>Condition</b></em>' containment reference feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference DSL_IF_DO__CONDITION = eINSTANCE.getDSL_IfDo_Condition();
+
+ /**
+ * The meta object literal for the '<em><b>Actions</b></em>' containment reference feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference DSL_IF_DO__ACTIONS = eINSTANCE.getDSL_IfDo_Actions();
+
+ /**
+ * The meta object literal for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_ElseIfDoImpl <em>DSL Else If Do</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_ElseIfDoImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_ElseIfDo()
+ * @generated
+ */
+ EClass DSL_ELSE_IF_DO = eINSTANCE.getDSL_ElseIfDo();
+
+ /**
+ * The meta object literal for the '<em><b>Condition</b></em>' containment reference feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference DSL_ELSE_IF_DO__CONDITION = eINSTANCE.getDSL_ElseIfDo_Condition();
+
+ /**
+ * The meta object literal for the '<em><b>Actions</b></em>' containment reference feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference DSL_ELSE_IF_DO__ACTIONS = eINSTANCE.getDSL_ElseIfDo_Actions();
+
+ /**
+ * The meta object literal for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_ElseDoImpl <em>DSL Else Do</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_ElseDoImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_ElseDo()
+ * @generated
+ */
+ EClass DSL_ELSE_DO = eINSTANCE.getDSL_ElseDo();
+
+ /**
+ * The meta object literal for the '<em><b>Actions</b></em>' containment reference feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference DSL_ELSE_DO__ACTIONS = eINSTANCE.getDSL_ElseDo_Actions();
+
+ /**
+ * The meta object literal for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_REFImpl <em>DSL REF</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_REFImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_REF()
+ * @generated
+ */
+ EClass DSL_REF = eINSTANCE.getDSL_REF();
+
+ /**
+ * The meta object literal for the '<em><b>Name</b></em>' attribute feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EAttribute DSL_REF__NAME = eINSTANCE.getDSL_REF_Name();
+
+ /**
+ * The meta object literal for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_REF_CONDITIONImpl <em>DSL REF CONDITION</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_REF_CONDITIONImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_REF_CONDITION()
+ * @generated
+ */
+ EClass DSL_REF_CONDITION = eINSTANCE.getDSL_REF_CONDITION();
+
+ /**
+ * The meta object literal for the '<em><b>Ref</b></em>' reference feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference DSL_REF_CONDITION__REF = eINSTANCE.getDSL_REF_CONDITION_Ref();
+
+ /**
+ * The meta object literal for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_STATEMENTImpl <em>DSL CEP STATEMENT</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_STATEMENTImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_CEP_STATEMENT()
+ * @generated
+ */
+ EClass DSL_CEP_STATEMENT = eINSTANCE.getDSL_CEP_STATEMENT();
+
+ /**
+ * The meta object literal for the '<em><b>Operation</b></em>' containment reference feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference DSL_CEP_STATEMENT__OPERATION = eINSTANCE.getDSL_CEP_STATEMENT_Operation();
+
+ /**
+ * The meta object literal for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_AFTERImpl <em>DSL CEP AFTER</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_AFTERImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_CEP_AFTER()
+ * @generated
+ */
+ EClass DSL_CEP_AFTER = eINSTANCE.getDSL_CEP_AFTER();
+
+ /**
+ * The meta object literal for the '<em><b>Ref1</b></em>' containment reference feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference DSL_CEP_AFTER__REF1 = eINSTANCE.getDSL_CEP_AFTER_Ref1();
+
+ /**
+ * The meta object literal for the '<em><b>Ref2</b></em>' containment reference feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference DSL_CEP_AFTER__REF2 = eINSTANCE.getDSL_CEP_AFTER_Ref2();
+
+ /**
+ * The meta object literal for the '<em><b>Start</b></em>' containment reference feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference DSL_CEP_AFTER__START = eINSTANCE.getDSL_CEP_AFTER_Start();
+
+ /**
+ * The meta object literal for the '<em><b>End</b></em>' containment reference feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference DSL_CEP_AFTER__END = eINSTANCE.getDSL_CEP_AFTER_End();
+
+ /**
+ * The meta object literal for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_BEFOREImpl <em>DSL CEP BEFORE</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_BEFOREImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_CEP_BEFORE()
+ * @generated
+ */
+ EClass DSL_CEP_BEFORE = eINSTANCE.getDSL_CEP_BEFORE();
+
+ /**
+ * The meta object literal for the '<em><b>Ref1</b></em>' containment reference feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference DSL_CEP_BEFORE__REF1 = eINSTANCE.getDSL_CEP_BEFORE_Ref1();
+
+ /**
+ * The meta object literal for the '<em><b>Ref2</b></em>' containment reference feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference DSL_CEP_BEFORE__REF2 = eINSTANCE.getDSL_CEP_BEFORE_Ref2();
+
+ /**
+ * The meta object literal for the '<em><b>Start</b></em>' containment reference feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference DSL_CEP_BEFORE__START = eINSTANCE.getDSL_CEP_BEFORE_Start();
+
+ /**
+ * The meta object literal for the '<em><b>End</b></em>' containment reference feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference DSL_CEP_BEFORE__END = eINSTANCE.getDSL_CEP_BEFORE_End();
+
+ /**
+ * The meta object literal for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_COINCIDEImpl <em>DSL CEP COINCIDE</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_COINCIDEImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_CEP_COINCIDE()
+ * @generated
+ */
+ EClass DSL_CEP_COINCIDE = eINSTANCE.getDSL_CEP_COINCIDE();
+
+ /**
+ * The meta object literal for the '<em><b>Ref1</b></em>' containment reference feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference DSL_CEP_COINCIDE__REF1 = eINSTANCE.getDSL_CEP_COINCIDE_Ref1();
+
+ /**
+ * The meta object literal for the '<em><b>Ref2</b></em>' containment reference feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference DSL_CEP_COINCIDE__REF2 = eINSTANCE.getDSL_CEP_COINCIDE_Ref2();
+
+ /**
+ * The meta object literal for the '<em><b>Window</b></em>' containment reference feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference DSL_CEP_COINCIDE__WINDOW = eINSTANCE.getDSL_CEP_COINCIDE_Window();
+
+ /**
+ * The meta object literal for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_MINImpl <em>DSL CEP MIN</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_MINImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_CEP_MIN()
+ * @generated
+ */
+ EClass DSL_CEP_MIN = eINSTANCE.getDSL_CEP_MIN();
+
+ /**
+ * The meta object literal for the '<em><b>Ref</b></em>' containment reference feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference DSL_CEP_MIN__REF = eINSTANCE.getDSL_CEP_MIN_Ref();
+
+ /**
+ * The meta object literal for the '<em><b>Window</b></em>' containment reference feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference DSL_CEP_MIN__WINDOW = eINSTANCE.getDSL_CEP_MIN_Window();
+
+ /**
+ * The meta object literal for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_MAXImpl <em>DSL CEP MAX</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_MAXImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_CEP_MAX()
+ * @generated
+ */
+ EClass DSL_CEP_MAX = eINSTANCE.getDSL_CEP_MAX();
+
+ /**
+ * The meta object literal for the '<em><b>Ref</b></em>' containment reference feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference DSL_CEP_MAX__REF = eINSTANCE.getDSL_CEP_MAX_Ref();
+
+ /**
+ * The meta object literal for the '<em><b>Window</b></em>' containment reference feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference DSL_CEP_MAX__WINDOW = eINSTANCE.getDSL_CEP_MAX_Window();
+
+ /**
+ * The meta object literal for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_AVGImpl <em>DSL CEP AVG</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_AVGImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_CEP_AVG()
+ * @generated
+ */
+ EClass DSL_CEP_AVG = eINSTANCE.getDSL_CEP_AVG();
+
+ /**
+ * The meta object literal for the '<em><b>Ref</b></em>' containment reference feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference DSL_CEP_AVG__REF = eINSTANCE.getDSL_CEP_AVG_Ref();
+
+ /**
+ * The meta object literal for the '<em><b>Window</b></em>' containment reference feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference DSL_CEP_AVG__WINDOW = eINSTANCE.getDSL_CEP_AVG_Window();
+
+ /**
+ * The meta object literal for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_SUMImpl <em>DSL CEP SUM</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_SUMImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_CEP_SUM()
+ * @generated
+ */
+ EClass DSL_CEP_SUM = eINSTANCE.getDSL_CEP_SUM();
+
+ /**
+ * The meta object literal for the '<em><b>Ref</b></em>' containment reference feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference DSL_CEP_SUM__REF = eINSTANCE.getDSL_CEP_SUM_Ref();
+
+ /**
+ * The meta object literal for the '<em><b>Window</b></em>' containment reference feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference DSL_CEP_SUM__WINDOW = eINSTANCE.getDSL_CEP_SUM_Window();
+
+ /**
+ * The meta object literal for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_COUNTImpl <em>DSL CEP COUNT</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_COUNTImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_CEP_COUNT()
+ * @generated
+ */
+ EClass DSL_CEP_COUNT = eINSTANCE.getDSL_CEP_COUNT();
+
+ /**
+ * The meta object literal for the '<em><b>Ref</b></em>' containment reference feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference DSL_CEP_COUNT__REF = eINSTANCE.getDSL_CEP_COUNT_Ref();
+
+ /**
+ * The meta object literal for the '<em><b>Window</b></em>' containment reference feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference DSL_CEP_COUNT__WINDOW = eINSTANCE.getDSL_CEP_COUNT_Window();
+
+ /**
+ * The meta object literal for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_DURATIONImpl <em>DSL CEP DURATION</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_DURATIONImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_CEP_DURATION()
+ * @generated
+ */
+ EClass DSL_CEP_DURATION = eINSTANCE.getDSL_CEP_DURATION();
+
+ /**
+ * The meta object literal for the '<em><b>Units</b></em>' containment reference list feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference DSL_CEP_DURATION__UNITS = eINSTANCE.getDSL_CEP_DURATION_Units();
+
+ /**
+ * The meta object literal for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_DURATION_MINImpl <em>DSL CEP DURATION MIN</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_DURATION_MINImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_CEP_DURATION_MIN()
+ * @generated
+ */
+ EClass DSL_CEP_DURATION_MIN = eINSTANCE.getDSL_CEP_DURATION_MIN();
+
+ /**
+ * The meta object literal for the '<em><b>Min</b></em>' attribute feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EAttribute DSL_CEP_DURATION_MIN__MIN = eINSTANCE.getDSL_CEP_DURATION_MIN_Min();
+
+ /**
+ * The meta object literal for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_DURATION_SECImpl <em>DSL CEP DURATION SEC</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_DURATION_SECImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_CEP_DURATION_SEC()
+ * @generated
+ */
+ EClass DSL_CEP_DURATION_SEC = eINSTANCE.getDSL_CEP_DURATION_SEC();
+
+ /**
+ * The meta object literal for the '<em><b>Sec</b></em>' attribute feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EAttribute DSL_CEP_DURATION_SEC__SEC = eINSTANCE.getDSL_CEP_DURATION_SEC_Sec();
+
+ /**
+ * The meta object literal for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_ListActionsImpl <em>DSL List Actions</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_ListActionsImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_ListActions()
+ * @generated
+ */
+ EClass DSL_LIST_ACTIONS = eINSTANCE.getDSL_ListActions();
+
+ /**
+ * The meta object literal for the '<em><b>Action List</b></em>' containment reference list feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference DSL_LIST_ACTIONS__ACTION_LIST = eINSTANCE.getDSL_ListActions_ActionList();
+
+ /**
+ * The meta object literal for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_ResourceActionImpl <em>DSL Resource Action</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_ResourceActionImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_ResourceAction()
+ * @generated
+ */
+ EClass DSL_RESOURCE_ACTION = eINSTANCE.getDSL_ResourceAction();
+
+ /**
+ * The meta object literal for the '<em><b>Variable</b></em>' attribute feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EAttribute DSL_RESOURCE_ACTION__VARIABLE = eINSTANCE.getDSL_ResourceAction_Variable();
+
+ /**
+ * The meta object literal for the '<em><b>Ref</b></em>' reference feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference DSL_RESOURCE_ACTION__REF = eINSTANCE.getDSL_ResourceAction_Ref();
+
+ /**
+ * The meta object literal for the '<em><b>Actiontype</b></em>' attribute feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EAttribute DSL_RESOURCE_ACTION__ACTIONTYPE = eINSTANCE.getDSL_ResourceAction_Actiontype();
+
+ /**
+ * The meta object literal for the '<em><b>List Param</b></em>' containment reference feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference DSL_RESOURCE_ACTION__LIST_PARAM = eINSTANCE.getDSL_ResourceAction_ListParam();
+
+ /**
+ * The meta object literal for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_ListParamImpl <em>DSL List Param</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_ListParamImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_ListParam()
+ * @generated
+ */
+ EClass DSL_LIST_PARAM = eINSTANCE.getDSL_ListParam();
+
+ /**
+ * The meta object literal for the '<em><b>Param</b></em>' containment reference list feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference DSL_LIST_PARAM__PARAM = eINSTANCE.getDSL_ListParam_Param();
+
+ /**
+ * The meta object literal for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_ExpressionImpl <em>DSL Expression</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_ExpressionImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_Expression()
+ * @generated
+ */
+ EClass DSL_EXPRESSION = eINSTANCE.getDSL_Expression();
+
+ /**
+ * The meta object literal for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_OrImpl <em>DSL Expression Or</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_OrImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_Expression_Or()
+ * @generated
+ */
+ EClass DSL_EXPRESSION_OR = eINSTANCE.getDSL_Expression_Or();
+
+ /**
+ * The meta object literal for the '<em><b>Left</b></em>' containment reference feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference DSL_EXPRESSION_OR__LEFT = eINSTANCE.getDSL_Expression_Or_Left();
+
+ /**
+ * The meta object literal for the '<em><b>Right</b></em>' containment reference feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference DSL_EXPRESSION_OR__RIGHT = eINSTANCE.getDSL_Expression_Or_Right();
+
+ /**
+ * The meta object literal for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_AndImpl <em>DSL Expression And</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_AndImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_Expression_And()
+ * @generated
+ */
+ EClass DSL_EXPRESSION_AND = eINSTANCE.getDSL_Expression_And();
+
+ /**
+ * The meta object literal for the '<em><b>Left</b></em>' containment reference feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference DSL_EXPRESSION_AND__LEFT = eINSTANCE.getDSL_Expression_And_Left();
+
+ /**
+ * The meta object literal for the '<em><b>Right</b></em>' containment reference feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference DSL_EXPRESSION_AND__RIGHT = eINSTANCE.getDSL_Expression_And_Right();
+
+ /**
+ * The meta object literal for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_DiffImpl <em>DSL Expression Diff</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_DiffImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_Expression_Diff()
+ * @generated
+ */
+ EClass DSL_EXPRESSION_DIFF = eINSTANCE.getDSL_Expression_Diff();
+
+ /**
+ * The meta object literal for the '<em><b>Left</b></em>' containment reference feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference DSL_EXPRESSION_DIFF__LEFT = eINSTANCE.getDSL_Expression_Diff_Left();
+
+ /**
+ * The meta object literal for the '<em><b>Right</b></em>' containment reference feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference DSL_EXPRESSION_DIFF__RIGHT = eINSTANCE.getDSL_Expression_Diff_Right();
+
+ /**
+ * The meta object literal for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_EqualImpl <em>DSL Expression Equal</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_EqualImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_Expression_Equal()
+ * @generated
+ */
+ EClass DSL_EXPRESSION_EQUAL = eINSTANCE.getDSL_Expression_Equal();
+
+ /**
+ * The meta object literal for the '<em><b>Left</b></em>' containment reference feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference DSL_EXPRESSION_EQUAL__LEFT = eINSTANCE.getDSL_Expression_Equal_Left();
+
+ /**
+ * The meta object literal for the '<em><b>Right</b></em>' containment reference feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference DSL_EXPRESSION_EQUAL__RIGHT = eINSTANCE.getDSL_Expression_Equal_Right();
+
+ /**
+ * The meta object literal for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_LargerImpl <em>DSL Expression Larger</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_LargerImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_Expression_Larger()
+ * @generated
+ */
+ EClass DSL_EXPRESSION_LARGER = eINSTANCE.getDSL_Expression_Larger();
+
+ /**
+ * The meta object literal for the '<em><b>Left</b></em>' containment reference feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference DSL_EXPRESSION_LARGER__LEFT = eINSTANCE.getDSL_Expression_Larger_Left();
+
+ /**
+ * The meta object literal for the '<em><b>Right</b></em>' containment reference feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference DSL_EXPRESSION_LARGER__RIGHT = eINSTANCE.getDSL_Expression_Larger_Right();
+
+ /**
+ * The meta object literal for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_Larger_EqualImpl <em>DSL Expression Larger Equal</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_Larger_EqualImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_Expression_Larger_Equal()
+ * @generated
+ */
+ EClass DSL_EXPRESSION_LARGER_EQUAL = eINSTANCE.getDSL_Expression_Larger_Equal();
+
+ /**
+ * The meta object literal for the '<em><b>Left</b></em>' containment reference feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference DSL_EXPRESSION_LARGER_EQUAL__LEFT = eINSTANCE.getDSL_Expression_Larger_Equal_Left();
+
+ /**
+ * The meta object literal for the '<em><b>Right</b></em>' containment reference feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference DSL_EXPRESSION_LARGER_EQUAL__RIGHT = eINSTANCE.getDSL_Expression_Larger_Equal_Right();
+
+ /**
+ * The meta object literal for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_SmallerImpl <em>DSL Expression Smaller</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_SmallerImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_Expression_Smaller()
+ * @generated
+ */
+ EClass DSL_EXPRESSION_SMALLER = eINSTANCE.getDSL_Expression_Smaller();
+
+ /**
+ * The meta object literal for the '<em><b>Left</b></em>' containment reference feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference DSL_EXPRESSION_SMALLER__LEFT = eINSTANCE.getDSL_Expression_Smaller_Left();
+
+ /**
+ * The meta object literal for the '<em><b>Right</b></em>' containment reference feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference DSL_EXPRESSION_SMALLER__RIGHT = eINSTANCE.getDSL_Expression_Smaller_Right();
+
+ /**
+ * The meta object literal for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_Smaller_EqualImpl <em>DSL Expression Smaller Equal</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_Smaller_EqualImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_Expression_Smaller_Equal()
+ * @generated
+ */
+ EClass DSL_EXPRESSION_SMALLER_EQUAL = eINSTANCE.getDSL_Expression_Smaller_Equal();
+
+ /**
+ * The meta object literal for the '<em><b>Left</b></em>' containment reference feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference DSL_EXPRESSION_SMALLER_EQUAL__LEFT = eINSTANCE.getDSL_Expression_Smaller_Equal_Left();
+
+ /**
+ * The meta object literal for the '<em><b>Right</b></em>' containment reference feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference DSL_EXPRESSION_SMALLER_EQUAL__RIGHT = eINSTANCE.getDSL_Expression_Smaller_Equal_Right();
+
+ /**
+ * The meta object literal for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_PlusImpl <em>DSL Expression Plus</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_PlusImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_Expression_Plus()
+ * @generated
+ */
+ EClass DSL_EXPRESSION_PLUS = eINSTANCE.getDSL_Expression_Plus();
+
+ /**
+ * The meta object literal for the '<em><b>Left</b></em>' containment reference feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference DSL_EXPRESSION_PLUS__LEFT = eINSTANCE.getDSL_Expression_Plus_Left();
+
+ /**
+ * The meta object literal for the '<em><b>Right</b></em>' containment reference feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference DSL_EXPRESSION_PLUS__RIGHT = eINSTANCE.getDSL_Expression_Plus_Right();
+
+ /**
+ * The meta object literal for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_MinusImpl <em>DSL Expression Minus</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_MinusImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_Expression_Minus()
+ * @generated
+ */
+ EClass DSL_EXPRESSION_MINUS = eINSTANCE.getDSL_Expression_Minus();
+
+ /**
+ * The meta object literal for the '<em><b>Left</b></em>' containment reference feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference DSL_EXPRESSION_MINUS__LEFT = eINSTANCE.getDSL_Expression_Minus_Left();
+
+ /**
+ * The meta object literal for the '<em><b>Right</b></em>' containment reference feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference DSL_EXPRESSION_MINUS__RIGHT = eINSTANCE.getDSL_Expression_Minus_Right();
+
+ /**
+ * The meta object literal for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_MultiplicationImpl <em>DSL Expression Multiplication</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_MultiplicationImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_Expression_Multiplication()
+ * @generated
+ */
+ EClass DSL_EXPRESSION_MULTIPLICATION = eINSTANCE.getDSL_Expression_Multiplication();
+
+ /**
+ * The meta object literal for the '<em><b>Left</b></em>' containment reference feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference DSL_EXPRESSION_MULTIPLICATION__LEFT = eINSTANCE.getDSL_Expression_Multiplication_Left();
+
+ /**
+ * The meta object literal for the '<em><b>Right</b></em>' containment reference feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference DSL_EXPRESSION_MULTIPLICATION__RIGHT = eINSTANCE.getDSL_Expression_Multiplication_Right();
+
+ /**
+ * The meta object literal for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_DivisionImpl <em>DSL Expression Division</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_DivisionImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_Expression_Division()
+ * @generated
+ */
+ EClass DSL_EXPRESSION_DIVISION = eINSTANCE.getDSL_Expression_Division();
+
+ /**
+ * The meta object literal for the '<em><b>Left</b></em>' containment reference feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference DSL_EXPRESSION_DIVISION__LEFT = eINSTANCE.getDSL_Expression_Division_Left();
+
+ /**
+ * The meta object literal for the '<em><b>Right</b></em>' containment reference feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference DSL_EXPRESSION_DIVISION__RIGHT = eINSTANCE.getDSL_Expression_Division_Right();
+
+ /**
+ * The meta object literal for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_ModuloImpl <em>DSL Expression Modulo</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_ModuloImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_Expression_Modulo()
+ * @generated
+ */
+ EClass DSL_EXPRESSION_MODULO = eINSTANCE.getDSL_Expression_Modulo();
+
+ /**
+ * The meta object literal for the '<em><b>Left</b></em>' containment reference feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference DSL_EXPRESSION_MODULO__LEFT = eINSTANCE.getDSL_Expression_Modulo_Left();
+
+ /**
+ * The meta object literal for the '<em><b>Right</b></em>' containment reference feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference DSL_EXPRESSION_MODULO__RIGHT = eINSTANCE.getDSL_Expression_Modulo_Right();
+
+ /**
+ * The meta object literal for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Object_NumberImpl <em>DSL Object Number</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Object_NumberImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_Object_Number()
+ * @generated
+ */
+ EClass DSL_OBJECT_NUMBER = eINSTANCE.getDSL_Object_Number();
+
+ /**
+ * The meta object literal for the '<em><b>Value</b></em>' attribute feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EAttribute DSL_OBJECT_NUMBER__VALUE = eINSTANCE.getDSL_Object_Number_Value();
+
+ /**
+ * The meta object literal for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Object_StringImpl <em>DSL Object String</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Object_StringImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_Object_String()
+ * @generated
+ */
+ EClass DSL_OBJECT_STRING = eINSTANCE.getDSL_Object_String();
+
+ /**
+ * The meta object literal for the '<em><b>Value</b></em>' attribute feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EAttribute DSL_OBJECT_STRING__VALUE = eINSTANCE.getDSL_Object_String_Value();
+
+ /**
+ * The meta object literal for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Object_BooleanImpl <em>DSL Object Boolean</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Object_BooleanImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_Object_Boolean()
+ * @generated
+ */
+ EClass DSL_OBJECT_BOOLEAN = eINSTANCE.getDSL_Object_Boolean();
+
+ /**
+ * The meta object literal for the '<em><b>Value</b></em>' attribute feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EAttribute DSL_OBJECT_BOOLEAN__VALUE = eINSTANCE.getDSL_Object_Boolean_Value();
+
+ /**
+ * The meta object literal for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Object_RefImpl <em>DSL Object Ref</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Object_RefImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_Object_Ref()
+ * @generated
+ */
+ EClass DSL_OBJECT_REF = eINSTANCE.getDSL_Object_Ref();
+
+ /**
+ * The meta object literal for the '<em><b>Value</b></em>' reference feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference DSL_OBJECT_REF__VALUE = eINSTANCE.getDSL_Object_Ref_Value();
+
+ /**
+ * The meta object literal for the '{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_NegateImpl <em>DSL Expression Negate</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_NegateImpl
+ * @see org.eclipse.sensinact.studio.language.sensinact.impl.SensinactPackageImpl#getDSL_Expression_Negate()
+ * @generated
+ */
+ EClass DSL_EXPRESSION_NEGATE = eINSTANCE.getDSL_Expression_Negate();
+
+ /**
+ * The meta object literal for the '<em><b>Exp</b></em>' containment reference feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference DSL_EXPRESSION_NEGATE__EXP = eINSTANCE.getDSL_Expression_Negate_Exp();
+
+ }
+
+} //SensinactPackage
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_CEP_AFTERImpl.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_CEP_AFTERImpl.java
new file mode 100644
index 0000000..d44df77
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_CEP_AFTERImpl.java
@@ -0,0 +1,419 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact.impl;
+
+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;
+
+import org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_AFTER;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_DURATION;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_REF_CONDITION;
+import org.eclipse.sensinact.studio.language.sensinact.SensinactPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>DSL CEP AFTER</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_AFTERImpl#getRef1 <em>Ref1</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_AFTERImpl#getRef2 <em>Ref2</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_AFTERImpl#getStart <em>Start</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_AFTERImpl#getEnd <em>End</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class DSL_CEP_AFTERImpl extends MinimalEObjectImpl.Container implements DSL_CEP_AFTER
+{
+ /**
+ * The cached value of the '{@link #getRef1() <em>Ref1</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getRef1()
+ * @generated
+ * @ordered
+ */
+ protected DSL_REF_CONDITION ref1;
+
+ /**
+ * The cached value of the '{@link #getRef2() <em>Ref2</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getRef2()
+ * @generated
+ * @ordered
+ */
+ protected DSL_REF_CONDITION ref2;
+
+ /**
+ * The cached value of the '{@link #getStart() <em>Start</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getStart()
+ * @generated
+ * @ordered
+ */
+ protected DSL_CEP_DURATION start;
+
+ /**
+ * The cached value of the '{@link #getEnd() <em>End</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getEnd()
+ * @generated
+ * @ordered
+ */
+ protected DSL_CEP_DURATION end;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected DSL_CEP_AFTERImpl()
+ {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EClass eStaticClass()
+ {
+ return SensinactPackage.Literals.DSL_CEP_AFTER;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_REF_CONDITION getRef1()
+ {
+ return ref1;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public NotificationChain basicSetRef1(DSL_REF_CONDITION newRef1, NotificationChain msgs)
+ {
+ DSL_REF_CONDITION oldRef1 = ref1;
+ ref1 = newRef1;
+ if (eNotificationRequired())
+ {
+ ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_CEP_AFTER__REF1, oldRef1, newRef1);
+ if (msgs == null) msgs = notification; else msgs.add(notification);
+ }
+ return msgs;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setRef1(DSL_REF_CONDITION newRef1)
+ {
+ if (newRef1 != ref1)
+ {
+ NotificationChain msgs = null;
+ if (ref1 != null)
+ msgs = ((InternalEObject)ref1).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_CEP_AFTER__REF1, null, msgs);
+ if (newRef1 != null)
+ msgs = ((InternalEObject)newRef1).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_CEP_AFTER__REF1, null, msgs);
+ msgs = basicSetRef1(newRef1, msgs);
+ if (msgs != null) msgs.dispatch();
+ }
+ else if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_CEP_AFTER__REF1, newRef1, newRef1));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_REF_CONDITION getRef2()
+ {
+ return ref2;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public NotificationChain basicSetRef2(DSL_REF_CONDITION newRef2, NotificationChain msgs)
+ {
+ DSL_REF_CONDITION oldRef2 = ref2;
+ ref2 = newRef2;
+ if (eNotificationRequired())
+ {
+ ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_CEP_AFTER__REF2, oldRef2, newRef2);
+ if (msgs == null) msgs = notification; else msgs.add(notification);
+ }
+ return msgs;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setRef2(DSL_REF_CONDITION newRef2)
+ {
+ if (newRef2 != ref2)
+ {
+ NotificationChain msgs = null;
+ if (ref2 != null)
+ msgs = ((InternalEObject)ref2).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_CEP_AFTER__REF2, null, msgs);
+ if (newRef2 != null)
+ msgs = ((InternalEObject)newRef2).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_CEP_AFTER__REF2, null, msgs);
+ msgs = basicSetRef2(newRef2, msgs);
+ if (msgs != null) msgs.dispatch();
+ }
+ else if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_CEP_AFTER__REF2, newRef2, newRef2));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_CEP_DURATION getStart()
+ {
+ return start;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public NotificationChain basicSetStart(DSL_CEP_DURATION newStart, NotificationChain msgs)
+ {
+ DSL_CEP_DURATION oldStart = start;
+ start = newStart;
+ if (eNotificationRequired())
+ {
+ ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_CEP_AFTER__START, oldStart, newStart);
+ if (msgs == null) msgs = notification; else msgs.add(notification);
+ }
+ return msgs;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setStart(DSL_CEP_DURATION newStart)
+ {
+ if (newStart != start)
+ {
+ NotificationChain msgs = null;
+ if (start != null)
+ msgs = ((InternalEObject)start).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_CEP_AFTER__START, null, msgs);
+ if (newStart != null)
+ msgs = ((InternalEObject)newStart).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_CEP_AFTER__START, null, msgs);
+ msgs = basicSetStart(newStart, msgs);
+ if (msgs != null) msgs.dispatch();
+ }
+ else if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_CEP_AFTER__START, newStart, newStart));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_CEP_DURATION getEnd()
+ {
+ return end;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public NotificationChain basicSetEnd(DSL_CEP_DURATION newEnd, NotificationChain msgs)
+ {
+ DSL_CEP_DURATION oldEnd = end;
+ end = newEnd;
+ if (eNotificationRequired())
+ {
+ ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_CEP_AFTER__END, oldEnd, newEnd);
+ if (msgs == null) msgs = notification; else msgs.add(notification);
+ }
+ return msgs;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setEnd(DSL_CEP_DURATION newEnd)
+ {
+ if (newEnd != end)
+ {
+ NotificationChain msgs = null;
+ if (end != null)
+ msgs = ((InternalEObject)end).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_CEP_AFTER__END, null, msgs);
+ if (newEnd != null)
+ msgs = ((InternalEObject)newEnd).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_CEP_AFTER__END, null, msgs);
+ msgs = basicSetEnd(newEnd, msgs);
+ if (msgs != null) msgs.dispatch();
+ }
+ else if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_CEP_AFTER__END, newEnd, newEnd));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_CEP_AFTER__REF1:
+ return basicSetRef1(null, msgs);
+ case SensinactPackage.DSL_CEP_AFTER__REF2:
+ return basicSetRef2(null, msgs);
+ case SensinactPackage.DSL_CEP_AFTER__START:
+ return basicSetStart(null, msgs);
+ case SensinactPackage.DSL_CEP_AFTER__END:
+ return basicSetEnd(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 SensinactPackage.DSL_CEP_AFTER__REF1:
+ return getRef1();
+ case SensinactPackage.DSL_CEP_AFTER__REF2:
+ return getRef2();
+ case SensinactPackage.DSL_CEP_AFTER__START:
+ return getStart();
+ case SensinactPackage.DSL_CEP_AFTER__END:
+ return getEnd();
+ }
+ return super.eGet(featureID, resolve, coreType);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eSet(int featureID, Object newValue)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_CEP_AFTER__REF1:
+ setRef1((DSL_REF_CONDITION)newValue);
+ return;
+ case SensinactPackage.DSL_CEP_AFTER__REF2:
+ setRef2((DSL_REF_CONDITION)newValue);
+ return;
+ case SensinactPackage.DSL_CEP_AFTER__START:
+ setStart((DSL_CEP_DURATION)newValue);
+ return;
+ case SensinactPackage.DSL_CEP_AFTER__END:
+ setEnd((DSL_CEP_DURATION)newValue);
+ return;
+ }
+ super.eSet(featureID, newValue);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eUnset(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_CEP_AFTER__REF1:
+ setRef1((DSL_REF_CONDITION)null);
+ return;
+ case SensinactPackage.DSL_CEP_AFTER__REF2:
+ setRef2((DSL_REF_CONDITION)null);
+ return;
+ case SensinactPackage.DSL_CEP_AFTER__START:
+ setStart((DSL_CEP_DURATION)null);
+ return;
+ case SensinactPackage.DSL_CEP_AFTER__END:
+ setEnd((DSL_CEP_DURATION)null);
+ return;
+ }
+ super.eUnset(featureID);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public boolean eIsSet(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_CEP_AFTER__REF1:
+ return ref1 != null;
+ case SensinactPackage.DSL_CEP_AFTER__REF2:
+ return ref2 != null;
+ case SensinactPackage.DSL_CEP_AFTER__START:
+ return start != null;
+ case SensinactPackage.DSL_CEP_AFTER__END:
+ return end != null;
+ }
+ return super.eIsSet(featureID);
+ }
+
+} //DSL_CEP_AFTERImpl
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_CEP_AVGImpl.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_CEP_AVGImpl.java
new file mode 100644
index 0000000..f1b7778
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_CEP_AVGImpl.java
@@ -0,0 +1,277 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact.impl;
+
+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;
+
+import org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_AVG;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_DURATION;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_REF_CONDITION;
+import org.eclipse.sensinact.studio.language.sensinact.SensinactPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>DSL CEP AVG</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_AVGImpl#getRef <em>Ref</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_AVGImpl#getWindow <em>Window</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class DSL_CEP_AVGImpl extends MinimalEObjectImpl.Container implements DSL_CEP_AVG
+{
+ /**
+ * The cached value of the '{@link #getRef() <em>Ref</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getRef()
+ * @generated
+ * @ordered
+ */
+ protected DSL_REF_CONDITION ref;
+
+ /**
+ * The cached value of the '{@link #getWindow() <em>Window</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getWindow()
+ * @generated
+ * @ordered
+ */
+ protected DSL_CEP_DURATION window;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected DSL_CEP_AVGImpl()
+ {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EClass eStaticClass()
+ {
+ return SensinactPackage.Literals.DSL_CEP_AVG;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_REF_CONDITION getRef()
+ {
+ return ref;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public NotificationChain basicSetRef(DSL_REF_CONDITION newRef, NotificationChain msgs)
+ {
+ DSL_REF_CONDITION oldRef = ref;
+ ref = newRef;
+ if (eNotificationRequired())
+ {
+ ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_CEP_AVG__REF, oldRef, newRef);
+ if (msgs == null) msgs = notification; else msgs.add(notification);
+ }
+ return msgs;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setRef(DSL_REF_CONDITION newRef)
+ {
+ if (newRef != ref)
+ {
+ NotificationChain msgs = null;
+ if (ref != null)
+ msgs = ((InternalEObject)ref).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_CEP_AVG__REF, null, msgs);
+ if (newRef != null)
+ msgs = ((InternalEObject)newRef).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_CEP_AVG__REF, null, msgs);
+ msgs = basicSetRef(newRef, msgs);
+ if (msgs != null) msgs.dispatch();
+ }
+ else if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_CEP_AVG__REF, newRef, newRef));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_CEP_DURATION getWindow()
+ {
+ return window;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public NotificationChain basicSetWindow(DSL_CEP_DURATION newWindow, NotificationChain msgs)
+ {
+ DSL_CEP_DURATION oldWindow = window;
+ window = newWindow;
+ if (eNotificationRequired())
+ {
+ ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_CEP_AVG__WINDOW, oldWindow, newWindow);
+ if (msgs == null) msgs = notification; else msgs.add(notification);
+ }
+ return msgs;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setWindow(DSL_CEP_DURATION newWindow)
+ {
+ if (newWindow != window)
+ {
+ NotificationChain msgs = null;
+ if (window != null)
+ msgs = ((InternalEObject)window).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_CEP_AVG__WINDOW, null, msgs);
+ if (newWindow != null)
+ msgs = ((InternalEObject)newWindow).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_CEP_AVG__WINDOW, null, msgs);
+ msgs = basicSetWindow(newWindow, msgs);
+ if (msgs != null) msgs.dispatch();
+ }
+ else if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_CEP_AVG__WINDOW, newWindow, newWindow));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_CEP_AVG__REF:
+ return basicSetRef(null, msgs);
+ case SensinactPackage.DSL_CEP_AVG__WINDOW:
+ return basicSetWindow(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 SensinactPackage.DSL_CEP_AVG__REF:
+ return getRef();
+ case SensinactPackage.DSL_CEP_AVG__WINDOW:
+ return getWindow();
+ }
+ return super.eGet(featureID, resolve, coreType);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eSet(int featureID, Object newValue)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_CEP_AVG__REF:
+ setRef((DSL_REF_CONDITION)newValue);
+ return;
+ case SensinactPackage.DSL_CEP_AVG__WINDOW:
+ setWindow((DSL_CEP_DURATION)newValue);
+ return;
+ }
+ super.eSet(featureID, newValue);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eUnset(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_CEP_AVG__REF:
+ setRef((DSL_REF_CONDITION)null);
+ return;
+ case SensinactPackage.DSL_CEP_AVG__WINDOW:
+ setWindow((DSL_CEP_DURATION)null);
+ return;
+ }
+ super.eUnset(featureID);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public boolean eIsSet(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_CEP_AVG__REF:
+ return ref != null;
+ case SensinactPackage.DSL_CEP_AVG__WINDOW:
+ return window != null;
+ }
+ return super.eIsSet(featureID);
+ }
+
+} //DSL_CEP_AVGImpl
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_CEP_BEFOREImpl.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_CEP_BEFOREImpl.java
new file mode 100644
index 0000000..f26e7de
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_CEP_BEFOREImpl.java
@@ -0,0 +1,419 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact.impl;
+
+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;
+
+import org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_BEFORE;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_DURATION;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_REF_CONDITION;
+import org.eclipse.sensinact.studio.language.sensinact.SensinactPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>DSL CEP BEFORE</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_BEFOREImpl#getRef1 <em>Ref1</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_BEFOREImpl#getRef2 <em>Ref2</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_BEFOREImpl#getStart <em>Start</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_BEFOREImpl#getEnd <em>End</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class DSL_CEP_BEFOREImpl extends MinimalEObjectImpl.Container implements DSL_CEP_BEFORE
+{
+ /**
+ * The cached value of the '{@link #getRef1() <em>Ref1</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getRef1()
+ * @generated
+ * @ordered
+ */
+ protected DSL_REF_CONDITION ref1;
+
+ /**
+ * The cached value of the '{@link #getRef2() <em>Ref2</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getRef2()
+ * @generated
+ * @ordered
+ */
+ protected DSL_REF_CONDITION ref2;
+
+ /**
+ * The cached value of the '{@link #getStart() <em>Start</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getStart()
+ * @generated
+ * @ordered
+ */
+ protected DSL_CEP_DURATION start;
+
+ /**
+ * The cached value of the '{@link #getEnd() <em>End</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getEnd()
+ * @generated
+ * @ordered
+ */
+ protected DSL_CEP_DURATION end;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected DSL_CEP_BEFOREImpl()
+ {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EClass eStaticClass()
+ {
+ return SensinactPackage.Literals.DSL_CEP_BEFORE;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_REF_CONDITION getRef1()
+ {
+ return ref1;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public NotificationChain basicSetRef1(DSL_REF_CONDITION newRef1, NotificationChain msgs)
+ {
+ DSL_REF_CONDITION oldRef1 = ref1;
+ ref1 = newRef1;
+ if (eNotificationRequired())
+ {
+ ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_CEP_BEFORE__REF1, oldRef1, newRef1);
+ if (msgs == null) msgs = notification; else msgs.add(notification);
+ }
+ return msgs;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setRef1(DSL_REF_CONDITION newRef1)
+ {
+ if (newRef1 != ref1)
+ {
+ NotificationChain msgs = null;
+ if (ref1 != null)
+ msgs = ((InternalEObject)ref1).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_CEP_BEFORE__REF1, null, msgs);
+ if (newRef1 != null)
+ msgs = ((InternalEObject)newRef1).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_CEP_BEFORE__REF1, null, msgs);
+ msgs = basicSetRef1(newRef1, msgs);
+ if (msgs != null) msgs.dispatch();
+ }
+ else if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_CEP_BEFORE__REF1, newRef1, newRef1));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_REF_CONDITION getRef2()
+ {
+ return ref2;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public NotificationChain basicSetRef2(DSL_REF_CONDITION newRef2, NotificationChain msgs)
+ {
+ DSL_REF_CONDITION oldRef2 = ref2;
+ ref2 = newRef2;
+ if (eNotificationRequired())
+ {
+ ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_CEP_BEFORE__REF2, oldRef2, newRef2);
+ if (msgs == null) msgs = notification; else msgs.add(notification);
+ }
+ return msgs;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setRef2(DSL_REF_CONDITION newRef2)
+ {
+ if (newRef2 != ref2)
+ {
+ NotificationChain msgs = null;
+ if (ref2 != null)
+ msgs = ((InternalEObject)ref2).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_CEP_BEFORE__REF2, null, msgs);
+ if (newRef2 != null)
+ msgs = ((InternalEObject)newRef2).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_CEP_BEFORE__REF2, null, msgs);
+ msgs = basicSetRef2(newRef2, msgs);
+ if (msgs != null) msgs.dispatch();
+ }
+ else if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_CEP_BEFORE__REF2, newRef2, newRef2));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_CEP_DURATION getStart()
+ {
+ return start;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public NotificationChain basicSetStart(DSL_CEP_DURATION newStart, NotificationChain msgs)
+ {
+ DSL_CEP_DURATION oldStart = start;
+ start = newStart;
+ if (eNotificationRequired())
+ {
+ ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_CEP_BEFORE__START, oldStart, newStart);
+ if (msgs == null) msgs = notification; else msgs.add(notification);
+ }
+ return msgs;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setStart(DSL_CEP_DURATION newStart)
+ {
+ if (newStart != start)
+ {
+ NotificationChain msgs = null;
+ if (start != null)
+ msgs = ((InternalEObject)start).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_CEP_BEFORE__START, null, msgs);
+ if (newStart != null)
+ msgs = ((InternalEObject)newStart).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_CEP_BEFORE__START, null, msgs);
+ msgs = basicSetStart(newStart, msgs);
+ if (msgs != null) msgs.dispatch();
+ }
+ else if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_CEP_BEFORE__START, newStart, newStart));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_CEP_DURATION getEnd()
+ {
+ return end;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public NotificationChain basicSetEnd(DSL_CEP_DURATION newEnd, NotificationChain msgs)
+ {
+ DSL_CEP_DURATION oldEnd = end;
+ end = newEnd;
+ if (eNotificationRequired())
+ {
+ ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_CEP_BEFORE__END, oldEnd, newEnd);
+ if (msgs == null) msgs = notification; else msgs.add(notification);
+ }
+ return msgs;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setEnd(DSL_CEP_DURATION newEnd)
+ {
+ if (newEnd != end)
+ {
+ NotificationChain msgs = null;
+ if (end != null)
+ msgs = ((InternalEObject)end).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_CEP_BEFORE__END, null, msgs);
+ if (newEnd != null)
+ msgs = ((InternalEObject)newEnd).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_CEP_BEFORE__END, null, msgs);
+ msgs = basicSetEnd(newEnd, msgs);
+ if (msgs != null) msgs.dispatch();
+ }
+ else if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_CEP_BEFORE__END, newEnd, newEnd));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_CEP_BEFORE__REF1:
+ return basicSetRef1(null, msgs);
+ case SensinactPackage.DSL_CEP_BEFORE__REF2:
+ return basicSetRef2(null, msgs);
+ case SensinactPackage.DSL_CEP_BEFORE__START:
+ return basicSetStart(null, msgs);
+ case SensinactPackage.DSL_CEP_BEFORE__END:
+ return basicSetEnd(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 SensinactPackage.DSL_CEP_BEFORE__REF1:
+ return getRef1();
+ case SensinactPackage.DSL_CEP_BEFORE__REF2:
+ return getRef2();
+ case SensinactPackage.DSL_CEP_BEFORE__START:
+ return getStart();
+ case SensinactPackage.DSL_CEP_BEFORE__END:
+ return getEnd();
+ }
+ return super.eGet(featureID, resolve, coreType);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eSet(int featureID, Object newValue)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_CEP_BEFORE__REF1:
+ setRef1((DSL_REF_CONDITION)newValue);
+ return;
+ case SensinactPackage.DSL_CEP_BEFORE__REF2:
+ setRef2((DSL_REF_CONDITION)newValue);
+ return;
+ case SensinactPackage.DSL_CEP_BEFORE__START:
+ setStart((DSL_CEP_DURATION)newValue);
+ return;
+ case SensinactPackage.DSL_CEP_BEFORE__END:
+ setEnd((DSL_CEP_DURATION)newValue);
+ return;
+ }
+ super.eSet(featureID, newValue);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eUnset(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_CEP_BEFORE__REF1:
+ setRef1((DSL_REF_CONDITION)null);
+ return;
+ case SensinactPackage.DSL_CEP_BEFORE__REF2:
+ setRef2((DSL_REF_CONDITION)null);
+ return;
+ case SensinactPackage.DSL_CEP_BEFORE__START:
+ setStart((DSL_CEP_DURATION)null);
+ return;
+ case SensinactPackage.DSL_CEP_BEFORE__END:
+ setEnd((DSL_CEP_DURATION)null);
+ return;
+ }
+ super.eUnset(featureID);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public boolean eIsSet(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_CEP_BEFORE__REF1:
+ return ref1 != null;
+ case SensinactPackage.DSL_CEP_BEFORE__REF2:
+ return ref2 != null;
+ case SensinactPackage.DSL_CEP_BEFORE__START:
+ return start != null;
+ case SensinactPackage.DSL_CEP_BEFORE__END:
+ return end != null;
+ }
+ return super.eIsSet(featureID);
+ }
+
+} //DSL_CEP_BEFOREImpl
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_CEP_COINCIDEImpl.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_CEP_COINCIDEImpl.java
new file mode 100644
index 0000000..493fbf9
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_CEP_COINCIDEImpl.java
@@ -0,0 +1,348 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact.impl;
+
+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;
+
+import org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_COINCIDE;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_DURATION;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_REF_CONDITION;
+import org.eclipse.sensinact.studio.language.sensinact.SensinactPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>DSL CEP COINCIDE</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_COINCIDEImpl#getRef1 <em>Ref1</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_COINCIDEImpl#getRef2 <em>Ref2</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_COINCIDEImpl#getWindow <em>Window</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class DSL_CEP_COINCIDEImpl extends MinimalEObjectImpl.Container implements DSL_CEP_COINCIDE
+{
+ /**
+ * The cached value of the '{@link #getRef1() <em>Ref1</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getRef1()
+ * @generated
+ * @ordered
+ */
+ protected DSL_REF_CONDITION ref1;
+
+ /**
+ * The cached value of the '{@link #getRef2() <em>Ref2</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getRef2()
+ * @generated
+ * @ordered
+ */
+ protected DSL_REF_CONDITION ref2;
+
+ /**
+ * The cached value of the '{@link #getWindow() <em>Window</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getWindow()
+ * @generated
+ * @ordered
+ */
+ protected DSL_CEP_DURATION window;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected DSL_CEP_COINCIDEImpl()
+ {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EClass eStaticClass()
+ {
+ return SensinactPackage.Literals.DSL_CEP_COINCIDE;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_REF_CONDITION getRef1()
+ {
+ return ref1;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public NotificationChain basicSetRef1(DSL_REF_CONDITION newRef1, NotificationChain msgs)
+ {
+ DSL_REF_CONDITION oldRef1 = ref1;
+ ref1 = newRef1;
+ if (eNotificationRequired())
+ {
+ ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_CEP_COINCIDE__REF1, oldRef1, newRef1);
+ if (msgs == null) msgs = notification; else msgs.add(notification);
+ }
+ return msgs;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setRef1(DSL_REF_CONDITION newRef1)
+ {
+ if (newRef1 != ref1)
+ {
+ NotificationChain msgs = null;
+ if (ref1 != null)
+ msgs = ((InternalEObject)ref1).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_CEP_COINCIDE__REF1, null, msgs);
+ if (newRef1 != null)
+ msgs = ((InternalEObject)newRef1).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_CEP_COINCIDE__REF1, null, msgs);
+ msgs = basicSetRef1(newRef1, msgs);
+ if (msgs != null) msgs.dispatch();
+ }
+ else if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_CEP_COINCIDE__REF1, newRef1, newRef1));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_REF_CONDITION getRef2()
+ {
+ return ref2;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public NotificationChain basicSetRef2(DSL_REF_CONDITION newRef2, NotificationChain msgs)
+ {
+ DSL_REF_CONDITION oldRef2 = ref2;
+ ref2 = newRef2;
+ if (eNotificationRequired())
+ {
+ ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_CEP_COINCIDE__REF2, oldRef2, newRef2);
+ if (msgs == null) msgs = notification; else msgs.add(notification);
+ }
+ return msgs;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setRef2(DSL_REF_CONDITION newRef2)
+ {
+ if (newRef2 != ref2)
+ {
+ NotificationChain msgs = null;
+ if (ref2 != null)
+ msgs = ((InternalEObject)ref2).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_CEP_COINCIDE__REF2, null, msgs);
+ if (newRef2 != null)
+ msgs = ((InternalEObject)newRef2).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_CEP_COINCIDE__REF2, null, msgs);
+ msgs = basicSetRef2(newRef2, msgs);
+ if (msgs != null) msgs.dispatch();
+ }
+ else if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_CEP_COINCIDE__REF2, newRef2, newRef2));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_CEP_DURATION getWindow()
+ {
+ return window;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public NotificationChain basicSetWindow(DSL_CEP_DURATION newWindow, NotificationChain msgs)
+ {
+ DSL_CEP_DURATION oldWindow = window;
+ window = newWindow;
+ if (eNotificationRequired())
+ {
+ ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_CEP_COINCIDE__WINDOW, oldWindow, newWindow);
+ if (msgs == null) msgs = notification; else msgs.add(notification);
+ }
+ return msgs;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setWindow(DSL_CEP_DURATION newWindow)
+ {
+ if (newWindow != window)
+ {
+ NotificationChain msgs = null;
+ if (window != null)
+ msgs = ((InternalEObject)window).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_CEP_COINCIDE__WINDOW, null, msgs);
+ if (newWindow != null)
+ msgs = ((InternalEObject)newWindow).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_CEP_COINCIDE__WINDOW, null, msgs);
+ msgs = basicSetWindow(newWindow, msgs);
+ if (msgs != null) msgs.dispatch();
+ }
+ else if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_CEP_COINCIDE__WINDOW, newWindow, newWindow));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_CEP_COINCIDE__REF1:
+ return basicSetRef1(null, msgs);
+ case SensinactPackage.DSL_CEP_COINCIDE__REF2:
+ return basicSetRef2(null, msgs);
+ case SensinactPackage.DSL_CEP_COINCIDE__WINDOW:
+ return basicSetWindow(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 SensinactPackage.DSL_CEP_COINCIDE__REF1:
+ return getRef1();
+ case SensinactPackage.DSL_CEP_COINCIDE__REF2:
+ return getRef2();
+ case SensinactPackage.DSL_CEP_COINCIDE__WINDOW:
+ return getWindow();
+ }
+ return super.eGet(featureID, resolve, coreType);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eSet(int featureID, Object newValue)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_CEP_COINCIDE__REF1:
+ setRef1((DSL_REF_CONDITION)newValue);
+ return;
+ case SensinactPackage.DSL_CEP_COINCIDE__REF2:
+ setRef2((DSL_REF_CONDITION)newValue);
+ return;
+ case SensinactPackage.DSL_CEP_COINCIDE__WINDOW:
+ setWindow((DSL_CEP_DURATION)newValue);
+ return;
+ }
+ super.eSet(featureID, newValue);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eUnset(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_CEP_COINCIDE__REF1:
+ setRef1((DSL_REF_CONDITION)null);
+ return;
+ case SensinactPackage.DSL_CEP_COINCIDE__REF2:
+ setRef2((DSL_REF_CONDITION)null);
+ return;
+ case SensinactPackage.DSL_CEP_COINCIDE__WINDOW:
+ setWindow((DSL_CEP_DURATION)null);
+ return;
+ }
+ super.eUnset(featureID);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public boolean eIsSet(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_CEP_COINCIDE__REF1:
+ return ref1 != null;
+ case SensinactPackage.DSL_CEP_COINCIDE__REF2:
+ return ref2 != null;
+ case SensinactPackage.DSL_CEP_COINCIDE__WINDOW:
+ return window != null;
+ }
+ return super.eIsSet(featureID);
+ }
+
+} //DSL_CEP_COINCIDEImpl
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_CEP_COUNTImpl.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_CEP_COUNTImpl.java
new file mode 100644
index 0000000..24cbb02
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_CEP_COUNTImpl.java
@@ -0,0 +1,277 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact.impl;
+
+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;
+
+import org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_COUNT;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_DURATION;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_REF_CONDITION;
+import org.eclipse.sensinact.studio.language.sensinact.SensinactPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>DSL CEP COUNT</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_COUNTImpl#getRef <em>Ref</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_COUNTImpl#getWindow <em>Window</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class DSL_CEP_COUNTImpl extends MinimalEObjectImpl.Container implements DSL_CEP_COUNT
+{
+ /**
+ * The cached value of the '{@link #getRef() <em>Ref</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getRef()
+ * @generated
+ * @ordered
+ */
+ protected DSL_REF_CONDITION ref;
+
+ /**
+ * The cached value of the '{@link #getWindow() <em>Window</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getWindow()
+ * @generated
+ * @ordered
+ */
+ protected DSL_CEP_DURATION window;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected DSL_CEP_COUNTImpl()
+ {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EClass eStaticClass()
+ {
+ return SensinactPackage.Literals.DSL_CEP_COUNT;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_REF_CONDITION getRef()
+ {
+ return ref;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public NotificationChain basicSetRef(DSL_REF_CONDITION newRef, NotificationChain msgs)
+ {
+ DSL_REF_CONDITION oldRef = ref;
+ ref = newRef;
+ if (eNotificationRequired())
+ {
+ ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_CEP_COUNT__REF, oldRef, newRef);
+ if (msgs == null) msgs = notification; else msgs.add(notification);
+ }
+ return msgs;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setRef(DSL_REF_CONDITION newRef)
+ {
+ if (newRef != ref)
+ {
+ NotificationChain msgs = null;
+ if (ref != null)
+ msgs = ((InternalEObject)ref).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_CEP_COUNT__REF, null, msgs);
+ if (newRef != null)
+ msgs = ((InternalEObject)newRef).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_CEP_COUNT__REF, null, msgs);
+ msgs = basicSetRef(newRef, msgs);
+ if (msgs != null) msgs.dispatch();
+ }
+ else if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_CEP_COUNT__REF, newRef, newRef));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_CEP_DURATION getWindow()
+ {
+ return window;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public NotificationChain basicSetWindow(DSL_CEP_DURATION newWindow, NotificationChain msgs)
+ {
+ DSL_CEP_DURATION oldWindow = window;
+ window = newWindow;
+ if (eNotificationRequired())
+ {
+ ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_CEP_COUNT__WINDOW, oldWindow, newWindow);
+ if (msgs == null) msgs = notification; else msgs.add(notification);
+ }
+ return msgs;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setWindow(DSL_CEP_DURATION newWindow)
+ {
+ if (newWindow != window)
+ {
+ NotificationChain msgs = null;
+ if (window != null)
+ msgs = ((InternalEObject)window).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_CEP_COUNT__WINDOW, null, msgs);
+ if (newWindow != null)
+ msgs = ((InternalEObject)newWindow).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_CEP_COUNT__WINDOW, null, msgs);
+ msgs = basicSetWindow(newWindow, msgs);
+ if (msgs != null) msgs.dispatch();
+ }
+ else if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_CEP_COUNT__WINDOW, newWindow, newWindow));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_CEP_COUNT__REF:
+ return basicSetRef(null, msgs);
+ case SensinactPackage.DSL_CEP_COUNT__WINDOW:
+ return basicSetWindow(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 SensinactPackage.DSL_CEP_COUNT__REF:
+ return getRef();
+ case SensinactPackage.DSL_CEP_COUNT__WINDOW:
+ return getWindow();
+ }
+ return super.eGet(featureID, resolve, coreType);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eSet(int featureID, Object newValue)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_CEP_COUNT__REF:
+ setRef((DSL_REF_CONDITION)newValue);
+ return;
+ case SensinactPackage.DSL_CEP_COUNT__WINDOW:
+ setWindow((DSL_CEP_DURATION)newValue);
+ return;
+ }
+ super.eSet(featureID, newValue);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eUnset(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_CEP_COUNT__REF:
+ setRef((DSL_REF_CONDITION)null);
+ return;
+ case SensinactPackage.DSL_CEP_COUNT__WINDOW:
+ setWindow((DSL_CEP_DURATION)null);
+ return;
+ }
+ super.eUnset(featureID);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public boolean eIsSet(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_CEP_COUNT__REF:
+ return ref != null;
+ case SensinactPackage.DSL_CEP_COUNT__WINDOW:
+ return window != null;
+ }
+ return super.eIsSet(featureID);
+ }
+
+} //DSL_CEP_COUNTImpl
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_CEP_DURATIONImpl.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_CEP_DURATIONImpl.java
new file mode 100644
index 0000000..20f666a
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_CEP_DURATIONImpl.java
@@ -0,0 +1,178 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact.impl;
+
+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.EObject;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+import org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_DURATION;
+import org.eclipse.sensinact.studio.language.sensinact.SensinactPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>DSL CEP DURATION</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_DURATIONImpl#getUnits <em>Units</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class DSL_CEP_DURATIONImpl extends MinimalEObjectImpl.Container implements DSL_CEP_DURATION
+{
+ /**
+ * The cached value of the '{@link #getUnits() <em>Units</em>}' containment reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getUnits()
+ * @generated
+ * @ordered
+ */
+ protected EList<EObject> units;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected DSL_CEP_DURATIONImpl()
+ {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EClass eStaticClass()
+ {
+ return SensinactPackage.Literals.DSL_CEP_DURATION;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EList<EObject> getUnits()
+ {
+ if (units == null)
+ {
+ units = new EObjectContainmentEList<EObject>(EObject.class, this, SensinactPackage.DSL_CEP_DURATION__UNITS);
+ }
+ return units;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_CEP_DURATION__UNITS:
+ return ((InternalEList<?>)getUnits()).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 SensinactPackage.DSL_CEP_DURATION__UNITS:
+ return getUnits();
+ }
+ 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 SensinactPackage.DSL_CEP_DURATION__UNITS:
+ getUnits().clear();
+ getUnits().addAll((Collection<? extends EObject>)newValue);
+ return;
+ }
+ super.eSet(featureID, newValue);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eUnset(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_CEP_DURATION__UNITS:
+ getUnits().clear();
+ return;
+ }
+ super.eUnset(featureID);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public boolean eIsSet(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_CEP_DURATION__UNITS:
+ return units != null && !units.isEmpty();
+ }
+ return super.eIsSet(featureID);
+ }
+
+} //DSL_CEP_DURATIONImpl
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_CEP_DURATION_MINImpl.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_CEP_DURATION_MINImpl.java
new file mode 100644
index 0000000..2fd2862
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_CEP_DURATION_MINImpl.java
@@ -0,0 +1,190 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact.impl;
+
+import java.math.BigDecimal;
+
+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;
+
+import org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_DURATION_MIN;
+import org.eclipse.sensinact.studio.language.sensinact.SensinactPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>DSL CEP DURATION MIN</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_DURATION_MINImpl#getMin <em>Min</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class DSL_CEP_DURATION_MINImpl extends MinimalEObjectImpl.Container implements DSL_CEP_DURATION_MIN
+{
+ /**
+ * The default value of the '{@link #getMin() <em>Min</em>}' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getMin()
+ * @generated
+ * @ordered
+ */
+ protected static final BigDecimal MIN_EDEFAULT = null;
+
+ /**
+ * The cached value of the '{@link #getMin() <em>Min</em>}' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getMin()
+ * @generated
+ * @ordered
+ */
+ protected BigDecimal min = MIN_EDEFAULT;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected DSL_CEP_DURATION_MINImpl()
+ {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EClass eStaticClass()
+ {
+ return SensinactPackage.Literals.DSL_CEP_DURATION_MIN;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public BigDecimal getMin()
+ {
+ return min;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setMin(BigDecimal newMin)
+ {
+ BigDecimal oldMin = min;
+ min = newMin;
+ if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_CEP_DURATION_MIN__MIN, oldMin, min));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Object eGet(int featureID, boolean resolve, boolean coreType)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_CEP_DURATION_MIN__MIN:
+ return getMin();
+ }
+ return super.eGet(featureID, resolve, coreType);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eSet(int featureID, Object newValue)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_CEP_DURATION_MIN__MIN:
+ setMin((BigDecimal)newValue);
+ return;
+ }
+ super.eSet(featureID, newValue);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eUnset(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_CEP_DURATION_MIN__MIN:
+ setMin(MIN_EDEFAULT);
+ return;
+ }
+ super.eUnset(featureID);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public boolean eIsSet(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_CEP_DURATION_MIN__MIN:
+ return MIN_EDEFAULT == null ? min != null : !MIN_EDEFAULT.equals(min);
+ }
+ 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(" (min: ");
+ result.append(min);
+ result.append(')');
+ return result.toString();
+ }
+
+} //DSL_CEP_DURATION_MINImpl
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_CEP_DURATION_SECImpl.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_CEP_DURATION_SECImpl.java
new file mode 100644
index 0000000..d28b6b7
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_CEP_DURATION_SECImpl.java
@@ -0,0 +1,190 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact.impl;
+
+import java.math.BigDecimal;
+
+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;
+
+import org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_DURATION_SEC;
+import org.eclipse.sensinact.studio.language.sensinact.SensinactPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>DSL CEP DURATION SEC</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_DURATION_SECImpl#getSec <em>Sec</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class DSL_CEP_DURATION_SECImpl extends MinimalEObjectImpl.Container implements DSL_CEP_DURATION_SEC
+{
+ /**
+ * The default value of the '{@link #getSec() <em>Sec</em>}' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getSec()
+ * @generated
+ * @ordered
+ */
+ protected static final BigDecimal SEC_EDEFAULT = null;
+
+ /**
+ * The cached value of the '{@link #getSec() <em>Sec</em>}' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getSec()
+ * @generated
+ * @ordered
+ */
+ protected BigDecimal sec = SEC_EDEFAULT;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected DSL_CEP_DURATION_SECImpl()
+ {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EClass eStaticClass()
+ {
+ return SensinactPackage.Literals.DSL_CEP_DURATION_SEC;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public BigDecimal getSec()
+ {
+ return sec;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setSec(BigDecimal newSec)
+ {
+ BigDecimal oldSec = sec;
+ sec = newSec;
+ if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_CEP_DURATION_SEC__SEC, oldSec, sec));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Object eGet(int featureID, boolean resolve, boolean coreType)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_CEP_DURATION_SEC__SEC:
+ return getSec();
+ }
+ return super.eGet(featureID, resolve, coreType);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eSet(int featureID, Object newValue)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_CEP_DURATION_SEC__SEC:
+ setSec((BigDecimal)newValue);
+ return;
+ }
+ super.eSet(featureID, newValue);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eUnset(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_CEP_DURATION_SEC__SEC:
+ setSec(SEC_EDEFAULT);
+ return;
+ }
+ super.eUnset(featureID);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public boolean eIsSet(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_CEP_DURATION_SEC__SEC:
+ return SEC_EDEFAULT == null ? sec != null : !SEC_EDEFAULT.equals(sec);
+ }
+ 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(" (sec: ");
+ result.append(sec);
+ result.append(')');
+ return result.toString();
+ }
+
+} //DSL_CEP_DURATION_SECImpl
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_CEP_MAXImpl.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_CEP_MAXImpl.java
new file mode 100644
index 0000000..12efeb3
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_CEP_MAXImpl.java
@@ -0,0 +1,277 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact.impl;
+
+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;
+
+import org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_DURATION;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_MAX;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_REF_CONDITION;
+import org.eclipse.sensinact.studio.language.sensinact.SensinactPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>DSL CEP MAX</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_MAXImpl#getRef <em>Ref</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_MAXImpl#getWindow <em>Window</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class DSL_CEP_MAXImpl extends MinimalEObjectImpl.Container implements DSL_CEP_MAX
+{
+ /**
+ * The cached value of the '{@link #getRef() <em>Ref</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getRef()
+ * @generated
+ * @ordered
+ */
+ protected DSL_REF_CONDITION ref;
+
+ /**
+ * The cached value of the '{@link #getWindow() <em>Window</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getWindow()
+ * @generated
+ * @ordered
+ */
+ protected DSL_CEP_DURATION window;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected DSL_CEP_MAXImpl()
+ {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EClass eStaticClass()
+ {
+ return SensinactPackage.Literals.DSL_CEP_MAX;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_REF_CONDITION getRef()
+ {
+ return ref;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public NotificationChain basicSetRef(DSL_REF_CONDITION newRef, NotificationChain msgs)
+ {
+ DSL_REF_CONDITION oldRef = ref;
+ ref = newRef;
+ if (eNotificationRequired())
+ {
+ ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_CEP_MAX__REF, oldRef, newRef);
+ if (msgs == null) msgs = notification; else msgs.add(notification);
+ }
+ return msgs;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setRef(DSL_REF_CONDITION newRef)
+ {
+ if (newRef != ref)
+ {
+ NotificationChain msgs = null;
+ if (ref != null)
+ msgs = ((InternalEObject)ref).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_CEP_MAX__REF, null, msgs);
+ if (newRef != null)
+ msgs = ((InternalEObject)newRef).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_CEP_MAX__REF, null, msgs);
+ msgs = basicSetRef(newRef, msgs);
+ if (msgs != null) msgs.dispatch();
+ }
+ else if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_CEP_MAX__REF, newRef, newRef));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_CEP_DURATION getWindow()
+ {
+ return window;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public NotificationChain basicSetWindow(DSL_CEP_DURATION newWindow, NotificationChain msgs)
+ {
+ DSL_CEP_DURATION oldWindow = window;
+ window = newWindow;
+ if (eNotificationRequired())
+ {
+ ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_CEP_MAX__WINDOW, oldWindow, newWindow);
+ if (msgs == null) msgs = notification; else msgs.add(notification);
+ }
+ return msgs;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setWindow(DSL_CEP_DURATION newWindow)
+ {
+ if (newWindow != window)
+ {
+ NotificationChain msgs = null;
+ if (window != null)
+ msgs = ((InternalEObject)window).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_CEP_MAX__WINDOW, null, msgs);
+ if (newWindow != null)
+ msgs = ((InternalEObject)newWindow).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_CEP_MAX__WINDOW, null, msgs);
+ msgs = basicSetWindow(newWindow, msgs);
+ if (msgs != null) msgs.dispatch();
+ }
+ else if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_CEP_MAX__WINDOW, newWindow, newWindow));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_CEP_MAX__REF:
+ return basicSetRef(null, msgs);
+ case SensinactPackage.DSL_CEP_MAX__WINDOW:
+ return basicSetWindow(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 SensinactPackage.DSL_CEP_MAX__REF:
+ return getRef();
+ case SensinactPackage.DSL_CEP_MAX__WINDOW:
+ return getWindow();
+ }
+ return super.eGet(featureID, resolve, coreType);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eSet(int featureID, Object newValue)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_CEP_MAX__REF:
+ setRef((DSL_REF_CONDITION)newValue);
+ return;
+ case SensinactPackage.DSL_CEP_MAX__WINDOW:
+ setWindow((DSL_CEP_DURATION)newValue);
+ return;
+ }
+ super.eSet(featureID, newValue);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eUnset(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_CEP_MAX__REF:
+ setRef((DSL_REF_CONDITION)null);
+ return;
+ case SensinactPackage.DSL_CEP_MAX__WINDOW:
+ setWindow((DSL_CEP_DURATION)null);
+ return;
+ }
+ super.eUnset(featureID);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public boolean eIsSet(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_CEP_MAX__REF:
+ return ref != null;
+ case SensinactPackage.DSL_CEP_MAX__WINDOW:
+ return window != null;
+ }
+ return super.eIsSet(featureID);
+ }
+
+} //DSL_CEP_MAXImpl
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_CEP_MINImpl.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_CEP_MINImpl.java
new file mode 100644
index 0000000..a469cb6
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_CEP_MINImpl.java
@@ -0,0 +1,277 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact.impl;
+
+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;
+
+import org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_DURATION;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_MIN;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_REF_CONDITION;
+import org.eclipse.sensinact.studio.language.sensinact.SensinactPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>DSL CEP MIN</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_MINImpl#getRef <em>Ref</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_MINImpl#getWindow <em>Window</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class DSL_CEP_MINImpl extends MinimalEObjectImpl.Container implements DSL_CEP_MIN
+{
+ /**
+ * The cached value of the '{@link #getRef() <em>Ref</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getRef()
+ * @generated
+ * @ordered
+ */
+ protected DSL_REF_CONDITION ref;
+
+ /**
+ * The cached value of the '{@link #getWindow() <em>Window</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getWindow()
+ * @generated
+ * @ordered
+ */
+ protected DSL_CEP_DURATION window;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected DSL_CEP_MINImpl()
+ {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EClass eStaticClass()
+ {
+ return SensinactPackage.Literals.DSL_CEP_MIN;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_REF_CONDITION getRef()
+ {
+ return ref;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public NotificationChain basicSetRef(DSL_REF_CONDITION newRef, NotificationChain msgs)
+ {
+ DSL_REF_CONDITION oldRef = ref;
+ ref = newRef;
+ if (eNotificationRequired())
+ {
+ ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_CEP_MIN__REF, oldRef, newRef);
+ if (msgs == null) msgs = notification; else msgs.add(notification);
+ }
+ return msgs;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setRef(DSL_REF_CONDITION newRef)
+ {
+ if (newRef != ref)
+ {
+ NotificationChain msgs = null;
+ if (ref != null)
+ msgs = ((InternalEObject)ref).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_CEP_MIN__REF, null, msgs);
+ if (newRef != null)
+ msgs = ((InternalEObject)newRef).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_CEP_MIN__REF, null, msgs);
+ msgs = basicSetRef(newRef, msgs);
+ if (msgs != null) msgs.dispatch();
+ }
+ else if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_CEP_MIN__REF, newRef, newRef));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_CEP_DURATION getWindow()
+ {
+ return window;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public NotificationChain basicSetWindow(DSL_CEP_DURATION newWindow, NotificationChain msgs)
+ {
+ DSL_CEP_DURATION oldWindow = window;
+ window = newWindow;
+ if (eNotificationRequired())
+ {
+ ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_CEP_MIN__WINDOW, oldWindow, newWindow);
+ if (msgs == null) msgs = notification; else msgs.add(notification);
+ }
+ return msgs;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setWindow(DSL_CEP_DURATION newWindow)
+ {
+ if (newWindow != window)
+ {
+ NotificationChain msgs = null;
+ if (window != null)
+ msgs = ((InternalEObject)window).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_CEP_MIN__WINDOW, null, msgs);
+ if (newWindow != null)
+ msgs = ((InternalEObject)newWindow).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_CEP_MIN__WINDOW, null, msgs);
+ msgs = basicSetWindow(newWindow, msgs);
+ if (msgs != null) msgs.dispatch();
+ }
+ else if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_CEP_MIN__WINDOW, newWindow, newWindow));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_CEP_MIN__REF:
+ return basicSetRef(null, msgs);
+ case SensinactPackage.DSL_CEP_MIN__WINDOW:
+ return basicSetWindow(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 SensinactPackage.DSL_CEP_MIN__REF:
+ return getRef();
+ case SensinactPackage.DSL_CEP_MIN__WINDOW:
+ return getWindow();
+ }
+ return super.eGet(featureID, resolve, coreType);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eSet(int featureID, Object newValue)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_CEP_MIN__REF:
+ setRef((DSL_REF_CONDITION)newValue);
+ return;
+ case SensinactPackage.DSL_CEP_MIN__WINDOW:
+ setWindow((DSL_CEP_DURATION)newValue);
+ return;
+ }
+ super.eSet(featureID, newValue);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eUnset(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_CEP_MIN__REF:
+ setRef((DSL_REF_CONDITION)null);
+ return;
+ case SensinactPackage.DSL_CEP_MIN__WINDOW:
+ setWindow((DSL_CEP_DURATION)null);
+ return;
+ }
+ super.eUnset(featureID);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public boolean eIsSet(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_CEP_MIN__REF:
+ return ref != null;
+ case SensinactPackage.DSL_CEP_MIN__WINDOW:
+ return window != null;
+ }
+ return super.eIsSet(featureID);
+ }
+
+} //DSL_CEP_MINImpl
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_CEP_STATEMENTImpl.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_CEP_STATEMENTImpl.java
new file mode 100644
index 0000000..04c0400
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_CEP_STATEMENTImpl.java
@@ -0,0 +1,204 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact.impl;
+
+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.EObject;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_STATEMENT;
+import org.eclipse.sensinact.studio.language.sensinact.SensinactPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>DSL CEP STATEMENT</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_STATEMENTImpl#getOperation <em>Operation</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class DSL_CEP_STATEMENTImpl extends DSL_REFImpl implements DSL_CEP_STATEMENT
+{
+ /**
+ * The cached value of the '{@link #getOperation() <em>Operation</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getOperation()
+ * @generated
+ * @ordered
+ */
+ protected EObject operation;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected DSL_CEP_STATEMENTImpl()
+ {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EClass eStaticClass()
+ {
+ return SensinactPackage.Literals.DSL_CEP_STATEMENT;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EObject getOperation()
+ {
+ return operation;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public NotificationChain basicSetOperation(EObject newOperation, NotificationChain msgs)
+ {
+ EObject oldOperation = operation;
+ operation = newOperation;
+ if (eNotificationRequired())
+ {
+ ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_CEP_STATEMENT__OPERATION, oldOperation, newOperation);
+ if (msgs == null) msgs = notification; else msgs.add(notification);
+ }
+ return msgs;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setOperation(EObject newOperation)
+ {
+ if (newOperation != operation)
+ {
+ NotificationChain msgs = null;
+ if (operation != null)
+ msgs = ((InternalEObject)operation).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_CEP_STATEMENT__OPERATION, null, msgs);
+ if (newOperation != null)
+ msgs = ((InternalEObject)newOperation).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_CEP_STATEMENT__OPERATION, null, msgs);
+ msgs = basicSetOperation(newOperation, msgs);
+ if (msgs != null) msgs.dispatch();
+ }
+ else if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_CEP_STATEMENT__OPERATION, newOperation, newOperation));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_CEP_STATEMENT__OPERATION:
+ return basicSetOperation(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 SensinactPackage.DSL_CEP_STATEMENT__OPERATION:
+ return getOperation();
+ }
+ return super.eGet(featureID, resolve, coreType);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eSet(int featureID, Object newValue)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_CEP_STATEMENT__OPERATION:
+ setOperation((EObject)newValue);
+ return;
+ }
+ super.eSet(featureID, newValue);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eUnset(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_CEP_STATEMENT__OPERATION:
+ setOperation((EObject)null);
+ return;
+ }
+ super.eUnset(featureID);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public boolean eIsSet(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_CEP_STATEMENT__OPERATION:
+ return operation != null;
+ }
+ return super.eIsSet(featureID);
+ }
+
+} //DSL_CEP_STATEMENTImpl
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_CEP_SUMImpl.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_CEP_SUMImpl.java
new file mode 100644
index 0000000..42e59a4
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_CEP_SUMImpl.java
@@ -0,0 +1,277 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact.impl;
+
+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;
+
+import org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_DURATION;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_SUM;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_REF_CONDITION;
+import org.eclipse.sensinact.studio.language.sensinact.SensinactPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>DSL CEP SUM</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_SUMImpl#getRef <em>Ref</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_CEP_SUMImpl#getWindow <em>Window</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class DSL_CEP_SUMImpl extends MinimalEObjectImpl.Container implements DSL_CEP_SUM
+{
+ /**
+ * The cached value of the '{@link #getRef() <em>Ref</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getRef()
+ * @generated
+ * @ordered
+ */
+ protected DSL_REF_CONDITION ref;
+
+ /**
+ * The cached value of the '{@link #getWindow() <em>Window</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getWindow()
+ * @generated
+ * @ordered
+ */
+ protected DSL_CEP_DURATION window;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected DSL_CEP_SUMImpl()
+ {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EClass eStaticClass()
+ {
+ return SensinactPackage.Literals.DSL_CEP_SUM;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_REF_CONDITION getRef()
+ {
+ return ref;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public NotificationChain basicSetRef(DSL_REF_CONDITION newRef, NotificationChain msgs)
+ {
+ DSL_REF_CONDITION oldRef = ref;
+ ref = newRef;
+ if (eNotificationRequired())
+ {
+ ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_CEP_SUM__REF, oldRef, newRef);
+ if (msgs == null) msgs = notification; else msgs.add(notification);
+ }
+ return msgs;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setRef(DSL_REF_CONDITION newRef)
+ {
+ if (newRef != ref)
+ {
+ NotificationChain msgs = null;
+ if (ref != null)
+ msgs = ((InternalEObject)ref).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_CEP_SUM__REF, null, msgs);
+ if (newRef != null)
+ msgs = ((InternalEObject)newRef).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_CEP_SUM__REF, null, msgs);
+ msgs = basicSetRef(newRef, msgs);
+ if (msgs != null) msgs.dispatch();
+ }
+ else if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_CEP_SUM__REF, newRef, newRef));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_CEP_DURATION getWindow()
+ {
+ return window;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public NotificationChain basicSetWindow(DSL_CEP_DURATION newWindow, NotificationChain msgs)
+ {
+ DSL_CEP_DURATION oldWindow = window;
+ window = newWindow;
+ if (eNotificationRequired())
+ {
+ ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_CEP_SUM__WINDOW, oldWindow, newWindow);
+ if (msgs == null) msgs = notification; else msgs.add(notification);
+ }
+ return msgs;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setWindow(DSL_CEP_DURATION newWindow)
+ {
+ if (newWindow != window)
+ {
+ NotificationChain msgs = null;
+ if (window != null)
+ msgs = ((InternalEObject)window).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_CEP_SUM__WINDOW, null, msgs);
+ if (newWindow != null)
+ msgs = ((InternalEObject)newWindow).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_CEP_SUM__WINDOW, null, msgs);
+ msgs = basicSetWindow(newWindow, msgs);
+ if (msgs != null) msgs.dispatch();
+ }
+ else if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_CEP_SUM__WINDOW, newWindow, newWindow));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_CEP_SUM__REF:
+ return basicSetRef(null, msgs);
+ case SensinactPackage.DSL_CEP_SUM__WINDOW:
+ return basicSetWindow(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 SensinactPackage.DSL_CEP_SUM__REF:
+ return getRef();
+ case SensinactPackage.DSL_CEP_SUM__WINDOW:
+ return getWindow();
+ }
+ return super.eGet(featureID, resolve, coreType);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eSet(int featureID, Object newValue)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_CEP_SUM__REF:
+ setRef((DSL_REF_CONDITION)newValue);
+ return;
+ case SensinactPackage.DSL_CEP_SUM__WINDOW:
+ setWindow((DSL_CEP_DURATION)newValue);
+ return;
+ }
+ super.eSet(featureID, newValue);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eUnset(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_CEP_SUM__REF:
+ setRef((DSL_REF_CONDITION)null);
+ return;
+ case SensinactPackage.DSL_CEP_SUM__WINDOW:
+ setWindow((DSL_CEP_DURATION)null);
+ return;
+ }
+ super.eUnset(featureID);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public boolean eIsSet(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_CEP_SUM__REF:
+ return ref != null;
+ case SensinactPackage.DSL_CEP_SUM__WINDOW:
+ return window != null;
+ }
+ return super.eIsSet(featureID);
+ }
+
+} //DSL_CEP_SUMImpl
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_ECA_STATEMENTImpl.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_ECA_STATEMENTImpl.java
new file mode 100644
index 0000000..1717e55
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_ECA_STATEMENTImpl.java
@@ -0,0 +1,324 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact.impl;
+
+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;
+
+import org.eclipse.sensinact.studio.language.sensinact.DSL_ECA_STATEMENT;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_ElseDo;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_ElseIfDo;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_IfDo;
+import org.eclipse.sensinact.studio.language.sensinact.SensinactPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>DSL ECA STATEMENT</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_ECA_STATEMENTImpl#getIfdo <em>Ifdo</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_ECA_STATEMENTImpl#getElseIfdo <em>Else Ifdo</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_ECA_STATEMENTImpl#getElsedo <em>Elsedo</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class DSL_ECA_STATEMENTImpl extends MinimalEObjectImpl.Container implements DSL_ECA_STATEMENT
+{
+ /**
+ * The cached value of the '{@link #getIfdo() <em>Ifdo</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getIfdo()
+ * @generated
+ * @ordered
+ */
+ protected DSL_IfDo ifdo;
+
+ /**
+ * The cached value of the '{@link #getElseIfdo() <em>Else Ifdo</em>}' containment reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getElseIfdo()
+ * @generated
+ * @ordered
+ */
+ protected EList<DSL_ElseIfDo> elseIfdo;
+
+ /**
+ * The cached value of the '{@link #getElsedo() <em>Elsedo</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getElsedo()
+ * @generated
+ * @ordered
+ */
+ protected DSL_ElseDo elsedo;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected DSL_ECA_STATEMENTImpl()
+ {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EClass eStaticClass()
+ {
+ return SensinactPackage.Literals.DSL_ECA_STATEMENT;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_IfDo getIfdo()
+ {
+ return ifdo;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public NotificationChain basicSetIfdo(DSL_IfDo newIfdo, NotificationChain msgs)
+ {
+ DSL_IfDo oldIfdo = ifdo;
+ ifdo = newIfdo;
+ if (eNotificationRequired())
+ {
+ ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_ECA_STATEMENT__IFDO, oldIfdo, newIfdo);
+ if (msgs == null) msgs = notification; else msgs.add(notification);
+ }
+ return msgs;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setIfdo(DSL_IfDo newIfdo)
+ {
+ if (newIfdo != ifdo)
+ {
+ NotificationChain msgs = null;
+ if (ifdo != null)
+ msgs = ((InternalEObject)ifdo).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_ECA_STATEMENT__IFDO, null, msgs);
+ if (newIfdo != null)
+ msgs = ((InternalEObject)newIfdo).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_ECA_STATEMENT__IFDO, null, msgs);
+ msgs = basicSetIfdo(newIfdo, msgs);
+ if (msgs != null) msgs.dispatch();
+ }
+ else if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_ECA_STATEMENT__IFDO, newIfdo, newIfdo));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EList<DSL_ElseIfDo> getElseIfdo()
+ {
+ if (elseIfdo == null)
+ {
+ elseIfdo = new EObjectContainmentEList<DSL_ElseIfDo>(DSL_ElseIfDo.class, this, SensinactPackage.DSL_ECA_STATEMENT__ELSE_IFDO);
+ }
+ return elseIfdo;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_ElseDo getElsedo()
+ {
+ return elsedo;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public NotificationChain basicSetElsedo(DSL_ElseDo newElsedo, NotificationChain msgs)
+ {
+ DSL_ElseDo oldElsedo = elsedo;
+ elsedo = newElsedo;
+ if (eNotificationRequired())
+ {
+ ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_ECA_STATEMENT__ELSEDO, oldElsedo, newElsedo);
+ if (msgs == null) msgs = notification; else msgs.add(notification);
+ }
+ return msgs;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setElsedo(DSL_ElseDo newElsedo)
+ {
+ if (newElsedo != elsedo)
+ {
+ NotificationChain msgs = null;
+ if (elsedo != null)
+ msgs = ((InternalEObject)elsedo).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_ECA_STATEMENT__ELSEDO, null, msgs);
+ if (newElsedo != null)
+ msgs = ((InternalEObject)newElsedo).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_ECA_STATEMENT__ELSEDO, null, msgs);
+ msgs = basicSetElsedo(newElsedo, msgs);
+ if (msgs != null) msgs.dispatch();
+ }
+ else if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_ECA_STATEMENT__ELSEDO, newElsedo, newElsedo));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_ECA_STATEMENT__IFDO:
+ return basicSetIfdo(null, msgs);
+ case SensinactPackage.DSL_ECA_STATEMENT__ELSE_IFDO:
+ return ((InternalEList<?>)getElseIfdo()).basicRemove(otherEnd, msgs);
+ case SensinactPackage.DSL_ECA_STATEMENT__ELSEDO:
+ return basicSetElsedo(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 SensinactPackage.DSL_ECA_STATEMENT__IFDO:
+ return getIfdo();
+ case SensinactPackage.DSL_ECA_STATEMENT__ELSE_IFDO:
+ return getElseIfdo();
+ case SensinactPackage.DSL_ECA_STATEMENT__ELSEDO:
+ return getElsedo();
+ }
+ 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 SensinactPackage.DSL_ECA_STATEMENT__IFDO:
+ setIfdo((DSL_IfDo)newValue);
+ return;
+ case SensinactPackage.DSL_ECA_STATEMENT__ELSE_IFDO:
+ getElseIfdo().clear();
+ getElseIfdo().addAll((Collection<? extends DSL_ElseIfDo>)newValue);
+ return;
+ case SensinactPackage.DSL_ECA_STATEMENT__ELSEDO:
+ setElsedo((DSL_ElseDo)newValue);
+ return;
+ }
+ super.eSet(featureID, newValue);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eUnset(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_ECA_STATEMENT__IFDO:
+ setIfdo((DSL_IfDo)null);
+ return;
+ case SensinactPackage.DSL_ECA_STATEMENT__ELSE_IFDO:
+ getElseIfdo().clear();
+ return;
+ case SensinactPackage.DSL_ECA_STATEMENT__ELSEDO:
+ setElsedo((DSL_ElseDo)null);
+ return;
+ }
+ super.eUnset(featureID);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public boolean eIsSet(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_ECA_STATEMENT__IFDO:
+ return ifdo != null;
+ case SensinactPackage.DSL_ECA_STATEMENT__ELSE_IFDO:
+ return elseIfdo != null && !elseIfdo.isEmpty();
+ case SensinactPackage.DSL_ECA_STATEMENT__ELSEDO:
+ return elsedo != null;
+ }
+ return super.eIsSet(featureID);
+ }
+
+} //DSL_ECA_STATEMENTImpl
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_ElseDoImpl.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_ElseDoImpl.java
new file mode 100644
index 0000000..bca6fbc
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_ElseDoImpl.java
@@ -0,0 +1,205 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact.impl;
+
+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;
+
+import org.eclipse.sensinact.studio.language.sensinact.DSL_ElseDo;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_ListActions;
+import org.eclipse.sensinact.studio.language.sensinact.SensinactPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>DSL Else Do</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_ElseDoImpl#getActions <em>Actions</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class DSL_ElseDoImpl extends MinimalEObjectImpl.Container implements DSL_ElseDo
+{
+ /**
+ * The cached value of the '{@link #getActions() <em>Actions</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getActions()
+ * @generated
+ * @ordered
+ */
+ protected DSL_ListActions actions;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected DSL_ElseDoImpl()
+ {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EClass eStaticClass()
+ {
+ return SensinactPackage.Literals.DSL_ELSE_DO;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_ListActions getActions()
+ {
+ return actions;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public NotificationChain basicSetActions(DSL_ListActions newActions, NotificationChain msgs)
+ {
+ DSL_ListActions oldActions = actions;
+ actions = newActions;
+ if (eNotificationRequired())
+ {
+ ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_ELSE_DO__ACTIONS, oldActions, newActions);
+ if (msgs == null) msgs = notification; else msgs.add(notification);
+ }
+ return msgs;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setActions(DSL_ListActions newActions)
+ {
+ if (newActions != actions)
+ {
+ NotificationChain msgs = null;
+ if (actions != null)
+ msgs = ((InternalEObject)actions).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_ELSE_DO__ACTIONS, null, msgs);
+ if (newActions != null)
+ msgs = ((InternalEObject)newActions).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_ELSE_DO__ACTIONS, null, msgs);
+ msgs = basicSetActions(newActions, msgs);
+ if (msgs != null) msgs.dispatch();
+ }
+ else if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_ELSE_DO__ACTIONS, newActions, newActions));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_ELSE_DO__ACTIONS:
+ return basicSetActions(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 SensinactPackage.DSL_ELSE_DO__ACTIONS:
+ return getActions();
+ }
+ return super.eGet(featureID, resolve, coreType);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eSet(int featureID, Object newValue)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_ELSE_DO__ACTIONS:
+ setActions((DSL_ListActions)newValue);
+ return;
+ }
+ super.eSet(featureID, newValue);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eUnset(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_ELSE_DO__ACTIONS:
+ setActions((DSL_ListActions)null);
+ return;
+ }
+ super.eUnset(featureID);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public boolean eIsSet(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_ELSE_DO__ACTIONS:
+ return actions != null;
+ }
+ return super.eIsSet(featureID);
+ }
+
+} //DSL_ElseDoImpl
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_ElseIfDoImpl.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_ElseIfDoImpl.java
new file mode 100644
index 0000000..a9ca6fa
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_ElseIfDoImpl.java
@@ -0,0 +1,277 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact.impl;
+
+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;
+
+import org.eclipse.sensinact.studio.language.sensinact.DSL_ElseIfDo;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Expression;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_ListActions;
+import org.eclipse.sensinact.studio.language.sensinact.SensinactPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>DSL Else If Do</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_ElseIfDoImpl#getCondition <em>Condition</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_ElseIfDoImpl#getActions <em>Actions</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class DSL_ElseIfDoImpl extends MinimalEObjectImpl.Container implements DSL_ElseIfDo
+{
+ /**
+ * The cached value of the '{@link #getCondition() <em>Condition</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getCondition()
+ * @generated
+ * @ordered
+ */
+ protected DSL_Expression condition;
+
+ /**
+ * The cached value of the '{@link #getActions() <em>Actions</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getActions()
+ * @generated
+ * @ordered
+ */
+ protected DSL_ListActions actions;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected DSL_ElseIfDoImpl()
+ {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EClass eStaticClass()
+ {
+ return SensinactPackage.Literals.DSL_ELSE_IF_DO;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_Expression getCondition()
+ {
+ return condition;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public NotificationChain basicSetCondition(DSL_Expression newCondition, NotificationChain msgs)
+ {
+ DSL_Expression oldCondition = condition;
+ condition = newCondition;
+ if (eNotificationRequired())
+ {
+ ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_ELSE_IF_DO__CONDITION, oldCondition, newCondition);
+ if (msgs == null) msgs = notification; else msgs.add(notification);
+ }
+ return msgs;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setCondition(DSL_Expression newCondition)
+ {
+ if (newCondition != condition)
+ {
+ NotificationChain msgs = null;
+ if (condition != null)
+ msgs = ((InternalEObject)condition).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_ELSE_IF_DO__CONDITION, null, msgs);
+ if (newCondition != null)
+ msgs = ((InternalEObject)newCondition).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_ELSE_IF_DO__CONDITION, null, msgs);
+ msgs = basicSetCondition(newCondition, msgs);
+ if (msgs != null) msgs.dispatch();
+ }
+ else if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_ELSE_IF_DO__CONDITION, newCondition, newCondition));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_ListActions getActions()
+ {
+ return actions;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public NotificationChain basicSetActions(DSL_ListActions newActions, NotificationChain msgs)
+ {
+ DSL_ListActions oldActions = actions;
+ actions = newActions;
+ if (eNotificationRequired())
+ {
+ ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_ELSE_IF_DO__ACTIONS, oldActions, newActions);
+ if (msgs == null) msgs = notification; else msgs.add(notification);
+ }
+ return msgs;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setActions(DSL_ListActions newActions)
+ {
+ if (newActions != actions)
+ {
+ NotificationChain msgs = null;
+ if (actions != null)
+ msgs = ((InternalEObject)actions).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_ELSE_IF_DO__ACTIONS, null, msgs);
+ if (newActions != null)
+ msgs = ((InternalEObject)newActions).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_ELSE_IF_DO__ACTIONS, null, msgs);
+ msgs = basicSetActions(newActions, msgs);
+ if (msgs != null) msgs.dispatch();
+ }
+ else if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_ELSE_IF_DO__ACTIONS, newActions, newActions));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_ELSE_IF_DO__CONDITION:
+ return basicSetCondition(null, msgs);
+ case SensinactPackage.DSL_ELSE_IF_DO__ACTIONS:
+ return basicSetActions(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 SensinactPackage.DSL_ELSE_IF_DO__CONDITION:
+ return getCondition();
+ case SensinactPackage.DSL_ELSE_IF_DO__ACTIONS:
+ return getActions();
+ }
+ return super.eGet(featureID, resolve, coreType);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eSet(int featureID, Object newValue)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_ELSE_IF_DO__CONDITION:
+ setCondition((DSL_Expression)newValue);
+ return;
+ case SensinactPackage.DSL_ELSE_IF_DO__ACTIONS:
+ setActions((DSL_ListActions)newValue);
+ return;
+ }
+ super.eSet(featureID, newValue);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eUnset(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_ELSE_IF_DO__CONDITION:
+ setCondition((DSL_Expression)null);
+ return;
+ case SensinactPackage.DSL_ELSE_IF_DO__ACTIONS:
+ setActions((DSL_ListActions)null);
+ return;
+ }
+ super.eUnset(featureID);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public boolean eIsSet(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_ELSE_IF_DO__CONDITION:
+ return condition != null;
+ case SensinactPackage.DSL_ELSE_IF_DO__ACTIONS:
+ return actions != null;
+ }
+ return super.eIsSet(featureID);
+ }
+
+} //DSL_ElseIfDoImpl
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_ExpressionImpl.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_ExpressionImpl.java
new file mode 100644
index 0000000..6187620
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_ExpressionImpl.java
@@ -0,0 +1,53 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact.impl;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Expression;
+import org.eclipse.sensinact.studio.language.sensinact.SensinactPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>DSL Expression</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+public class DSL_ExpressionImpl extends MinimalEObjectImpl.Container implements DSL_Expression
+{
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected DSL_ExpressionImpl()
+ {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EClass eStaticClass()
+ {
+ return SensinactPackage.Literals.DSL_EXPRESSION;
+ }
+
+} //DSL_ExpressionImpl
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_Expression_AndImpl.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_Expression_AndImpl.java
new file mode 100644
index 0000000..c488b27
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_Expression_AndImpl.java
@@ -0,0 +1,275 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact.impl;
+
+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.sensinact.studio.language.sensinact.DSL_Expression;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_And;
+import org.eclipse.sensinact.studio.language.sensinact.SensinactPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>DSL Expression And</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_AndImpl#getLeft <em>Left</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_AndImpl#getRight <em>Right</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class DSL_Expression_AndImpl extends DSL_ExpressionImpl implements DSL_Expression_And
+{
+ /**
+ * The cached value of the '{@link #getLeft() <em>Left</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getLeft()
+ * @generated
+ * @ordered
+ */
+ protected DSL_Expression left;
+
+ /**
+ * The cached value of the '{@link #getRight() <em>Right</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getRight()
+ * @generated
+ * @ordered
+ */
+ protected DSL_Expression right;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected DSL_Expression_AndImpl()
+ {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EClass eStaticClass()
+ {
+ return SensinactPackage.Literals.DSL_EXPRESSION_AND;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_Expression getLeft()
+ {
+ return left;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public NotificationChain basicSetLeft(DSL_Expression newLeft, NotificationChain msgs)
+ {
+ DSL_Expression oldLeft = left;
+ left = newLeft;
+ if (eNotificationRequired())
+ {
+ ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_EXPRESSION_AND__LEFT, oldLeft, newLeft);
+ if (msgs == null) msgs = notification; else msgs.add(notification);
+ }
+ return msgs;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setLeft(DSL_Expression newLeft)
+ {
+ if (newLeft != left)
+ {
+ NotificationChain msgs = null;
+ if (left != null)
+ msgs = ((InternalEObject)left).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_EXPRESSION_AND__LEFT, null, msgs);
+ if (newLeft != null)
+ msgs = ((InternalEObject)newLeft).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_EXPRESSION_AND__LEFT, null, msgs);
+ msgs = basicSetLeft(newLeft, msgs);
+ if (msgs != null) msgs.dispatch();
+ }
+ else if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_EXPRESSION_AND__LEFT, newLeft, newLeft));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_Expression getRight()
+ {
+ return right;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public NotificationChain basicSetRight(DSL_Expression newRight, NotificationChain msgs)
+ {
+ DSL_Expression oldRight = right;
+ right = newRight;
+ if (eNotificationRequired())
+ {
+ ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_EXPRESSION_AND__RIGHT, oldRight, newRight);
+ if (msgs == null) msgs = notification; else msgs.add(notification);
+ }
+ return msgs;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setRight(DSL_Expression newRight)
+ {
+ if (newRight != right)
+ {
+ NotificationChain msgs = null;
+ if (right != null)
+ msgs = ((InternalEObject)right).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_EXPRESSION_AND__RIGHT, null, msgs);
+ if (newRight != null)
+ msgs = ((InternalEObject)newRight).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_EXPRESSION_AND__RIGHT, null, msgs);
+ msgs = basicSetRight(newRight, msgs);
+ if (msgs != null) msgs.dispatch();
+ }
+ else if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_EXPRESSION_AND__RIGHT, newRight, newRight));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_EXPRESSION_AND__LEFT:
+ return basicSetLeft(null, msgs);
+ case SensinactPackage.DSL_EXPRESSION_AND__RIGHT:
+ return basicSetRight(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 SensinactPackage.DSL_EXPRESSION_AND__LEFT:
+ return getLeft();
+ case SensinactPackage.DSL_EXPRESSION_AND__RIGHT:
+ return getRight();
+ }
+ return super.eGet(featureID, resolve, coreType);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eSet(int featureID, Object newValue)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_EXPRESSION_AND__LEFT:
+ setLeft((DSL_Expression)newValue);
+ return;
+ case SensinactPackage.DSL_EXPRESSION_AND__RIGHT:
+ setRight((DSL_Expression)newValue);
+ return;
+ }
+ super.eSet(featureID, newValue);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eUnset(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_EXPRESSION_AND__LEFT:
+ setLeft((DSL_Expression)null);
+ return;
+ case SensinactPackage.DSL_EXPRESSION_AND__RIGHT:
+ setRight((DSL_Expression)null);
+ return;
+ }
+ super.eUnset(featureID);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public boolean eIsSet(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_EXPRESSION_AND__LEFT:
+ return left != null;
+ case SensinactPackage.DSL_EXPRESSION_AND__RIGHT:
+ return right != null;
+ }
+ return super.eIsSet(featureID);
+ }
+
+} //DSL_Expression_AndImpl
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_Expression_DiffImpl.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_Expression_DiffImpl.java
new file mode 100644
index 0000000..63866cc
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_Expression_DiffImpl.java
@@ -0,0 +1,275 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact.impl;
+
+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.sensinact.studio.language.sensinact.DSL_Expression;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Diff;
+import org.eclipse.sensinact.studio.language.sensinact.SensinactPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>DSL Expression Diff</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_DiffImpl#getLeft <em>Left</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_DiffImpl#getRight <em>Right</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class DSL_Expression_DiffImpl extends DSL_ExpressionImpl implements DSL_Expression_Diff
+{
+ /**
+ * The cached value of the '{@link #getLeft() <em>Left</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getLeft()
+ * @generated
+ * @ordered
+ */
+ protected DSL_Expression left;
+
+ /**
+ * The cached value of the '{@link #getRight() <em>Right</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getRight()
+ * @generated
+ * @ordered
+ */
+ protected DSL_Expression right;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected DSL_Expression_DiffImpl()
+ {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EClass eStaticClass()
+ {
+ return SensinactPackage.Literals.DSL_EXPRESSION_DIFF;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_Expression getLeft()
+ {
+ return left;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public NotificationChain basicSetLeft(DSL_Expression newLeft, NotificationChain msgs)
+ {
+ DSL_Expression oldLeft = left;
+ left = newLeft;
+ if (eNotificationRequired())
+ {
+ ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_EXPRESSION_DIFF__LEFT, oldLeft, newLeft);
+ if (msgs == null) msgs = notification; else msgs.add(notification);
+ }
+ return msgs;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setLeft(DSL_Expression newLeft)
+ {
+ if (newLeft != left)
+ {
+ NotificationChain msgs = null;
+ if (left != null)
+ msgs = ((InternalEObject)left).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_EXPRESSION_DIFF__LEFT, null, msgs);
+ if (newLeft != null)
+ msgs = ((InternalEObject)newLeft).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_EXPRESSION_DIFF__LEFT, null, msgs);
+ msgs = basicSetLeft(newLeft, msgs);
+ if (msgs != null) msgs.dispatch();
+ }
+ else if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_EXPRESSION_DIFF__LEFT, newLeft, newLeft));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_Expression getRight()
+ {
+ return right;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public NotificationChain basicSetRight(DSL_Expression newRight, NotificationChain msgs)
+ {
+ DSL_Expression oldRight = right;
+ right = newRight;
+ if (eNotificationRequired())
+ {
+ ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_EXPRESSION_DIFF__RIGHT, oldRight, newRight);
+ if (msgs == null) msgs = notification; else msgs.add(notification);
+ }
+ return msgs;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setRight(DSL_Expression newRight)
+ {
+ if (newRight != right)
+ {
+ NotificationChain msgs = null;
+ if (right != null)
+ msgs = ((InternalEObject)right).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_EXPRESSION_DIFF__RIGHT, null, msgs);
+ if (newRight != null)
+ msgs = ((InternalEObject)newRight).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_EXPRESSION_DIFF__RIGHT, null, msgs);
+ msgs = basicSetRight(newRight, msgs);
+ if (msgs != null) msgs.dispatch();
+ }
+ else if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_EXPRESSION_DIFF__RIGHT, newRight, newRight));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_EXPRESSION_DIFF__LEFT:
+ return basicSetLeft(null, msgs);
+ case SensinactPackage.DSL_EXPRESSION_DIFF__RIGHT:
+ return basicSetRight(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 SensinactPackage.DSL_EXPRESSION_DIFF__LEFT:
+ return getLeft();
+ case SensinactPackage.DSL_EXPRESSION_DIFF__RIGHT:
+ return getRight();
+ }
+ return super.eGet(featureID, resolve, coreType);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eSet(int featureID, Object newValue)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_EXPRESSION_DIFF__LEFT:
+ setLeft((DSL_Expression)newValue);
+ return;
+ case SensinactPackage.DSL_EXPRESSION_DIFF__RIGHT:
+ setRight((DSL_Expression)newValue);
+ return;
+ }
+ super.eSet(featureID, newValue);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eUnset(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_EXPRESSION_DIFF__LEFT:
+ setLeft((DSL_Expression)null);
+ return;
+ case SensinactPackage.DSL_EXPRESSION_DIFF__RIGHT:
+ setRight((DSL_Expression)null);
+ return;
+ }
+ super.eUnset(featureID);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public boolean eIsSet(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_EXPRESSION_DIFF__LEFT:
+ return left != null;
+ case SensinactPackage.DSL_EXPRESSION_DIFF__RIGHT:
+ return right != null;
+ }
+ return super.eIsSet(featureID);
+ }
+
+} //DSL_Expression_DiffImpl
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_Expression_DivisionImpl.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_Expression_DivisionImpl.java
new file mode 100644
index 0000000..957033e
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_Expression_DivisionImpl.java
@@ -0,0 +1,275 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact.impl;
+
+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.sensinact.studio.language.sensinact.DSL_Expression;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Division;
+import org.eclipse.sensinact.studio.language.sensinact.SensinactPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>DSL Expression Division</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_DivisionImpl#getLeft <em>Left</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_DivisionImpl#getRight <em>Right</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class DSL_Expression_DivisionImpl extends DSL_ExpressionImpl implements DSL_Expression_Division
+{
+ /**
+ * The cached value of the '{@link #getLeft() <em>Left</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getLeft()
+ * @generated
+ * @ordered
+ */
+ protected DSL_Expression left;
+
+ /**
+ * The cached value of the '{@link #getRight() <em>Right</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getRight()
+ * @generated
+ * @ordered
+ */
+ protected DSL_Expression right;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected DSL_Expression_DivisionImpl()
+ {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EClass eStaticClass()
+ {
+ return SensinactPackage.Literals.DSL_EXPRESSION_DIVISION;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_Expression getLeft()
+ {
+ return left;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public NotificationChain basicSetLeft(DSL_Expression newLeft, NotificationChain msgs)
+ {
+ DSL_Expression oldLeft = left;
+ left = newLeft;
+ if (eNotificationRequired())
+ {
+ ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_EXPRESSION_DIVISION__LEFT, oldLeft, newLeft);
+ if (msgs == null) msgs = notification; else msgs.add(notification);
+ }
+ return msgs;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setLeft(DSL_Expression newLeft)
+ {
+ if (newLeft != left)
+ {
+ NotificationChain msgs = null;
+ if (left != null)
+ msgs = ((InternalEObject)left).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_EXPRESSION_DIVISION__LEFT, null, msgs);
+ if (newLeft != null)
+ msgs = ((InternalEObject)newLeft).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_EXPRESSION_DIVISION__LEFT, null, msgs);
+ msgs = basicSetLeft(newLeft, msgs);
+ if (msgs != null) msgs.dispatch();
+ }
+ else if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_EXPRESSION_DIVISION__LEFT, newLeft, newLeft));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_Expression getRight()
+ {
+ return right;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public NotificationChain basicSetRight(DSL_Expression newRight, NotificationChain msgs)
+ {
+ DSL_Expression oldRight = right;
+ right = newRight;
+ if (eNotificationRequired())
+ {
+ ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_EXPRESSION_DIVISION__RIGHT, oldRight, newRight);
+ if (msgs == null) msgs = notification; else msgs.add(notification);
+ }
+ return msgs;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setRight(DSL_Expression newRight)
+ {
+ if (newRight != right)
+ {
+ NotificationChain msgs = null;
+ if (right != null)
+ msgs = ((InternalEObject)right).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_EXPRESSION_DIVISION__RIGHT, null, msgs);
+ if (newRight != null)
+ msgs = ((InternalEObject)newRight).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_EXPRESSION_DIVISION__RIGHT, null, msgs);
+ msgs = basicSetRight(newRight, msgs);
+ if (msgs != null) msgs.dispatch();
+ }
+ else if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_EXPRESSION_DIVISION__RIGHT, newRight, newRight));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_EXPRESSION_DIVISION__LEFT:
+ return basicSetLeft(null, msgs);
+ case SensinactPackage.DSL_EXPRESSION_DIVISION__RIGHT:
+ return basicSetRight(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 SensinactPackage.DSL_EXPRESSION_DIVISION__LEFT:
+ return getLeft();
+ case SensinactPackage.DSL_EXPRESSION_DIVISION__RIGHT:
+ return getRight();
+ }
+ return super.eGet(featureID, resolve, coreType);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eSet(int featureID, Object newValue)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_EXPRESSION_DIVISION__LEFT:
+ setLeft((DSL_Expression)newValue);
+ return;
+ case SensinactPackage.DSL_EXPRESSION_DIVISION__RIGHT:
+ setRight((DSL_Expression)newValue);
+ return;
+ }
+ super.eSet(featureID, newValue);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eUnset(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_EXPRESSION_DIVISION__LEFT:
+ setLeft((DSL_Expression)null);
+ return;
+ case SensinactPackage.DSL_EXPRESSION_DIVISION__RIGHT:
+ setRight((DSL_Expression)null);
+ return;
+ }
+ super.eUnset(featureID);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public boolean eIsSet(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_EXPRESSION_DIVISION__LEFT:
+ return left != null;
+ case SensinactPackage.DSL_EXPRESSION_DIVISION__RIGHT:
+ return right != null;
+ }
+ return super.eIsSet(featureID);
+ }
+
+} //DSL_Expression_DivisionImpl
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_Expression_EqualImpl.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_Expression_EqualImpl.java
new file mode 100644
index 0000000..9ad08c3
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_Expression_EqualImpl.java
@@ -0,0 +1,275 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact.impl;
+
+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.sensinact.studio.language.sensinact.DSL_Expression;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Equal;
+import org.eclipse.sensinact.studio.language.sensinact.SensinactPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>DSL Expression Equal</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_EqualImpl#getLeft <em>Left</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_EqualImpl#getRight <em>Right</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class DSL_Expression_EqualImpl extends DSL_ExpressionImpl implements DSL_Expression_Equal
+{
+ /**
+ * The cached value of the '{@link #getLeft() <em>Left</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getLeft()
+ * @generated
+ * @ordered
+ */
+ protected DSL_Expression left;
+
+ /**
+ * The cached value of the '{@link #getRight() <em>Right</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getRight()
+ * @generated
+ * @ordered
+ */
+ protected DSL_Expression right;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected DSL_Expression_EqualImpl()
+ {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EClass eStaticClass()
+ {
+ return SensinactPackage.Literals.DSL_EXPRESSION_EQUAL;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_Expression getLeft()
+ {
+ return left;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public NotificationChain basicSetLeft(DSL_Expression newLeft, NotificationChain msgs)
+ {
+ DSL_Expression oldLeft = left;
+ left = newLeft;
+ if (eNotificationRequired())
+ {
+ ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_EXPRESSION_EQUAL__LEFT, oldLeft, newLeft);
+ if (msgs == null) msgs = notification; else msgs.add(notification);
+ }
+ return msgs;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setLeft(DSL_Expression newLeft)
+ {
+ if (newLeft != left)
+ {
+ NotificationChain msgs = null;
+ if (left != null)
+ msgs = ((InternalEObject)left).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_EXPRESSION_EQUAL__LEFT, null, msgs);
+ if (newLeft != null)
+ msgs = ((InternalEObject)newLeft).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_EXPRESSION_EQUAL__LEFT, null, msgs);
+ msgs = basicSetLeft(newLeft, msgs);
+ if (msgs != null) msgs.dispatch();
+ }
+ else if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_EXPRESSION_EQUAL__LEFT, newLeft, newLeft));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_Expression getRight()
+ {
+ return right;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public NotificationChain basicSetRight(DSL_Expression newRight, NotificationChain msgs)
+ {
+ DSL_Expression oldRight = right;
+ right = newRight;
+ if (eNotificationRequired())
+ {
+ ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_EXPRESSION_EQUAL__RIGHT, oldRight, newRight);
+ if (msgs == null) msgs = notification; else msgs.add(notification);
+ }
+ return msgs;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setRight(DSL_Expression newRight)
+ {
+ if (newRight != right)
+ {
+ NotificationChain msgs = null;
+ if (right != null)
+ msgs = ((InternalEObject)right).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_EXPRESSION_EQUAL__RIGHT, null, msgs);
+ if (newRight != null)
+ msgs = ((InternalEObject)newRight).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_EXPRESSION_EQUAL__RIGHT, null, msgs);
+ msgs = basicSetRight(newRight, msgs);
+ if (msgs != null) msgs.dispatch();
+ }
+ else if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_EXPRESSION_EQUAL__RIGHT, newRight, newRight));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_EXPRESSION_EQUAL__LEFT:
+ return basicSetLeft(null, msgs);
+ case SensinactPackage.DSL_EXPRESSION_EQUAL__RIGHT:
+ return basicSetRight(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 SensinactPackage.DSL_EXPRESSION_EQUAL__LEFT:
+ return getLeft();
+ case SensinactPackage.DSL_EXPRESSION_EQUAL__RIGHT:
+ return getRight();
+ }
+ return super.eGet(featureID, resolve, coreType);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eSet(int featureID, Object newValue)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_EXPRESSION_EQUAL__LEFT:
+ setLeft((DSL_Expression)newValue);
+ return;
+ case SensinactPackage.DSL_EXPRESSION_EQUAL__RIGHT:
+ setRight((DSL_Expression)newValue);
+ return;
+ }
+ super.eSet(featureID, newValue);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eUnset(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_EXPRESSION_EQUAL__LEFT:
+ setLeft((DSL_Expression)null);
+ return;
+ case SensinactPackage.DSL_EXPRESSION_EQUAL__RIGHT:
+ setRight((DSL_Expression)null);
+ return;
+ }
+ super.eUnset(featureID);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public boolean eIsSet(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_EXPRESSION_EQUAL__LEFT:
+ return left != null;
+ case SensinactPackage.DSL_EXPRESSION_EQUAL__RIGHT:
+ return right != null;
+ }
+ return super.eIsSet(featureID);
+ }
+
+} //DSL_Expression_EqualImpl
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_Expression_LargerImpl.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_Expression_LargerImpl.java
new file mode 100644
index 0000000..887cd4d
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_Expression_LargerImpl.java
@@ -0,0 +1,275 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact.impl;
+
+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.sensinact.studio.language.sensinact.DSL_Expression;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Larger;
+import org.eclipse.sensinact.studio.language.sensinact.SensinactPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>DSL Expression Larger</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_LargerImpl#getLeft <em>Left</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_LargerImpl#getRight <em>Right</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class DSL_Expression_LargerImpl extends DSL_ExpressionImpl implements DSL_Expression_Larger
+{
+ /**
+ * The cached value of the '{@link #getLeft() <em>Left</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getLeft()
+ * @generated
+ * @ordered
+ */
+ protected DSL_Expression left;
+
+ /**
+ * The cached value of the '{@link #getRight() <em>Right</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getRight()
+ * @generated
+ * @ordered
+ */
+ protected DSL_Expression right;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected DSL_Expression_LargerImpl()
+ {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EClass eStaticClass()
+ {
+ return SensinactPackage.Literals.DSL_EXPRESSION_LARGER;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_Expression getLeft()
+ {
+ return left;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public NotificationChain basicSetLeft(DSL_Expression newLeft, NotificationChain msgs)
+ {
+ DSL_Expression oldLeft = left;
+ left = newLeft;
+ if (eNotificationRequired())
+ {
+ ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_EXPRESSION_LARGER__LEFT, oldLeft, newLeft);
+ if (msgs == null) msgs = notification; else msgs.add(notification);
+ }
+ return msgs;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setLeft(DSL_Expression newLeft)
+ {
+ if (newLeft != left)
+ {
+ NotificationChain msgs = null;
+ if (left != null)
+ msgs = ((InternalEObject)left).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_EXPRESSION_LARGER__LEFT, null, msgs);
+ if (newLeft != null)
+ msgs = ((InternalEObject)newLeft).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_EXPRESSION_LARGER__LEFT, null, msgs);
+ msgs = basicSetLeft(newLeft, msgs);
+ if (msgs != null) msgs.dispatch();
+ }
+ else if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_EXPRESSION_LARGER__LEFT, newLeft, newLeft));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_Expression getRight()
+ {
+ return right;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public NotificationChain basicSetRight(DSL_Expression newRight, NotificationChain msgs)
+ {
+ DSL_Expression oldRight = right;
+ right = newRight;
+ if (eNotificationRequired())
+ {
+ ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_EXPRESSION_LARGER__RIGHT, oldRight, newRight);
+ if (msgs == null) msgs = notification; else msgs.add(notification);
+ }
+ return msgs;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setRight(DSL_Expression newRight)
+ {
+ if (newRight != right)
+ {
+ NotificationChain msgs = null;
+ if (right != null)
+ msgs = ((InternalEObject)right).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_EXPRESSION_LARGER__RIGHT, null, msgs);
+ if (newRight != null)
+ msgs = ((InternalEObject)newRight).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_EXPRESSION_LARGER__RIGHT, null, msgs);
+ msgs = basicSetRight(newRight, msgs);
+ if (msgs != null) msgs.dispatch();
+ }
+ else if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_EXPRESSION_LARGER__RIGHT, newRight, newRight));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_EXPRESSION_LARGER__LEFT:
+ return basicSetLeft(null, msgs);
+ case SensinactPackage.DSL_EXPRESSION_LARGER__RIGHT:
+ return basicSetRight(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 SensinactPackage.DSL_EXPRESSION_LARGER__LEFT:
+ return getLeft();
+ case SensinactPackage.DSL_EXPRESSION_LARGER__RIGHT:
+ return getRight();
+ }
+ return super.eGet(featureID, resolve, coreType);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eSet(int featureID, Object newValue)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_EXPRESSION_LARGER__LEFT:
+ setLeft((DSL_Expression)newValue);
+ return;
+ case SensinactPackage.DSL_EXPRESSION_LARGER__RIGHT:
+ setRight((DSL_Expression)newValue);
+ return;
+ }
+ super.eSet(featureID, newValue);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eUnset(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_EXPRESSION_LARGER__LEFT:
+ setLeft((DSL_Expression)null);
+ return;
+ case SensinactPackage.DSL_EXPRESSION_LARGER__RIGHT:
+ setRight((DSL_Expression)null);
+ return;
+ }
+ super.eUnset(featureID);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public boolean eIsSet(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_EXPRESSION_LARGER__LEFT:
+ return left != null;
+ case SensinactPackage.DSL_EXPRESSION_LARGER__RIGHT:
+ return right != null;
+ }
+ return super.eIsSet(featureID);
+ }
+
+} //DSL_Expression_LargerImpl
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_Expression_Larger_EqualImpl.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_Expression_Larger_EqualImpl.java
new file mode 100644
index 0000000..6da250a
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_Expression_Larger_EqualImpl.java
@@ -0,0 +1,275 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact.impl;
+
+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.sensinact.studio.language.sensinact.DSL_Expression;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Larger_Equal;
+import org.eclipse.sensinact.studio.language.sensinact.SensinactPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>DSL Expression Larger Equal</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_Larger_EqualImpl#getLeft <em>Left</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_Larger_EqualImpl#getRight <em>Right</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class DSL_Expression_Larger_EqualImpl extends DSL_ExpressionImpl implements DSL_Expression_Larger_Equal
+{
+ /**
+ * The cached value of the '{@link #getLeft() <em>Left</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getLeft()
+ * @generated
+ * @ordered
+ */
+ protected DSL_Expression left;
+
+ /**
+ * The cached value of the '{@link #getRight() <em>Right</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getRight()
+ * @generated
+ * @ordered
+ */
+ protected DSL_Expression right;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected DSL_Expression_Larger_EqualImpl()
+ {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EClass eStaticClass()
+ {
+ return SensinactPackage.Literals.DSL_EXPRESSION_LARGER_EQUAL;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_Expression getLeft()
+ {
+ return left;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public NotificationChain basicSetLeft(DSL_Expression newLeft, NotificationChain msgs)
+ {
+ DSL_Expression oldLeft = left;
+ left = newLeft;
+ if (eNotificationRequired())
+ {
+ ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_EXPRESSION_LARGER_EQUAL__LEFT, oldLeft, newLeft);
+ if (msgs == null) msgs = notification; else msgs.add(notification);
+ }
+ return msgs;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setLeft(DSL_Expression newLeft)
+ {
+ if (newLeft != left)
+ {
+ NotificationChain msgs = null;
+ if (left != null)
+ msgs = ((InternalEObject)left).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_EXPRESSION_LARGER_EQUAL__LEFT, null, msgs);
+ if (newLeft != null)
+ msgs = ((InternalEObject)newLeft).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_EXPRESSION_LARGER_EQUAL__LEFT, null, msgs);
+ msgs = basicSetLeft(newLeft, msgs);
+ if (msgs != null) msgs.dispatch();
+ }
+ else if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_EXPRESSION_LARGER_EQUAL__LEFT, newLeft, newLeft));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_Expression getRight()
+ {
+ return right;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public NotificationChain basicSetRight(DSL_Expression newRight, NotificationChain msgs)
+ {
+ DSL_Expression oldRight = right;
+ right = newRight;
+ if (eNotificationRequired())
+ {
+ ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_EXPRESSION_LARGER_EQUAL__RIGHT, oldRight, newRight);
+ if (msgs == null) msgs = notification; else msgs.add(notification);
+ }
+ return msgs;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setRight(DSL_Expression newRight)
+ {
+ if (newRight != right)
+ {
+ NotificationChain msgs = null;
+ if (right != null)
+ msgs = ((InternalEObject)right).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_EXPRESSION_LARGER_EQUAL__RIGHT, null, msgs);
+ if (newRight != null)
+ msgs = ((InternalEObject)newRight).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_EXPRESSION_LARGER_EQUAL__RIGHT, null, msgs);
+ msgs = basicSetRight(newRight, msgs);
+ if (msgs != null) msgs.dispatch();
+ }
+ else if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_EXPRESSION_LARGER_EQUAL__RIGHT, newRight, newRight));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_EXPRESSION_LARGER_EQUAL__LEFT:
+ return basicSetLeft(null, msgs);
+ case SensinactPackage.DSL_EXPRESSION_LARGER_EQUAL__RIGHT:
+ return basicSetRight(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 SensinactPackage.DSL_EXPRESSION_LARGER_EQUAL__LEFT:
+ return getLeft();
+ case SensinactPackage.DSL_EXPRESSION_LARGER_EQUAL__RIGHT:
+ return getRight();
+ }
+ return super.eGet(featureID, resolve, coreType);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eSet(int featureID, Object newValue)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_EXPRESSION_LARGER_EQUAL__LEFT:
+ setLeft((DSL_Expression)newValue);
+ return;
+ case SensinactPackage.DSL_EXPRESSION_LARGER_EQUAL__RIGHT:
+ setRight((DSL_Expression)newValue);
+ return;
+ }
+ super.eSet(featureID, newValue);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eUnset(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_EXPRESSION_LARGER_EQUAL__LEFT:
+ setLeft((DSL_Expression)null);
+ return;
+ case SensinactPackage.DSL_EXPRESSION_LARGER_EQUAL__RIGHT:
+ setRight((DSL_Expression)null);
+ return;
+ }
+ super.eUnset(featureID);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public boolean eIsSet(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_EXPRESSION_LARGER_EQUAL__LEFT:
+ return left != null;
+ case SensinactPackage.DSL_EXPRESSION_LARGER_EQUAL__RIGHT:
+ return right != null;
+ }
+ return super.eIsSet(featureID);
+ }
+
+} //DSL_Expression_Larger_EqualImpl
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_Expression_MinusImpl.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_Expression_MinusImpl.java
new file mode 100644
index 0000000..e7f5f7d
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_Expression_MinusImpl.java
@@ -0,0 +1,275 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact.impl;
+
+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.sensinact.studio.language.sensinact.DSL_Expression;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Minus;
+import org.eclipse.sensinact.studio.language.sensinact.SensinactPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>DSL Expression Minus</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_MinusImpl#getLeft <em>Left</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_MinusImpl#getRight <em>Right</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class DSL_Expression_MinusImpl extends DSL_ExpressionImpl implements DSL_Expression_Minus
+{
+ /**
+ * The cached value of the '{@link #getLeft() <em>Left</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getLeft()
+ * @generated
+ * @ordered
+ */
+ protected DSL_Expression left;
+
+ /**
+ * The cached value of the '{@link #getRight() <em>Right</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getRight()
+ * @generated
+ * @ordered
+ */
+ protected DSL_Expression right;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected DSL_Expression_MinusImpl()
+ {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EClass eStaticClass()
+ {
+ return SensinactPackage.Literals.DSL_EXPRESSION_MINUS;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_Expression getLeft()
+ {
+ return left;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public NotificationChain basicSetLeft(DSL_Expression newLeft, NotificationChain msgs)
+ {
+ DSL_Expression oldLeft = left;
+ left = newLeft;
+ if (eNotificationRequired())
+ {
+ ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_EXPRESSION_MINUS__LEFT, oldLeft, newLeft);
+ if (msgs == null) msgs = notification; else msgs.add(notification);
+ }
+ return msgs;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setLeft(DSL_Expression newLeft)
+ {
+ if (newLeft != left)
+ {
+ NotificationChain msgs = null;
+ if (left != null)
+ msgs = ((InternalEObject)left).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_EXPRESSION_MINUS__LEFT, null, msgs);
+ if (newLeft != null)
+ msgs = ((InternalEObject)newLeft).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_EXPRESSION_MINUS__LEFT, null, msgs);
+ msgs = basicSetLeft(newLeft, msgs);
+ if (msgs != null) msgs.dispatch();
+ }
+ else if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_EXPRESSION_MINUS__LEFT, newLeft, newLeft));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_Expression getRight()
+ {
+ return right;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public NotificationChain basicSetRight(DSL_Expression newRight, NotificationChain msgs)
+ {
+ DSL_Expression oldRight = right;
+ right = newRight;
+ if (eNotificationRequired())
+ {
+ ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_EXPRESSION_MINUS__RIGHT, oldRight, newRight);
+ if (msgs == null) msgs = notification; else msgs.add(notification);
+ }
+ return msgs;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setRight(DSL_Expression newRight)
+ {
+ if (newRight != right)
+ {
+ NotificationChain msgs = null;
+ if (right != null)
+ msgs = ((InternalEObject)right).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_EXPRESSION_MINUS__RIGHT, null, msgs);
+ if (newRight != null)
+ msgs = ((InternalEObject)newRight).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_EXPRESSION_MINUS__RIGHT, null, msgs);
+ msgs = basicSetRight(newRight, msgs);
+ if (msgs != null) msgs.dispatch();
+ }
+ else if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_EXPRESSION_MINUS__RIGHT, newRight, newRight));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_EXPRESSION_MINUS__LEFT:
+ return basicSetLeft(null, msgs);
+ case SensinactPackage.DSL_EXPRESSION_MINUS__RIGHT:
+ return basicSetRight(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 SensinactPackage.DSL_EXPRESSION_MINUS__LEFT:
+ return getLeft();
+ case SensinactPackage.DSL_EXPRESSION_MINUS__RIGHT:
+ return getRight();
+ }
+ return super.eGet(featureID, resolve, coreType);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eSet(int featureID, Object newValue)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_EXPRESSION_MINUS__LEFT:
+ setLeft((DSL_Expression)newValue);
+ return;
+ case SensinactPackage.DSL_EXPRESSION_MINUS__RIGHT:
+ setRight((DSL_Expression)newValue);
+ return;
+ }
+ super.eSet(featureID, newValue);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eUnset(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_EXPRESSION_MINUS__LEFT:
+ setLeft((DSL_Expression)null);
+ return;
+ case SensinactPackage.DSL_EXPRESSION_MINUS__RIGHT:
+ setRight((DSL_Expression)null);
+ return;
+ }
+ super.eUnset(featureID);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public boolean eIsSet(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_EXPRESSION_MINUS__LEFT:
+ return left != null;
+ case SensinactPackage.DSL_EXPRESSION_MINUS__RIGHT:
+ return right != null;
+ }
+ return super.eIsSet(featureID);
+ }
+
+} //DSL_Expression_MinusImpl
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_Expression_ModuloImpl.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_Expression_ModuloImpl.java
new file mode 100644
index 0000000..45b2e38
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_Expression_ModuloImpl.java
@@ -0,0 +1,275 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact.impl;
+
+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.sensinact.studio.language.sensinact.DSL_Expression;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Modulo;
+import org.eclipse.sensinact.studio.language.sensinact.SensinactPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>DSL Expression Modulo</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_ModuloImpl#getLeft <em>Left</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_ModuloImpl#getRight <em>Right</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class DSL_Expression_ModuloImpl extends DSL_ExpressionImpl implements DSL_Expression_Modulo
+{
+ /**
+ * The cached value of the '{@link #getLeft() <em>Left</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getLeft()
+ * @generated
+ * @ordered
+ */
+ protected DSL_Expression left;
+
+ /**
+ * The cached value of the '{@link #getRight() <em>Right</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getRight()
+ * @generated
+ * @ordered
+ */
+ protected DSL_Expression right;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected DSL_Expression_ModuloImpl()
+ {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EClass eStaticClass()
+ {
+ return SensinactPackage.Literals.DSL_EXPRESSION_MODULO;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_Expression getLeft()
+ {
+ return left;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public NotificationChain basicSetLeft(DSL_Expression newLeft, NotificationChain msgs)
+ {
+ DSL_Expression oldLeft = left;
+ left = newLeft;
+ if (eNotificationRequired())
+ {
+ ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_EXPRESSION_MODULO__LEFT, oldLeft, newLeft);
+ if (msgs == null) msgs = notification; else msgs.add(notification);
+ }
+ return msgs;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setLeft(DSL_Expression newLeft)
+ {
+ if (newLeft != left)
+ {
+ NotificationChain msgs = null;
+ if (left != null)
+ msgs = ((InternalEObject)left).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_EXPRESSION_MODULO__LEFT, null, msgs);
+ if (newLeft != null)
+ msgs = ((InternalEObject)newLeft).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_EXPRESSION_MODULO__LEFT, null, msgs);
+ msgs = basicSetLeft(newLeft, msgs);
+ if (msgs != null) msgs.dispatch();
+ }
+ else if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_EXPRESSION_MODULO__LEFT, newLeft, newLeft));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_Expression getRight()
+ {
+ return right;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public NotificationChain basicSetRight(DSL_Expression newRight, NotificationChain msgs)
+ {
+ DSL_Expression oldRight = right;
+ right = newRight;
+ if (eNotificationRequired())
+ {
+ ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_EXPRESSION_MODULO__RIGHT, oldRight, newRight);
+ if (msgs == null) msgs = notification; else msgs.add(notification);
+ }
+ return msgs;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setRight(DSL_Expression newRight)
+ {
+ if (newRight != right)
+ {
+ NotificationChain msgs = null;
+ if (right != null)
+ msgs = ((InternalEObject)right).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_EXPRESSION_MODULO__RIGHT, null, msgs);
+ if (newRight != null)
+ msgs = ((InternalEObject)newRight).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_EXPRESSION_MODULO__RIGHT, null, msgs);
+ msgs = basicSetRight(newRight, msgs);
+ if (msgs != null) msgs.dispatch();
+ }
+ else if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_EXPRESSION_MODULO__RIGHT, newRight, newRight));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_EXPRESSION_MODULO__LEFT:
+ return basicSetLeft(null, msgs);
+ case SensinactPackage.DSL_EXPRESSION_MODULO__RIGHT:
+ return basicSetRight(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 SensinactPackage.DSL_EXPRESSION_MODULO__LEFT:
+ return getLeft();
+ case SensinactPackage.DSL_EXPRESSION_MODULO__RIGHT:
+ return getRight();
+ }
+ return super.eGet(featureID, resolve, coreType);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eSet(int featureID, Object newValue)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_EXPRESSION_MODULO__LEFT:
+ setLeft((DSL_Expression)newValue);
+ return;
+ case SensinactPackage.DSL_EXPRESSION_MODULO__RIGHT:
+ setRight((DSL_Expression)newValue);
+ return;
+ }
+ super.eSet(featureID, newValue);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eUnset(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_EXPRESSION_MODULO__LEFT:
+ setLeft((DSL_Expression)null);
+ return;
+ case SensinactPackage.DSL_EXPRESSION_MODULO__RIGHT:
+ setRight((DSL_Expression)null);
+ return;
+ }
+ super.eUnset(featureID);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public boolean eIsSet(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_EXPRESSION_MODULO__LEFT:
+ return left != null;
+ case SensinactPackage.DSL_EXPRESSION_MODULO__RIGHT:
+ return right != null;
+ }
+ return super.eIsSet(featureID);
+ }
+
+} //DSL_Expression_ModuloImpl
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_Expression_MultiplicationImpl.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_Expression_MultiplicationImpl.java
new file mode 100644
index 0000000..ea744c6
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_Expression_MultiplicationImpl.java
@@ -0,0 +1,275 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact.impl;
+
+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.sensinact.studio.language.sensinact.DSL_Expression;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Multiplication;
+import org.eclipse.sensinact.studio.language.sensinact.SensinactPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>DSL Expression Multiplication</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_MultiplicationImpl#getLeft <em>Left</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_MultiplicationImpl#getRight <em>Right</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class DSL_Expression_MultiplicationImpl extends DSL_ExpressionImpl implements DSL_Expression_Multiplication
+{
+ /**
+ * The cached value of the '{@link #getLeft() <em>Left</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getLeft()
+ * @generated
+ * @ordered
+ */
+ protected DSL_Expression left;
+
+ /**
+ * The cached value of the '{@link #getRight() <em>Right</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getRight()
+ * @generated
+ * @ordered
+ */
+ protected DSL_Expression right;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected DSL_Expression_MultiplicationImpl()
+ {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EClass eStaticClass()
+ {
+ return SensinactPackage.Literals.DSL_EXPRESSION_MULTIPLICATION;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_Expression getLeft()
+ {
+ return left;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public NotificationChain basicSetLeft(DSL_Expression newLeft, NotificationChain msgs)
+ {
+ DSL_Expression oldLeft = left;
+ left = newLeft;
+ if (eNotificationRequired())
+ {
+ ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_EXPRESSION_MULTIPLICATION__LEFT, oldLeft, newLeft);
+ if (msgs == null) msgs = notification; else msgs.add(notification);
+ }
+ return msgs;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setLeft(DSL_Expression newLeft)
+ {
+ if (newLeft != left)
+ {
+ NotificationChain msgs = null;
+ if (left != null)
+ msgs = ((InternalEObject)left).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_EXPRESSION_MULTIPLICATION__LEFT, null, msgs);
+ if (newLeft != null)
+ msgs = ((InternalEObject)newLeft).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_EXPRESSION_MULTIPLICATION__LEFT, null, msgs);
+ msgs = basicSetLeft(newLeft, msgs);
+ if (msgs != null) msgs.dispatch();
+ }
+ else if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_EXPRESSION_MULTIPLICATION__LEFT, newLeft, newLeft));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_Expression getRight()
+ {
+ return right;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public NotificationChain basicSetRight(DSL_Expression newRight, NotificationChain msgs)
+ {
+ DSL_Expression oldRight = right;
+ right = newRight;
+ if (eNotificationRequired())
+ {
+ ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_EXPRESSION_MULTIPLICATION__RIGHT, oldRight, newRight);
+ if (msgs == null) msgs = notification; else msgs.add(notification);
+ }
+ return msgs;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setRight(DSL_Expression newRight)
+ {
+ if (newRight != right)
+ {
+ NotificationChain msgs = null;
+ if (right != null)
+ msgs = ((InternalEObject)right).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_EXPRESSION_MULTIPLICATION__RIGHT, null, msgs);
+ if (newRight != null)
+ msgs = ((InternalEObject)newRight).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_EXPRESSION_MULTIPLICATION__RIGHT, null, msgs);
+ msgs = basicSetRight(newRight, msgs);
+ if (msgs != null) msgs.dispatch();
+ }
+ else if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_EXPRESSION_MULTIPLICATION__RIGHT, newRight, newRight));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_EXPRESSION_MULTIPLICATION__LEFT:
+ return basicSetLeft(null, msgs);
+ case SensinactPackage.DSL_EXPRESSION_MULTIPLICATION__RIGHT:
+ return basicSetRight(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 SensinactPackage.DSL_EXPRESSION_MULTIPLICATION__LEFT:
+ return getLeft();
+ case SensinactPackage.DSL_EXPRESSION_MULTIPLICATION__RIGHT:
+ return getRight();
+ }
+ return super.eGet(featureID, resolve, coreType);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eSet(int featureID, Object newValue)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_EXPRESSION_MULTIPLICATION__LEFT:
+ setLeft((DSL_Expression)newValue);
+ return;
+ case SensinactPackage.DSL_EXPRESSION_MULTIPLICATION__RIGHT:
+ setRight((DSL_Expression)newValue);
+ return;
+ }
+ super.eSet(featureID, newValue);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eUnset(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_EXPRESSION_MULTIPLICATION__LEFT:
+ setLeft((DSL_Expression)null);
+ return;
+ case SensinactPackage.DSL_EXPRESSION_MULTIPLICATION__RIGHT:
+ setRight((DSL_Expression)null);
+ return;
+ }
+ super.eUnset(featureID);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public boolean eIsSet(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_EXPRESSION_MULTIPLICATION__LEFT:
+ return left != null;
+ case SensinactPackage.DSL_EXPRESSION_MULTIPLICATION__RIGHT:
+ return right != null;
+ }
+ return super.eIsSet(featureID);
+ }
+
+} //DSL_Expression_MultiplicationImpl
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_Expression_NegateImpl.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_Expression_NegateImpl.java
new file mode 100644
index 0000000..b8861d5
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_Expression_NegateImpl.java
@@ -0,0 +1,204 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact.impl;
+
+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.sensinact.studio.language.sensinact.DSL_Expression;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Negate;
+import org.eclipse.sensinact.studio.language.sensinact.SensinactPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>DSL Expression Negate</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_NegateImpl#getExp <em>Exp</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class DSL_Expression_NegateImpl extends DSL_ExpressionImpl implements DSL_Expression_Negate
+{
+ /**
+ * The cached value of the '{@link #getExp() <em>Exp</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getExp()
+ * @generated
+ * @ordered
+ */
+ protected DSL_Expression exp;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected DSL_Expression_NegateImpl()
+ {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EClass eStaticClass()
+ {
+ return SensinactPackage.Literals.DSL_EXPRESSION_NEGATE;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_Expression getExp()
+ {
+ return exp;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public NotificationChain basicSetExp(DSL_Expression newExp, NotificationChain msgs)
+ {
+ DSL_Expression oldExp = exp;
+ exp = newExp;
+ if (eNotificationRequired())
+ {
+ ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_EXPRESSION_NEGATE__EXP, oldExp, newExp);
+ if (msgs == null) msgs = notification; else msgs.add(notification);
+ }
+ return msgs;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setExp(DSL_Expression newExp)
+ {
+ if (newExp != exp)
+ {
+ NotificationChain msgs = null;
+ if (exp != null)
+ msgs = ((InternalEObject)exp).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_EXPRESSION_NEGATE__EXP, null, msgs);
+ if (newExp != null)
+ msgs = ((InternalEObject)newExp).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_EXPRESSION_NEGATE__EXP, null, msgs);
+ msgs = basicSetExp(newExp, msgs);
+ if (msgs != null) msgs.dispatch();
+ }
+ else if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_EXPRESSION_NEGATE__EXP, newExp, newExp));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_EXPRESSION_NEGATE__EXP:
+ return basicSetExp(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 SensinactPackage.DSL_EXPRESSION_NEGATE__EXP:
+ return getExp();
+ }
+ return super.eGet(featureID, resolve, coreType);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eSet(int featureID, Object newValue)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_EXPRESSION_NEGATE__EXP:
+ setExp((DSL_Expression)newValue);
+ return;
+ }
+ super.eSet(featureID, newValue);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eUnset(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_EXPRESSION_NEGATE__EXP:
+ setExp((DSL_Expression)null);
+ return;
+ }
+ super.eUnset(featureID);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public boolean eIsSet(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_EXPRESSION_NEGATE__EXP:
+ return exp != null;
+ }
+ return super.eIsSet(featureID);
+ }
+
+} //DSL_Expression_NegateImpl
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_Expression_OrImpl.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_Expression_OrImpl.java
new file mode 100644
index 0000000..07ac0cb
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_Expression_OrImpl.java
@@ -0,0 +1,275 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact.impl;
+
+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.sensinact.studio.language.sensinact.DSL_Expression;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Or;
+import org.eclipse.sensinact.studio.language.sensinact.SensinactPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>DSL Expression Or</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_OrImpl#getLeft <em>Left</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_OrImpl#getRight <em>Right</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class DSL_Expression_OrImpl extends DSL_ExpressionImpl implements DSL_Expression_Or
+{
+ /**
+ * The cached value of the '{@link #getLeft() <em>Left</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getLeft()
+ * @generated
+ * @ordered
+ */
+ protected DSL_Expression left;
+
+ /**
+ * The cached value of the '{@link #getRight() <em>Right</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getRight()
+ * @generated
+ * @ordered
+ */
+ protected DSL_Expression right;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected DSL_Expression_OrImpl()
+ {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EClass eStaticClass()
+ {
+ return SensinactPackage.Literals.DSL_EXPRESSION_OR;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_Expression getLeft()
+ {
+ return left;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public NotificationChain basicSetLeft(DSL_Expression newLeft, NotificationChain msgs)
+ {
+ DSL_Expression oldLeft = left;
+ left = newLeft;
+ if (eNotificationRequired())
+ {
+ ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_EXPRESSION_OR__LEFT, oldLeft, newLeft);
+ if (msgs == null) msgs = notification; else msgs.add(notification);
+ }
+ return msgs;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setLeft(DSL_Expression newLeft)
+ {
+ if (newLeft != left)
+ {
+ NotificationChain msgs = null;
+ if (left != null)
+ msgs = ((InternalEObject)left).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_EXPRESSION_OR__LEFT, null, msgs);
+ if (newLeft != null)
+ msgs = ((InternalEObject)newLeft).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_EXPRESSION_OR__LEFT, null, msgs);
+ msgs = basicSetLeft(newLeft, msgs);
+ if (msgs != null) msgs.dispatch();
+ }
+ else if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_EXPRESSION_OR__LEFT, newLeft, newLeft));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_Expression getRight()
+ {
+ return right;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public NotificationChain basicSetRight(DSL_Expression newRight, NotificationChain msgs)
+ {
+ DSL_Expression oldRight = right;
+ right = newRight;
+ if (eNotificationRequired())
+ {
+ ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_EXPRESSION_OR__RIGHT, oldRight, newRight);
+ if (msgs == null) msgs = notification; else msgs.add(notification);
+ }
+ return msgs;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setRight(DSL_Expression newRight)
+ {
+ if (newRight != right)
+ {
+ NotificationChain msgs = null;
+ if (right != null)
+ msgs = ((InternalEObject)right).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_EXPRESSION_OR__RIGHT, null, msgs);
+ if (newRight != null)
+ msgs = ((InternalEObject)newRight).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_EXPRESSION_OR__RIGHT, null, msgs);
+ msgs = basicSetRight(newRight, msgs);
+ if (msgs != null) msgs.dispatch();
+ }
+ else if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_EXPRESSION_OR__RIGHT, newRight, newRight));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_EXPRESSION_OR__LEFT:
+ return basicSetLeft(null, msgs);
+ case SensinactPackage.DSL_EXPRESSION_OR__RIGHT:
+ return basicSetRight(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 SensinactPackage.DSL_EXPRESSION_OR__LEFT:
+ return getLeft();
+ case SensinactPackage.DSL_EXPRESSION_OR__RIGHT:
+ return getRight();
+ }
+ return super.eGet(featureID, resolve, coreType);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eSet(int featureID, Object newValue)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_EXPRESSION_OR__LEFT:
+ setLeft((DSL_Expression)newValue);
+ return;
+ case SensinactPackage.DSL_EXPRESSION_OR__RIGHT:
+ setRight((DSL_Expression)newValue);
+ return;
+ }
+ super.eSet(featureID, newValue);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eUnset(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_EXPRESSION_OR__LEFT:
+ setLeft((DSL_Expression)null);
+ return;
+ case SensinactPackage.DSL_EXPRESSION_OR__RIGHT:
+ setRight((DSL_Expression)null);
+ return;
+ }
+ super.eUnset(featureID);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public boolean eIsSet(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_EXPRESSION_OR__LEFT:
+ return left != null;
+ case SensinactPackage.DSL_EXPRESSION_OR__RIGHT:
+ return right != null;
+ }
+ return super.eIsSet(featureID);
+ }
+
+} //DSL_Expression_OrImpl
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_Expression_PlusImpl.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_Expression_PlusImpl.java
new file mode 100644
index 0000000..96266a4
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_Expression_PlusImpl.java
@@ -0,0 +1,275 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact.impl;
+
+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.sensinact.studio.language.sensinact.DSL_Expression;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Plus;
+import org.eclipse.sensinact.studio.language.sensinact.SensinactPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>DSL Expression Plus</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_PlusImpl#getLeft <em>Left</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_PlusImpl#getRight <em>Right</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class DSL_Expression_PlusImpl extends DSL_ExpressionImpl implements DSL_Expression_Plus
+{
+ /**
+ * The cached value of the '{@link #getLeft() <em>Left</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getLeft()
+ * @generated
+ * @ordered
+ */
+ protected DSL_Expression left;
+
+ /**
+ * The cached value of the '{@link #getRight() <em>Right</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getRight()
+ * @generated
+ * @ordered
+ */
+ protected DSL_Expression right;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected DSL_Expression_PlusImpl()
+ {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EClass eStaticClass()
+ {
+ return SensinactPackage.Literals.DSL_EXPRESSION_PLUS;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_Expression getLeft()
+ {
+ return left;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public NotificationChain basicSetLeft(DSL_Expression newLeft, NotificationChain msgs)
+ {
+ DSL_Expression oldLeft = left;
+ left = newLeft;
+ if (eNotificationRequired())
+ {
+ ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_EXPRESSION_PLUS__LEFT, oldLeft, newLeft);
+ if (msgs == null) msgs = notification; else msgs.add(notification);
+ }
+ return msgs;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setLeft(DSL_Expression newLeft)
+ {
+ if (newLeft != left)
+ {
+ NotificationChain msgs = null;
+ if (left != null)
+ msgs = ((InternalEObject)left).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_EXPRESSION_PLUS__LEFT, null, msgs);
+ if (newLeft != null)
+ msgs = ((InternalEObject)newLeft).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_EXPRESSION_PLUS__LEFT, null, msgs);
+ msgs = basicSetLeft(newLeft, msgs);
+ if (msgs != null) msgs.dispatch();
+ }
+ else if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_EXPRESSION_PLUS__LEFT, newLeft, newLeft));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_Expression getRight()
+ {
+ return right;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public NotificationChain basicSetRight(DSL_Expression newRight, NotificationChain msgs)
+ {
+ DSL_Expression oldRight = right;
+ right = newRight;
+ if (eNotificationRequired())
+ {
+ ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_EXPRESSION_PLUS__RIGHT, oldRight, newRight);
+ if (msgs == null) msgs = notification; else msgs.add(notification);
+ }
+ return msgs;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setRight(DSL_Expression newRight)
+ {
+ if (newRight != right)
+ {
+ NotificationChain msgs = null;
+ if (right != null)
+ msgs = ((InternalEObject)right).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_EXPRESSION_PLUS__RIGHT, null, msgs);
+ if (newRight != null)
+ msgs = ((InternalEObject)newRight).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_EXPRESSION_PLUS__RIGHT, null, msgs);
+ msgs = basicSetRight(newRight, msgs);
+ if (msgs != null) msgs.dispatch();
+ }
+ else if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_EXPRESSION_PLUS__RIGHT, newRight, newRight));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_EXPRESSION_PLUS__LEFT:
+ return basicSetLeft(null, msgs);
+ case SensinactPackage.DSL_EXPRESSION_PLUS__RIGHT:
+ return basicSetRight(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 SensinactPackage.DSL_EXPRESSION_PLUS__LEFT:
+ return getLeft();
+ case SensinactPackage.DSL_EXPRESSION_PLUS__RIGHT:
+ return getRight();
+ }
+ return super.eGet(featureID, resolve, coreType);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eSet(int featureID, Object newValue)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_EXPRESSION_PLUS__LEFT:
+ setLeft((DSL_Expression)newValue);
+ return;
+ case SensinactPackage.DSL_EXPRESSION_PLUS__RIGHT:
+ setRight((DSL_Expression)newValue);
+ return;
+ }
+ super.eSet(featureID, newValue);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eUnset(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_EXPRESSION_PLUS__LEFT:
+ setLeft((DSL_Expression)null);
+ return;
+ case SensinactPackage.DSL_EXPRESSION_PLUS__RIGHT:
+ setRight((DSL_Expression)null);
+ return;
+ }
+ super.eUnset(featureID);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public boolean eIsSet(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_EXPRESSION_PLUS__LEFT:
+ return left != null;
+ case SensinactPackage.DSL_EXPRESSION_PLUS__RIGHT:
+ return right != null;
+ }
+ return super.eIsSet(featureID);
+ }
+
+} //DSL_Expression_PlusImpl
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_Expression_SmallerImpl.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_Expression_SmallerImpl.java
new file mode 100644
index 0000000..fed7e21
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_Expression_SmallerImpl.java
@@ -0,0 +1,275 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact.impl;
+
+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.sensinact.studio.language.sensinact.DSL_Expression;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Smaller;
+import org.eclipse.sensinact.studio.language.sensinact.SensinactPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>DSL Expression Smaller</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_SmallerImpl#getLeft <em>Left</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_SmallerImpl#getRight <em>Right</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class DSL_Expression_SmallerImpl extends DSL_ExpressionImpl implements DSL_Expression_Smaller
+{
+ /**
+ * The cached value of the '{@link #getLeft() <em>Left</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getLeft()
+ * @generated
+ * @ordered
+ */
+ protected DSL_Expression left;
+
+ /**
+ * The cached value of the '{@link #getRight() <em>Right</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getRight()
+ * @generated
+ * @ordered
+ */
+ protected DSL_Expression right;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected DSL_Expression_SmallerImpl()
+ {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EClass eStaticClass()
+ {
+ return SensinactPackage.Literals.DSL_EXPRESSION_SMALLER;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_Expression getLeft()
+ {
+ return left;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public NotificationChain basicSetLeft(DSL_Expression newLeft, NotificationChain msgs)
+ {
+ DSL_Expression oldLeft = left;
+ left = newLeft;
+ if (eNotificationRequired())
+ {
+ ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_EXPRESSION_SMALLER__LEFT, oldLeft, newLeft);
+ if (msgs == null) msgs = notification; else msgs.add(notification);
+ }
+ return msgs;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setLeft(DSL_Expression newLeft)
+ {
+ if (newLeft != left)
+ {
+ NotificationChain msgs = null;
+ if (left != null)
+ msgs = ((InternalEObject)left).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_EXPRESSION_SMALLER__LEFT, null, msgs);
+ if (newLeft != null)
+ msgs = ((InternalEObject)newLeft).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_EXPRESSION_SMALLER__LEFT, null, msgs);
+ msgs = basicSetLeft(newLeft, msgs);
+ if (msgs != null) msgs.dispatch();
+ }
+ else if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_EXPRESSION_SMALLER__LEFT, newLeft, newLeft));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_Expression getRight()
+ {
+ return right;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public NotificationChain basicSetRight(DSL_Expression newRight, NotificationChain msgs)
+ {
+ DSL_Expression oldRight = right;
+ right = newRight;
+ if (eNotificationRequired())
+ {
+ ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_EXPRESSION_SMALLER__RIGHT, oldRight, newRight);
+ if (msgs == null) msgs = notification; else msgs.add(notification);
+ }
+ return msgs;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setRight(DSL_Expression newRight)
+ {
+ if (newRight != right)
+ {
+ NotificationChain msgs = null;
+ if (right != null)
+ msgs = ((InternalEObject)right).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_EXPRESSION_SMALLER__RIGHT, null, msgs);
+ if (newRight != null)
+ msgs = ((InternalEObject)newRight).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_EXPRESSION_SMALLER__RIGHT, null, msgs);
+ msgs = basicSetRight(newRight, msgs);
+ if (msgs != null) msgs.dispatch();
+ }
+ else if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_EXPRESSION_SMALLER__RIGHT, newRight, newRight));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_EXPRESSION_SMALLER__LEFT:
+ return basicSetLeft(null, msgs);
+ case SensinactPackage.DSL_EXPRESSION_SMALLER__RIGHT:
+ return basicSetRight(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 SensinactPackage.DSL_EXPRESSION_SMALLER__LEFT:
+ return getLeft();
+ case SensinactPackage.DSL_EXPRESSION_SMALLER__RIGHT:
+ return getRight();
+ }
+ return super.eGet(featureID, resolve, coreType);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eSet(int featureID, Object newValue)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_EXPRESSION_SMALLER__LEFT:
+ setLeft((DSL_Expression)newValue);
+ return;
+ case SensinactPackage.DSL_EXPRESSION_SMALLER__RIGHT:
+ setRight((DSL_Expression)newValue);
+ return;
+ }
+ super.eSet(featureID, newValue);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eUnset(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_EXPRESSION_SMALLER__LEFT:
+ setLeft((DSL_Expression)null);
+ return;
+ case SensinactPackage.DSL_EXPRESSION_SMALLER__RIGHT:
+ setRight((DSL_Expression)null);
+ return;
+ }
+ super.eUnset(featureID);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public boolean eIsSet(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_EXPRESSION_SMALLER__LEFT:
+ return left != null;
+ case SensinactPackage.DSL_EXPRESSION_SMALLER__RIGHT:
+ return right != null;
+ }
+ return super.eIsSet(featureID);
+ }
+
+} //DSL_Expression_SmallerImpl
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_Expression_Smaller_EqualImpl.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_Expression_Smaller_EqualImpl.java
new file mode 100644
index 0000000..36c515f
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_Expression_Smaller_EqualImpl.java
@@ -0,0 +1,275 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact.impl;
+
+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.sensinact.studio.language.sensinact.DSL_Expression;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Smaller_Equal;
+import org.eclipse.sensinact.studio.language.sensinact.SensinactPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>DSL Expression Smaller Equal</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_Smaller_EqualImpl#getLeft <em>Left</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Expression_Smaller_EqualImpl#getRight <em>Right</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class DSL_Expression_Smaller_EqualImpl extends DSL_ExpressionImpl implements DSL_Expression_Smaller_Equal
+{
+ /**
+ * The cached value of the '{@link #getLeft() <em>Left</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getLeft()
+ * @generated
+ * @ordered
+ */
+ protected DSL_Expression left;
+
+ /**
+ * The cached value of the '{@link #getRight() <em>Right</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getRight()
+ * @generated
+ * @ordered
+ */
+ protected DSL_Expression right;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected DSL_Expression_Smaller_EqualImpl()
+ {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EClass eStaticClass()
+ {
+ return SensinactPackage.Literals.DSL_EXPRESSION_SMALLER_EQUAL;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_Expression getLeft()
+ {
+ return left;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public NotificationChain basicSetLeft(DSL_Expression newLeft, NotificationChain msgs)
+ {
+ DSL_Expression oldLeft = left;
+ left = newLeft;
+ if (eNotificationRequired())
+ {
+ ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_EXPRESSION_SMALLER_EQUAL__LEFT, oldLeft, newLeft);
+ if (msgs == null) msgs = notification; else msgs.add(notification);
+ }
+ return msgs;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setLeft(DSL_Expression newLeft)
+ {
+ if (newLeft != left)
+ {
+ NotificationChain msgs = null;
+ if (left != null)
+ msgs = ((InternalEObject)left).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_EXPRESSION_SMALLER_EQUAL__LEFT, null, msgs);
+ if (newLeft != null)
+ msgs = ((InternalEObject)newLeft).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_EXPRESSION_SMALLER_EQUAL__LEFT, null, msgs);
+ msgs = basicSetLeft(newLeft, msgs);
+ if (msgs != null) msgs.dispatch();
+ }
+ else if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_EXPRESSION_SMALLER_EQUAL__LEFT, newLeft, newLeft));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_Expression getRight()
+ {
+ return right;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public NotificationChain basicSetRight(DSL_Expression newRight, NotificationChain msgs)
+ {
+ DSL_Expression oldRight = right;
+ right = newRight;
+ if (eNotificationRequired())
+ {
+ ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_EXPRESSION_SMALLER_EQUAL__RIGHT, oldRight, newRight);
+ if (msgs == null) msgs = notification; else msgs.add(notification);
+ }
+ return msgs;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setRight(DSL_Expression newRight)
+ {
+ if (newRight != right)
+ {
+ NotificationChain msgs = null;
+ if (right != null)
+ msgs = ((InternalEObject)right).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_EXPRESSION_SMALLER_EQUAL__RIGHT, null, msgs);
+ if (newRight != null)
+ msgs = ((InternalEObject)newRight).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_EXPRESSION_SMALLER_EQUAL__RIGHT, null, msgs);
+ msgs = basicSetRight(newRight, msgs);
+ if (msgs != null) msgs.dispatch();
+ }
+ else if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_EXPRESSION_SMALLER_EQUAL__RIGHT, newRight, newRight));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_EXPRESSION_SMALLER_EQUAL__LEFT:
+ return basicSetLeft(null, msgs);
+ case SensinactPackage.DSL_EXPRESSION_SMALLER_EQUAL__RIGHT:
+ return basicSetRight(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 SensinactPackage.DSL_EXPRESSION_SMALLER_EQUAL__LEFT:
+ return getLeft();
+ case SensinactPackage.DSL_EXPRESSION_SMALLER_EQUAL__RIGHT:
+ return getRight();
+ }
+ return super.eGet(featureID, resolve, coreType);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eSet(int featureID, Object newValue)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_EXPRESSION_SMALLER_EQUAL__LEFT:
+ setLeft((DSL_Expression)newValue);
+ return;
+ case SensinactPackage.DSL_EXPRESSION_SMALLER_EQUAL__RIGHT:
+ setRight((DSL_Expression)newValue);
+ return;
+ }
+ super.eSet(featureID, newValue);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eUnset(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_EXPRESSION_SMALLER_EQUAL__LEFT:
+ setLeft((DSL_Expression)null);
+ return;
+ case SensinactPackage.DSL_EXPRESSION_SMALLER_EQUAL__RIGHT:
+ setRight((DSL_Expression)null);
+ return;
+ }
+ super.eUnset(featureID);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public boolean eIsSet(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_EXPRESSION_SMALLER_EQUAL__LEFT:
+ return left != null;
+ case SensinactPackage.DSL_EXPRESSION_SMALLER_EQUAL__RIGHT:
+ return right != null;
+ }
+ return super.eIsSet(featureID);
+ }
+
+} //DSL_Expression_Smaller_EqualImpl
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_IfDoImpl.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_IfDoImpl.java
new file mode 100644
index 0000000..bddce82
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_IfDoImpl.java
@@ -0,0 +1,277 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact.impl;
+
+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;
+
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Expression;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_IfDo;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_ListActions;
+import org.eclipse.sensinact.studio.language.sensinact.SensinactPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>DSL If Do</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_IfDoImpl#getCondition <em>Condition</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_IfDoImpl#getActions <em>Actions</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class DSL_IfDoImpl extends MinimalEObjectImpl.Container implements DSL_IfDo
+{
+ /**
+ * The cached value of the '{@link #getCondition() <em>Condition</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getCondition()
+ * @generated
+ * @ordered
+ */
+ protected DSL_Expression condition;
+
+ /**
+ * The cached value of the '{@link #getActions() <em>Actions</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getActions()
+ * @generated
+ * @ordered
+ */
+ protected DSL_ListActions actions;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected DSL_IfDoImpl()
+ {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EClass eStaticClass()
+ {
+ return SensinactPackage.Literals.DSL_IF_DO;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_Expression getCondition()
+ {
+ return condition;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public NotificationChain basicSetCondition(DSL_Expression newCondition, NotificationChain msgs)
+ {
+ DSL_Expression oldCondition = condition;
+ condition = newCondition;
+ if (eNotificationRequired())
+ {
+ ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_IF_DO__CONDITION, oldCondition, newCondition);
+ if (msgs == null) msgs = notification; else msgs.add(notification);
+ }
+ return msgs;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setCondition(DSL_Expression newCondition)
+ {
+ if (newCondition != condition)
+ {
+ NotificationChain msgs = null;
+ if (condition != null)
+ msgs = ((InternalEObject)condition).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_IF_DO__CONDITION, null, msgs);
+ if (newCondition != null)
+ msgs = ((InternalEObject)newCondition).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_IF_DO__CONDITION, null, msgs);
+ msgs = basicSetCondition(newCondition, msgs);
+ if (msgs != null) msgs.dispatch();
+ }
+ else if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_IF_DO__CONDITION, newCondition, newCondition));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_ListActions getActions()
+ {
+ return actions;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public NotificationChain basicSetActions(DSL_ListActions newActions, NotificationChain msgs)
+ {
+ DSL_ListActions oldActions = actions;
+ actions = newActions;
+ if (eNotificationRequired())
+ {
+ ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_IF_DO__ACTIONS, oldActions, newActions);
+ if (msgs == null) msgs = notification; else msgs.add(notification);
+ }
+ return msgs;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setActions(DSL_ListActions newActions)
+ {
+ if (newActions != actions)
+ {
+ NotificationChain msgs = null;
+ if (actions != null)
+ msgs = ((InternalEObject)actions).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_IF_DO__ACTIONS, null, msgs);
+ if (newActions != null)
+ msgs = ((InternalEObject)newActions).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_IF_DO__ACTIONS, null, msgs);
+ msgs = basicSetActions(newActions, msgs);
+ if (msgs != null) msgs.dispatch();
+ }
+ else if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_IF_DO__ACTIONS, newActions, newActions));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_IF_DO__CONDITION:
+ return basicSetCondition(null, msgs);
+ case SensinactPackage.DSL_IF_DO__ACTIONS:
+ return basicSetActions(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 SensinactPackage.DSL_IF_DO__CONDITION:
+ return getCondition();
+ case SensinactPackage.DSL_IF_DO__ACTIONS:
+ return getActions();
+ }
+ return super.eGet(featureID, resolve, coreType);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eSet(int featureID, Object newValue)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_IF_DO__CONDITION:
+ setCondition((DSL_Expression)newValue);
+ return;
+ case SensinactPackage.DSL_IF_DO__ACTIONS:
+ setActions((DSL_ListActions)newValue);
+ return;
+ }
+ super.eSet(featureID, newValue);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eUnset(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_IF_DO__CONDITION:
+ setCondition((DSL_Expression)null);
+ return;
+ case SensinactPackage.DSL_IF_DO__ACTIONS:
+ setActions((DSL_ListActions)null);
+ return;
+ }
+ super.eUnset(featureID);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public boolean eIsSet(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_IF_DO__CONDITION:
+ return condition != null;
+ case SensinactPackage.DSL_IF_DO__ACTIONS:
+ return actions != null;
+ }
+ return super.eIsSet(featureID);
+ }
+
+} //DSL_IfDoImpl
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_ListActionsImpl.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_ListActionsImpl.java
new file mode 100644
index 0000000..86230e2
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_ListActionsImpl.java
@@ -0,0 +1,178 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact.impl;
+
+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.MinimalEObjectImpl;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+import org.eclipse.sensinact.studio.language.sensinact.DSL_ListActions;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_ResourceAction;
+import org.eclipse.sensinact.studio.language.sensinact.SensinactPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>DSL List Actions</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_ListActionsImpl#getActionList <em>Action List</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class DSL_ListActionsImpl extends MinimalEObjectImpl.Container implements DSL_ListActions
+{
+ /**
+ * The cached value of the '{@link #getActionList() <em>Action List</em>}' containment reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getActionList()
+ * @generated
+ * @ordered
+ */
+ protected EList<DSL_ResourceAction> actionList;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected DSL_ListActionsImpl()
+ {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EClass eStaticClass()
+ {
+ return SensinactPackage.Literals.DSL_LIST_ACTIONS;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EList<DSL_ResourceAction> getActionList()
+ {
+ if (actionList == null)
+ {
+ actionList = new EObjectContainmentEList<DSL_ResourceAction>(DSL_ResourceAction.class, this, SensinactPackage.DSL_LIST_ACTIONS__ACTION_LIST);
+ }
+ return actionList;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_LIST_ACTIONS__ACTION_LIST:
+ return ((InternalEList<?>)getActionList()).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 SensinactPackage.DSL_LIST_ACTIONS__ACTION_LIST:
+ return getActionList();
+ }
+ 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 SensinactPackage.DSL_LIST_ACTIONS__ACTION_LIST:
+ getActionList().clear();
+ getActionList().addAll((Collection<? extends DSL_ResourceAction>)newValue);
+ return;
+ }
+ super.eSet(featureID, newValue);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eUnset(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_LIST_ACTIONS__ACTION_LIST:
+ getActionList().clear();
+ return;
+ }
+ super.eUnset(featureID);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public boolean eIsSet(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_LIST_ACTIONS__ACTION_LIST:
+ return actionList != null && !actionList.isEmpty();
+ }
+ return super.eIsSet(featureID);
+ }
+
+} //DSL_ListActionsImpl
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_ListParamImpl.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_ListParamImpl.java
new file mode 100644
index 0000000..3b8fb94
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_ListParamImpl.java
@@ -0,0 +1,178 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact.impl;
+
+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.MinimalEObjectImpl;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Expression;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_ListParam;
+import org.eclipse.sensinact.studio.language.sensinact.SensinactPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>DSL List Param</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_ListParamImpl#getParam <em>Param</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class DSL_ListParamImpl extends MinimalEObjectImpl.Container implements DSL_ListParam
+{
+ /**
+ * The cached value of the '{@link #getParam() <em>Param</em>}' containment reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getParam()
+ * @generated
+ * @ordered
+ */
+ protected EList<DSL_Expression> param;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected DSL_ListParamImpl()
+ {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EClass eStaticClass()
+ {
+ return SensinactPackage.Literals.DSL_LIST_PARAM;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EList<DSL_Expression> getParam()
+ {
+ if (param == null)
+ {
+ param = new EObjectContainmentEList<DSL_Expression>(DSL_Expression.class, this, SensinactPackage.DSL_LIST_PARAM__PARAM);
+ }
+ return param;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_LIST_PARAM__PARAM:
+ return ((InternalEList<?>)getParam()).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 SensinactPackage.DSL_LIST_PARAM__PARAM:
+ return getParam();
+ }
+ 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 SensinactPackage.DSL_LIST_PARAM__PARAM:
+ getParam().clear();
+ getParam().addAll((Collection<? extends DSL_Expression>)newValue);
+ return;
+ }
+ super.eSet(featureID, newValue);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eUnset(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_LIST_PARAM__PARAM:
+ getParam().clear();
+ return;
+ }
+ super.eUnset(featureID);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public boolean eIsSet(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_LIST_PARAM__PARAM:
+ return param != null && !param.isEmpty();
+ }
+ return super.eIsSet(featureID);
+ }
+
+} //DSL_ListParamImpl
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_Object_BooleanImpl.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_Object_BooleanImpl.java
new file mode 100644
index 0000000..9dd6346
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_Object_BooleanImpl.java
@@ -0,0 +1,187 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Object_Boolean;
+import org.eclipse.sensinact.studio.language.sensinact.SensinactPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>DSL Object Boolean</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Object_BooleanImpl#isValue <em>Value</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class DSL_Object_BooleanImpl extends DSL_ExpressionImpl implements DSL_Object_Boolean
+{
+ /**
+ * The default value of the '{@link #isValue() <em>Value</em>}' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #isValue()
+ * @generated
+ * @ordered
+ */
+ protected static final boolean VALUE_EDEFAULT = false;
+
+ /**
+ * The cached value of the '{@link #isValue() <em>Value</em>}' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #isValue()
+ * @generated
+ * @ordered
+ */
+ protected boolean value = VALUE_EDEFAULT;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected DSL_Object_BooleanImpl()
+ {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EClass eStaticClass()
+ {
+ return SensinactPackage.Literals.DSL_OBJECT_BOOLEAN;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public boolean isValue()
+ {
+ return value;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setValue(boolean newValue)
+ {
+ boolean oldValue = value;
+ value = newValue;
+ if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_OBJECT_BOOLEAN__VALUE, oldValue, value));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Object eGet(int featureID, boolean resolve, boolean coreType)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_OBJECT_BOOLEAN__VALUE:
+ return isValue();
+ }
+ return super.eGet(featureID, resolve, coreType);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eSet(int featureID, Object newValue)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_OBJECT_BOOLEAN__VALUE:
+ setValue((Boolean)newValue);
+ return;
+ }
+ super.eSet(featureID, newValue);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eUnset(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_OBJECT_BOOLEAN__VALUE:
+ setValue(VALUE_EDEFAULT);
+ return;
+ }
+ super.eUnset(featureID);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public boolean eIsSet(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_OBJECT_BOOLEAN__VALUE:
+ return value != VALUE_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(" (value: ");
+ result.append(value);
+ result.append(')');
+ return result.toString();
+ }
+
+} //DSL_Object_BooleanImpl
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_Object_NumberImpl.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_Object_NumberImpl.java
new file mode 100644
index 0000000..01e5f6f
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_Object_NumberImpl.java
@@ -0,0 +1,189 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact.impl;
+
+import java.math.BigDecimal;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Object_Number;
+import org.eclipse.sensinact.studio.language.sensinact.SensinactPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>DSL Object Number</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Object_NumberImpl#getValue <em>Value</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class DSL_Object_NumberImpl extends DSL_ExpressionImpl implements DSL_Object_Number
+{
+ /**
+ * The default value of the '{@link #getValue() <em>Value</em>}' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getValue()
+ * @generated
+ * @ordered
+ */
+ protected static final BigDecimal 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 BigDecimal value = VALUE_EDEFAULT;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected DSL_Object_NumberImpl()
+ {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EClass eStaticClass()
+ {
+ return SensinactPackage.Literals.DSL_OBJECT_NUMBER;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public BigDecimal getValue()
+ {
+ return value;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setValue(BigDecimal newValue)
+ {
+ BigDecimal oldValue = value;
+ value = newValue;
+ if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_OBJECT_NUMBER__VALUE, oldValue, value));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Object eGet(int featureID, boolean resolve, boolean coreType)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_OBJECT_NUMBER__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 SensinactPackage.DSL_OBJECT_NUMBER__VALUE:
+ setValue((BigDecimal)newValue);
+ return;
+ }
+ super.eSet(featureID, newValue);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eUnset(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_OBJECT_NUMBER__VALUE:
+ setValue(VALUE_EDEFAULT);
+ return;
+ }
+ super.eUnset(featureID);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public boolean eIsSet(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_OBJECT_NUMBER__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(" (value: ");
+ result.append(value);
+ result.append(')');
+ return result.toString();
+ }
+
+} //DSL_Object_NumberImpl
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_Object_RefImpl.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_Object_RefImpl.java
new file mode 100644
index 0000000..7e260ee
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_Object_RefImpl.java
@@ -0,0 +1,183 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact.impl;
+
+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.sensinact.studio.language.sensinact.DSL_Object_Ref;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_REF;
+import org.eclipse.sensinact.studio.language.sensinact.SensinactPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>DSL Object Ref</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Object_RefImpl#getValue <em>Value</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class DSL_Object_RefImpl extends DSL_ExpressionImpl implements DSL_Object_Ref
+{
+ /**
+ * The cached value of the '{@link #getValue() <em>Value</em>}' reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getValue()
+ * @generated
+ * @ordered
+ */
+ protected DSL_REF value;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected DSL_Object_RefImpl()
+ {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EClass eStaticClass()
+ {
+ return SensinactPackage.Literals.DSL_OBJECT_REF;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_REF getValue()
+ {
+ if (value != null && value.eIsProxy())
+ {
+ InternalEObject oldValue = (InternalEObject)value;
+ value = (DSL_REF)eResolveProxy(oldValue);
+ if (value != oldValue)
+ {
+ if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.RESOLVE, SensinactPackage.DSL_OBJECT_REF__VALUE, oldValue, value));
+ }
+ }
+ return value;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_REF basicGetValue()
+ {
+ return value;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setValue(DSL_REF newValue)
+ {
+ DSL_REF oldValue = value;
+ value = newValue;
+ if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_OBJECT_REF__VALUE, oldValue, value));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Object eGet(int featureID, boolean resolve, boolean coreType)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_OBJECT_REF__VALUE:
+ if (resolve) return getValue();
+ return basicGetValue();
+ }
+ return super.eGet(featureID, resolve, coreType);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eSet(int featureID, Object newValue)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_OBJECT_REF__VALUE:
+ setValue((DSL_REF)newValue);
+ return;
+ }
+ super.eSet(featureID, newValue);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eUnset(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_OBJECT_REF__VALUE:
+ setValue((DSL_REF)null);
+ return;
+ }
+ super.eUnset(featureID);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public boolean eIsSet(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_OBJECT_REF__VALUE:
+ return value != null;
+ }
+ return super.eIsSet(featureID);
+ }
+
+} //DSL_Object_RefImpl
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_Object_StringImpl.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_Object_StringImpl.java
new file mode 100644
index 0000000..b37c7c3
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_Object_StringImpl.java
@@ -0,0 +1,187 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Object_String;
+import org.eclipse.sensinact.studio.language.sensinact.SensinactPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>DSL Object String</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_Object_StringImpl#getValue <em>Value</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class DSL_Object_StringImpl extends DSL_ExpressionImpl implements DSL_Object_String
+{
+ /**
+ * The default value of the '{@link #getValue() <em>Value</em>}' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getValue()
+ * @generated
+ * @ordered
+ */
+ protected static final String 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 String value = VALUE_EDEFAULT;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected DSL_Object_StringImpl()
+ {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EClass eStaticClass()
+ {
+ return SensinactPackage.Literals.DSL_OBJECT_STRING;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public String getValue()
+ {
+ return value;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setValue(String newValue)
+ {
+ String oldValue = value;
+ value = newValue;
+ if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_OBJECT_STRING__VALUE, oldValue, value));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Object eGet(int featureID, boolean resolve, boolean coreType)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_OBJECT_STRING__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 SensinactPackage.DSL_OBJECT_STRING__VALUE:
+ setValue((String)newValue);
+ return;
+ }
+ super.eSet(featureID, newValue);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eUnset(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_OBJECT_STRING__VALUE:
+ setValue(VALUE_EDEFAULT);
+ return;
+ }
+ super.eUnset(featureID);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public boolean eIsSet(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_OBJECT_STRING__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(" (value: ");
+ result.append(value);
+ result.append(')');
+ return result.toString();
+ }
+
+} //DSL_Object_StringImpl
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_OnImpl.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_OnImpl.java
new file mode 100644
index 0000000..c3c8456
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_OnImpl.java
@@ -0,0 +1,178 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact.impl;
+
+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.MinimalEObjectImpl;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+import org.eclipse.sensinact.studio.language.sensinact.DSL_On;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_REF_CONDITION;
+import org.eclipse.sensinact.studio.language.sensinact.SensinactPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>DSL On</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_OnImpl#getTriggers <em>Triggers</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class DSL_OnImpl extends MinimalEObjectImpl.Container implements DSL_On
+{
+ /**
+ * The cached value of the '{@link #getTriggers() <em>Triggers</em>}' containment reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getTriggers()
+ * @generated
+ * @ordered
+ */
+ protected EList<DSL_REF_CONDITION> triggers;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected DSL_OnImpl()
+ {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EClass eStaticClass()
+ {
+ return SensinactPackage.Literals.DSL_ON;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EList<DSL_REF_CONDITION> getTriggers()
+ {
+ if (triggers == null)
+ {
+ triggers = new EObjectContainmentEList<DSL_REF_CONDITION>(DSL_REF_CONDITION.class, this, SensinactPackage.DSL_ON__TRIGGERS);
+ }
+ return triggers;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_ON__TRIGGERS:
+ return ((InternalEList<?>)getTriggers()).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 SensinactPackage.DSL_ON__TRIGGERS:
+ return getTriggers();
+ }
+ 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 SensinactPackage.DSL_ON__TRIGGERS:
+ getTriggers().clear();
+ getTriggers().addAll((Collection<? extends DSL_REF_CONDITION>)newValue);
+ return;
+ }
+ super.eSet(featureID, newValue);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eUnset(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_ON__TRIGGERS:
+ getTriggers().clear();
+ return;
+ }
+ super.eUnset(featureID);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public boolean eIsSet(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_ON__TRIGGERS:
+ return triggers != null && !triggers.isEmpty();
+ }
+ return super.eIsSet(featureID);
+ }
+
+} //DSL_OnImpl
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_REFImpl.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_REFImpl.java
new file mode 100644
index 0000000..f57d148
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_REFImpl.java
@@ -0,0 +1,188 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact.impl;
+
+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;
+
+import org.eclipse.sensinact.studio.language.sensinact.DSL_REF;
+import org.eclipse.sensinact.studio.language.sensinact.SensinactPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>DSL REF</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_REFImpl#getName <em>Name</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class DSL_REFImpl extends MinimalEObjectImpl.Container implements DSL_REF
+{
+ /**
+ * 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 DSL_REFImpl()
+ {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EClass eStaticClass()
+ {
+ return SensinactPackage.Literals.DSL_REF;
+ }
+
+ /**
+ * <!-- 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, SensinactPackage.DSL_REF__NAME, oldName, name));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Object eGet(int featureID, boolean resolve, boolean coreType)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_REF__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 SensinactPackage.DSL_REF__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 SensinactPackage.DSL_REF__NAME:
+ setName(NAME_EDEFAULT);
+ return;
+ }
+ super.eUnset(featureID);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public boolean eIsSet(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_REF__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();
+ }
+
+} //DSL_REFImpl
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_REF_CONDITIONImpl.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_REF_CONDITIONImpl.java
new file mode 100644
index 0000000..ba70c34
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_REF_CONDITIONImpl.java
@@ -0,0 +1,184 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact.impl;
+
+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;
+
+import org.eclipse.sensinact.studio.language.sensinact.DSL_REF;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_REF_CONDITION;
+import org.eclipse.sensinact.studio.language.sensinact.SensinactPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>DSL REF CONDITION</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_REF_CONDITIONImpl#getRef <em>Ref</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class DSL_REF_CONDITIONImpl extends MinimalEObjectImpl.Container implements DSL_REF_CONDITION
+{
+ /**
+ * The cached value of the '{@link #getRef() <em>Ref</em>}' reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getRef()
+ * @generated
+ * @ordered
+ */
+ protected DSL_REF ref;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected DSL_REF_CONDITIONImpl()
+ {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EClass eStaticClass()
+ {
+ return SensinactPackage.Literals.DSL_REF_CONDITION;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_REF getRef()
+ {
+ if (ref != null && ref.eIsProxy())
+ {
+ InternalEObject oldRef = (InternalEObject)ref;
+ ref = (DSL_REF)eResolveProxy(oldRef);
+ if (ref != oldRef)
+ {
+ if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.RESOLVE, SensinactPackage.DSL_REF_CONDITION__REF, oldRef, ref));
+ }
+ }
+ return ref;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_REF basicGetRef()
+ {
+ return ref;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setRef(DSL_REF newRef)
+ {
+ DSL_REF oldRef = ref;
+ ref = newRef;
+ if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_REF_CONDITION__REF, oldRef, ref));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Object eGet(int featureID, boolean resolve, boolean coreType)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_REF_CONDITION__REF:
+ if (resolve) return getRef();
+ return basicGetRef();
+ }
+ return super.eGet(featureID, resolve, coreType);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eSet(int featureID, Object newValue)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_REF_CONDITION__REF:
+ setRef((DSL_REF)newValue);
+ return;
+ }
+ super.eSet(featureID, newValue);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eUnset(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_REF_CONDITION__REF:
+ setRef((DSL_REF)null);
+ return;
+ }
+ super.eUnset(featureID);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public boolean eIsSet(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_REF_CONDITION__REF:
+ return ref != null;
+ }
+ return super.eIsSet(featureID);
+ }
+
+} //DSL_REF_CONDITIONImpl
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_ResourceActionImpl.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_ResourceActionImpl.java
new file mode 100644
index 0000000..9030821
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_ResourceActionImpl.java
@@ -0,0 +1,398 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact.impl;
+
+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;
+
+import org.eclipse.sensinact.studio.language.sensinact.DSL_ListParam;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_REF;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_ResourceAction;
+import org.eclipse.sensinact.studio.language.sensinact.SensinactPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>DSL Resource Action</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_ResourceActionImpl#getVariable <em>Variable</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_ResourceActionImpl#getRef <em>Ref</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_ResourceActionImpl#getActiontype <em>Actiontype</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_ResourceActionImpl#getListParam <em>List Param</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class DSL_ResourceActionImpl extends MinimalEObjectImpl.Container implements DSL_ResourceAction
+{
+ /**
+ * The default value of the '{@link #getVariable() <em>Variable</em>}' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getVariable()
+ * @generated
+ * @ordered
+ */
+ protected static final String VARIABLE_EDEFAULT = null;
+
+ /**
+ * The cached value of the '{@link #getVariable() <em>Variable</em>}' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getVariable()
+ * @generated
+ * @ordered
+ */
+ protected String variable = VARIABLE_EDEFAULT;
+
+ /**
+ * The cached value of the '{@link #getRef() <em>Ref</em>}' reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getRef()
+ * @generated
+ * @ordered
+ */
+ protected DSL_REF ref;
+
+ /**
+ * The default value of the '{@link #getActiontype() <em>Actiontype</em>}' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getActiontype()
+ * @generated
+ * @ordered
+ */
+ protected static final String ACTIONTYPE_EDEFAULT = null;
+
+ /**
+ * The cached value of the '{@link #getActiontype() <em>Actiontype</em>}' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getActiontype()
+ * @generated
+ * @ordered
+ */
+ protected String actiontype = ACTIONTYPE_EDEFAULT;
+
+ /**
+ * The cached value of the '{@link #getListParam() <em>List Param</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getListParam()
+ * @generated
+ * @ordered
+ */
+ protected DSL_ListParam listParam;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected DSL_ResourceActionImpl()
+ {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EClass eStaticClass()
+ {
+ return SensinactPackage.Literals.DSL_RESOURCE_ACTION;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public String getVariable()
+ {
+ return variable;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setVariable(String newVariable)
+ {
+ String oldVariable = variable;
+ variable = newVariable;
+ if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_RESOURCE_ACTION__VARIABLE, oldVariable, variable));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_REF getRef()
+ {
+ if (ref != null && ref.eIsProxy())
+ {
+ InternalEObject oldRef = (InternalEObject)ref;
+ ref = (DSL_REF)eResolveProxy(oldRef);
+ if (ref != oldRef)
+ {
+ if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.RESOLVE, SensinactPackage.DSL_RESOURCE_ACTION__REF, oldRef, ref));
+ }
+ }
+ return ref;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_REF basicGetRef()
+ {
+ return ref;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setRef(DSL_REF newRef)
+ {
+ DSL_REF oldRef = ref;
+ ref = newRef;
+ if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_RESOURCE_ACTION__REF, oldRef, ref));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public String getActiontype()
+ {
+ return actiontype;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setActiontype(String newActiontype)
+ {
+ String oldActiontype = actiontype;
+ actiontype = newActiontype;
+ if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_RESOURCE_ACTION__ACTIONTYPE, oldActiontype, actiontype));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_ListParam getListParam()
+ {
+ return listParam;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public NotificationChain basicSetListParam(DSL_ListParam newListParam, NotificationChain msgs)
+ {
+ DSL_ListParam oldListParam = listParam;
+ listParam = newListParam;
+ if (eNotificationRequired())
+ {
+ ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_RESOURCE_ACTION__LIST_PARAM, oldListParam, newListParam);
+ if (msgs == null) msgs = notification; else msgs.add(notification);
+ }
+ return msgs;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setListParam(DSL_ListParam newListParam)
+ {
+ if (newListParam != listParam)
+ {
+ NotificationChain msgs = null;
+ if (listParam != null)
+ msgs = ((InternalEObject)listParam).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_RESOURCE_ACTION__LIST_PARAM, null, msgs);
+ if (newListParam != null)
+ msgs = ((InternalEObject)newListParam).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_RESOURCE_ACTION__LIST_PARAM, null, msgs);
+ msgs = basicSetListParam(newListParam, msgs);
+ if (msgs != null) msgs.dispatch();
+ }
+ else if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_RESOURCE_ACTION__LIST_PARAM, newListParam, newListParam));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_RESOURCE_ACTION__LIST_PARAM:
+ return basicSetListParam(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 SensinactPackage.DSL_RESOURCE_ACTION__VARIABLE:
+ return getVariable();
+ case SensinactPackage.DSL_RESOURCE_ACTION__REF:
+ if (resolve) return getRef();
+ return basicGetRef();
+ case SensinactPackage.DSL_RESOURCE_ACTION__ACTIONTYPE:
+ return getActiontype();
+ case SensinactPackage.DSL_RESOURCE_ACTION__LIST_PARAM:
+ return getListParam();
+ }
+ return super.eGet(featureID, resolve, coreType);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eSet(int featureID, Object newValue)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_RESOURCE_ACTION__VARIABLE:
+ setVariable((String)newValue);
+ return;
+ case SensinactPackage.DSL_RESOURCE_ACTION__REF:
+ setRef((DSL_REF)newValue);
+ return;
+ case SensinactPackage.DSL_RESOURCE_ACTION__ACTIONTYPE:
+ setActiontype((String)newValue);
+ return;
+ case SensinactPackage.DSL_RESOURCE_ACTION__LIST_PARAM:
+ setListParam((DSL_ListParam)newValue);
+ return;
+ }
+ super.eSet(featureID, newValue);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eUnset(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_RESOURCE_ACTION__VARIABLE:
+ setVariable(VARIABLE_EDEFAULT);
+ return;
+ case SensinactPackage.DSL_RESOURCE_ACTION__REF:
+ setRef((DSL_REF)null);
+ return;
+ case SensinactPackage.DSL_RESOURCE_ACTION__ACTIONTYPE:
+ setActiontype(ACTIONTYPE_EDEFAULT);
+ return;
+ case SensinactPackage.DSL_RESOURCE_ACTION__LIST_PARAM:
+ setListParam((DSL_ListParam)null);
+ return;
+ }
+ super.eUnset(featureID);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public boolean eIsSet(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_RESOURCE_ACTION__VARIABLE:
+ return VARIABLE_EDEFAULT == null ? variable != null : !VARIABLE_EDEFAULT.equals(variable);
+ case SensinactPackage.DSL_RESOURCE_ACTION__REF:
+ return ref != null;
+ case SensinactPackage.DSL_RESOURCE_ACTION__ACTIONTYPE:
+ return ACTIONTYPE_EDEFAULT == null ? actiontype != null : !ACTIONTYPE_EDEFAULT.equals(actiontype);
+ case SensinactPackage.DSL_RESOURCE_ACTION__LIST_PARAM:
+ return listParam != null;
+ }
+ 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(" (variable: ");
+ result.append(variable);
+ result.append(", actiontype: ");
+ result.append(actiontype);
+ result.append(')');
+ return result.toString();
+ }
+
+} //DSL_ResourceActionImpl
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_ResourceImpl.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_ResourceImpl.java
new file mode 100644
index 0000000..ff4d103
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_ResourceImpl.java
@@ -0,0 +1,355 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Resource;
+import org.eclipse.sensinact.studio.language.sensinact.SensinactPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>DSL Resource</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_ResourceImpl#getGatewayID <em>Gateway ID</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_ResourceImpl#getDeviceID <em>Device ID</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_ResourceImpl#getServiceID <em>Service ID</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_ResourceImpl#getResourceID <em>Resource ID</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class DSL_ResourceImpl extends DSL_REFImpl implements DSL_Resource
+{
+ /**
+ * The default value of the '{@link #getGatewayID() <em>Gateway ID</em>}' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getGatewayID()
+ * @generated
+ * @ordered
+ */
+ protected static final String GATEWAY_ID_EDEFAULT = null;
+
+ /**
+ * The cached value of the '{@link #getGatewayID() <em>Gateway ID</em>}' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getGatewayID()
+ * @generated
+ * @ordered
+ */
+ protected String gatewayID = GATEWAY_ID_EDEFAULT;
+
+ /**
+ * The default value of the '{@link #getDeviceID() <em>Device ID</em>}' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getDeviceID()
+ * @generated
+ * @ordered
+ */
+ protected static final String DEVICE_ID_EDEFAULT = null;
+
+ /**
+ * The cached value of the '{@link #getDeviceID() <em>Device ID</em>}' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getDeviceID()
+ * @generated
+ * @ordered
+ */
+ protected String deviceID = DEVICE_ID_EDEFAULT;
+
+ /**
+ * The default value of the '{@link #getServiceID() <em>Service ID</em>}' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getServiceID()
+ * @generated
+ * @ordered
+ */
+ protected static final String SERVICE_ID_EDEFAULT = null;
+
+ /**
+ * The cached value of the '{@link #getServiceID() <em>Service ID</em>}' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getServiceID()
+ * @generated
+ * @ordered
+ */
+ protected String serviceID = SERVICE_ID_EDEFAULT;
+
+ /**
+ * The default value of the '{@link #getResourceID() <em>Resource ID</em>}' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getResourceID()
+ * @generated
+ * @ordered
+ */
+ protected static final String RESOURCE_ID_EDEFAULT = null;
+
+ /**
+ * The cached value of the '{@link #getResourceID() <em>Resource ID</em>}' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getResourceID()
+ * @generated
+ * @ordered
+ */
+ protected String resourceID = RESOURCE_ID_EDEFAULT;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected DSL_ResourceImpl()
+ {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EClass eStaticClass()
+ {
+ return SensinactPackage.Literals.DSL_RESOURCE;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public String getGatewayID()
+ {
+ return gatewayID;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setGatewayID(String newGatewayID)
+ {
+ String oldGatewayID = gatewayID;
+ gatewayID = newGatewayID;
+ if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_RESOURCE__GATEWAY_ID, oldGatewayID, gatewayID));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public String getDeviceID()
+ {
+ return deviceID;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setDeviceID(String newDeviceID)
+ {
+ String oldDeviceID = deviceID;
+ deviceID = newDeviceID;
+ if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_RESOURCE__DEVICE_ID, oldDeviceID, deviceID));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public String getServiceID()
+ {
+ return serviceID;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setServiceID(String newServiceID)
+ {
+ String oldServiceID = serviceID;
+ serviceID = newServiceID;
+ if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_RESOURCE__SERVICE_ID, oldServiceID, serviceID));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public String getResourceID()
+ {
+ return resourceID;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setResourceID(String newResourceID)
+ {
+ String oldResourceID = resourceID;
+ resourceID = newResourceID;
+ if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_RESOURCE__RESOURCE_ID, oldResourceID, resourceID));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Object eGet(int featureID, boolean resolve, boolean coreType)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_RESOURCE__GATEWAY_ID:
+ return getGatewayID();
+ case SensinactPackage.DSL_RESOURCE__DEVICE_ID:
+ return getDeviceID();
+ case SensinactPackage.DSL_RESOURCE__SERVICE_ID:
+ return getServiceID();
+ case SensinactPackage.DSL_RESOURCE__RESOURCE_ID:
+ return getResourceID();
+ }
+ return super.eGet(featureID, resolve, coreType);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eSet(int featureID, Object newValue)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_RESOURCE__GATEWAY_ID:
+ setGatewayID((String)newValue);
+ return;
+ case SensinactPackage.DSL_RESOURCE__DEVICE_ID:
+ setDeviceID((String)newValue);
+ return;
+ case SensinactPackage.DSL_RESOURCE__SERVICE_ID:
+ setServiceID((String)newValue);
+ return;
+ case SensinactPackage.DSL_RESOURCE__RESOURCE_ID:
+ setResourceID((String)newValue);
+ return;
+ }
+ super.eSet(featureID, newValue);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eUnset(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_RESOURCE__GATEWAY_ID:
+ setGatewayID(GATEWAY_ID_EDEFAULT);
+ return;
+ case SensinactPackage.DSL_RESOURCE__DEVICE_ID:
+ setDeviceID(DEVICE_ID_EDEFAULT);
+ return;
+ case SensinactPackage.DSL_RESOURCE__SERVICE_ID:
+ setServiceID(SERVICE_ID_EDEFAULT);
+ return;
+ case SensinactPackage.DSL_RESOURCE__RESOURCE_ID:
+ setResourceID(RESOURCE_ID_EDEFAULT);
+ return;
+ }
+ super.eUnset(featureID);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public boolean eIsSet(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_RESOURCE__GATEWAY_ID:
+ return GATEWAY_ID_EDEFAULT == null ? gatewayID != null : !GATEWAY_ID_EDEFAULT.equals(gatewayID);
+ case SensinactPackage.DSL_RESOURCE__DEVICE_ID:
+ return DEVICE_ID_EDEFAULT == null ? deviceID != null : !DEVICE_ID_EDEFAULT.equals(deviceID);
+ case SensinactPackage.DSL_RESOURCE__SERVICE_ID:
+ return SERVICE_ID_EDEFAULT == null ? serviceID != null : !SERVICE_ID_EDEFAULT.equals(serviceID);
+ case SensinactPackage.DSL_RESOURCE__RESOURCE_ID:
+ return RESOURCE_ID_EDEFAULT == null ? resourceID != null : !RESOURCE_ID_EDEFAULT.equals(resourceID);
+ }
+ 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(" (gatewayID: ");
+ result.append(gatewayID);
+ result.append(", deviceID: ");
+ result.append(deviceID);
+ result.append(", serviceID: ");
+ result.append(serviceID);
+ result.append(", resourceID: ");
+ result.append(resourceID);
+ result.append(')');
+ return result.toString();
+ }
+
+} //DSL_ResourceImpl
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_SENSINACTImpl.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_SENSINACTImpl.java
new file mode 100644
index 0000000..7010963
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/DSL_SENSINACTImpl.java
@@ -0,0 +1,363 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact.impl;
+
+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;
+
+import org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_STATEMENT;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_ECA_STATEMENT;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_On;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Resource;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_SENSINACT;
+import org.eclipse.sensinact.studio.language.sensinact.SensinactPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>DSL SENSINACT</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_SENSINACTImpl#getResources <em>Resources</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_SENSINACTImpl#getCep <em>Cep</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_SENSINACTImpl#getOn <em>On</em>}</li>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.DSL_SENSINACTImpl#getEca <em>Eca</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class DSL_SENSINACTImpl extends MinimalEObjectImpl.Container implements DSL_SENSINACT
+{
+ /**
+ * The cached value of the '{@link #getResources() <em>Resources</em>}' containment reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getResources()
+ * @generated
+ * @ordered
+ */
+ protected EList<DSL_Resource> resources;
+
+ /**
+ * The cached value of the '{@link #getCep() <em>Cep</em>}' containment reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getCep()
+ * @generated
+ * @ordered
+ */
+ protected EList<DSL_CEP_STATEMENT> cep;
+
+ /**
+ * The cached value of the '{@link #getOn() <em>On</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getOn()
+ * @generated
+ * @ordered
+ */
+ protected DSL_On on;
+
+ /**
+ * The cached value of the '{@link #getEca() <em>Eca</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getEca()
+ * @generated
+ * @ordered
+ */
+ protected DSL_ECA_STATEMENT eca;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected DSL_SENSINACTImpl()
+ {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EClass eStaticClass()
+ {
+ return SensinactPackage.Literals.DSL_SENSINACT;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EList<DSL_Resource> getResources()
+ {
+ if (resources == null)
+ {
+ resources = new EObjectContainmentEList<DSL_Resource>(DSL_Resource.class, this, SensinactPackage.DSL_SENSINACT__RESOURCES);
+ }
+ return resources;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EList<DSL_CEP_STATEMENT> getCep()
+ {
+ if (cep == null)
+ {
+ cep = new EObjectContainmentEList<DSL_CEP_STATEMENT>(DSL_CEP_STATEMENT.class, this, SensinactPackage.DSL_SENSINACT__CEP);
+ }
+ return cep;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_On getOn()
+ {
+ return on;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public NotificationChain basicSetOn(DSL_On newOn, NotificationChain msgs)
+ {
+ DSL_On oldOn = on;
+ on = newOn;
+ if (eNotificationRequired())
+ {
+ ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_SENSINACT__ON, oldOn, newOn);
+ if (msgs == null) msgs = notification; else msgs.add(notification);
+ }
+ return msgs;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setOn(DSL_On newOn)
+ {
+ if (newOn != on)
+ {
+ NotificationChain msgs = null;
+ if (on != null)
+ msgs = ((InternalEObject)on).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_SENSINACT__ON, null, msgs);
+ if (newOn != null)
+ msgs = ((InternalEObject)newOn).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_SENSINACT__ON, null, msgs);
+ msgs = basicSetOn(newOn, msgs);
+ if (msgs != null) msgs.dispatch();
+ }
+ else if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_SENSINACT__ON, newOn, newOn));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_ECA_STATEMENT getEca()
+ {
+ return eca;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public NotificationChain basicSetEca(DSL_ECA_STATEMENT newEca, NotificationChain msgs)
+ {
+ DSL_ECA_STATEMENT oldEca = eca;
+ eca = newEca;
+ if (eNotificationRequired())
+ {
+ ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_SENSINACT__ECA, oldEca, newEca);
+ if (msgs == null) msgs = notification; else msgs.add(notification);
+ }
+ return msgs;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setEca(DSL_ECA_STATEMENT newEca)
+ {
+ if (newEca != eca)
+ {
+ NotificationChain msgs = null;
+ if (eca != null)
+ msgs = ((InternalEObject)eca).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_SENSINACT__ECA, null, msgs);
+ if (newEca != null)
+ msgs = ((InternalEObject)newEca).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.DSL_SENSINACT__ECA, null, msgs);
+ msgs = basicSetEca(newEca, msgs);
+ if (msgs != null) msgs.dispatch();
+ }
+ else if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.DSL_SENSINACT__ECA, newEca, newEca));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_SENSINACT__RESOURCES:
+ return ((InternalEList<?>)getResources()).basicRemove(otherEnd, msgs);
+ case SensinactPackage.DSL_SENSINACT__CEP:
+ return ((InternalEList<?>)getCep()).basicRemove(otherEnd, msgs);
+ case SensinactPackage.DSL_SENSINACT__ON:
+ return basicSetOn(null, msgs);
+ case SensinactPackage.DSL_SENSINACT__ECA:
+ return basicSetEca(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 SensinactPackage.DSL_SENSINACT__RESOURCES:
+ return getResources();
+ case SensinactPackage.DSL_SENSINACT__CEP:
+ return getCep();
+ case SensinactPackage.DSL_SENSINACT__ON:
+ return getOn();
+ case SensinactPackage.DSL_SENSINACT__ECA:
+ return getEca();
+ }
+ 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 SensinactPackage.DSL_SENSINACT__RESOURCES:
+ getResources().clear();
+ getResources().addAll((Collection<? extends DSL_Resource>)newValue);
+ return;
+ case SensinactPackage.DSL_SENSINACT__CEP:
+ getCep().clear();
+ getCep().addAll((Collection<? extends DSL_CEP_STATEMENT>)newValue);
+ return;
+ case SensinactPackage.DSL_SENSINACT__ON:
+ setOn((DSL_On)newValue);
+ return;
+ case SensinactPackage.DSL_SENSINACT__ECA:
+ setEca((DSL_ECA_STATEMENT)newValue);
+ return;
+ }
+ super.eSet(featureID, newValue);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eUnset(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_SENSINACT__RESOURCES:
+ getResources().clear();
+ return;
+ case SensinactPackage.DSL_SENSINACT__CEP:
+ getCep().clear();
+ return;
+ case SensinactPackage.DSL_SENSINACT__ON:
+ setOn((DSL_On)null);
+ return;
+ case SensinactPackage.DSL_SENSINACT__ECA:
+ setEca((DSL_ECA_STATEMENT)null);
+ return;
+ }
+ super.eUnset(featureID);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public boolean eIsSet(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.DSL_SENSINACT__RESOURCES:
+ return resources != null && !resources.isEmpty();
+ case SensinactPackage.DSL_SENSINACT__CEP:
+ return cep != null && !cep.isEmpty();
+ case SensinactPackage.DSL_SENSINACT__ON:
+ return on != null;
+ case SensinactPackage.DSL_SENSINACT__ECA:
+ return eca != null;
+ }
+ return super.eIsSet(featureID);
+ }
+
+} //DSL_SENSINACTImpl
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/SensinactFactoryImpl.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/SensinactFactoryImpl.java
new file mode 100644
index 0000000..49ca89f
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/SensinactFactoryImpl.java
@@ -0,0 +1,633 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact.impl;
+
+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;
+
+import org.eclipse.sensinact.studio.language.sensinact.*;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model <b>Factory</b>.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class SensinactFactoryImpl extends EFactoryImpl implements SensinactFactory
+{
+ /**
+ * Creates the default factory implementation.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public static SensinactFactory init()
+ {
+ try
+ {
+ SensinactFactory theSensinactFactory = (SensinactFactory)EPackage.Registry.INSTANCE.getEFactory(SensinactPackage.eNS_URI);
+ if (theSensinactFactory != null)
+ {
+ return theSensinactFactory;
+ }
+ }
+ catch (Exception exception)
+ {
+ EcorePlugin.INSTANCE.log(exception);
+ }
+ return new SensinactFactoryImpl();
+ }
+
+ /**
+ * Creates an instance of the factory.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public SensinactFactoryImpl()
+ {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public EObject create(EClass eClass)
+ {
+ switch (eClass.getClassifierID())
+ {
+ case SensinactPackage.SENSINACT: return createSensinact();
+ case SensinactPackage.DSL_SENSINACT: return createDSL_SENSINACT();
+ case SensinactPackage.DSL_RESOURCE: return createDSL_Resource();
+ case SensinactPackage.DSL_ON: return createDSL_On();
+ case SensinactPackage.DSL_ECA_STATEMENT: return createDSL_ECA_STATEMENT();
+ case SensinactPackage.DSL_IF_DO: return createDSL_IfDo();
+ case SensinactPackage.DSL_ELSE_IF_DO: return createDSL_ElseIfDo();
+ case SensinactPackage.DSL_ELSE_DO: return createDSL_ElseDo();
+ case SensinactPackage.DSL_REF: return createDSL_REF();
+ case SensinactPackage.DSL_REF_CONDITION: return createDSL_REF_CONDITION();
+ case SensinactPackage.DSL_CEP_STATEMENT: return createDSL_CEP_STATEMENT();
+ case SensinactPackage.DSL_CEP_AFTER: return createDSL_CEP_AFTER();
+ case SensinactPackage.DSL_CEP_BEFORE: return createDSL_CEP_BEFORE();
+ case SensinactPackage.DSL_CEP_COINCIDE: return createDSL_CEP_COINCIDE();
+ case SensinactPackage.DSL_CEP_MIN: return createDSL_CEP_MIN();
+ case SensinactPackage.DSL_CEP_MAX: return createDSL_CEP_MAX();
+ case SensinactPackage.DSL_CEP_AVG: return createDSL_CEP_AVG();
+ case SensinactPackage.DSL_CEP_SUM: return createDSL_CEP_SUM();
+ case SensinactPackage.DSL_CEP_COUNT: return createDSL_CEP_COUNT();
+ case SensinactPackage.DSL_CEP_DURATION: return createDSL_CEP_DURATION();
+ case SensinactPackage.DSL_CEP_DURATION_MIN: return createDSL_CEP_DURATION_MIN();
+ case SensinactPackage.DSL_CEP_DURATION_SEC: return createDSL_CEP_DURATION_SEC();
+ case SensinactPackage.DSL_LIST_ACTIONS: return createDSL_ListActions();
+ case SensinactPackage.DSL_RESOURCE_ACTION: return createDSL_ResourceAction();
+ case SensinactPackage.DSL_LIST_PARAM: return createDSL_ListParam();
+ case SensinactPackage.DSL_EXPRESSION: return createDSL_Expression();
+ case SensinactPackage.DSL_EXPRESSION_OR: return createDSL_Expression_Or();
+ case SensinactPackage.DSL_EXPRESSION_AND: return createDSL_Expression_And();
+ case SensinactPackage.DSL_EXPRESSION_DIFF: return createDSL_Expression_Diff();
+ case SensinactPackage.DSL_EXPRESSION_EQUAL: return createDSL_Expression_Equal();
+ case SensinactPackage.DSL_EXPRESSION_LARGER: return createDSL_Expression_Larger();
+ case SensinactPackage.DSL_EXPRESSION_LARGER_EQUAL: return createDSL_Expression_Larger_Equal();
+ case SensinactPackage.DSL_EXPRESSION_SMALLER: return createDSL_Expression_Smaller();
+ case SensinactPackage.DSL_EXPRESSION_SMALLER_EQUAL: return createDSL_Expression_Smaller_Equal();
+ case SensinactPackage.DSL_EXPRESSION_PLUS: return createDSL_Expression_Plus();
+ case SensinactPackage.DSL_EXPRESSION_MINUS: return createDSL_Expression_Minus();
+ case SensinactPackage.DSL_EXPRESSION_MULTIPLICATION: return createDSL_Expression_Multiplication();
+ case SensinactPackage.DSL_EXPRESSION_DIVISION: return createDSL_Expression_Division();
+ case SensinactPackage.DSL_EXPRESSION_MODULO: return createDSL_Expression_Modulo();
+ case SensinactPackage.DSL_OBJECT_NUMBER: return createDSL_Object_Number();
+ case SensinactPackage.DSL_OBJECT_STRING: return createDSL_Object_String();
+ case SensinactPackage.DSL_OBJECT_BOOLEAN: return createDSL_Object_Boolean();
+ case SensinactPackage.DSL_OBJECT_REF: return createDSL_Object_Ref();
+ case SensinactPackage.DSL_EXPRESSION_NEGATE: return createDSL_Expression_Negate();
+ default:
+ throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier");
+ }
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public Sensinact createSensinact()
+ {
+ SensinactImpl sensinact = new SensinactImpl();
+ return sensinact;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_SENSINACT createDSL_SENSINACT()
+ {
+ DSL_SENSINACTImpl dsL_SENSINACT = new DSL_SENSINACTImpl();
+ return dsL_SENSINACT;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_Resource createDSL_Resource()
+ {
+ DSL_ResourceImpl dsL_Resource = new DSL_ResourceImpl();
+ return dsL_Resource;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_On createDSL_On()
+ {
+ DSL_OnImpl dsL_On = new DSL_OnImpl();
+ return dsL_On;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_ECA_STATEMENT createDSL_ECA_STATEMENT()
+ {
+ DSL_ECA_STATEMENTImpl dsL_ECA_STATEMENT = new DSL_ECA_STATEMENTImpl();
+ return dsL_ECA_STATEMENT;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_IfDo createDSL_IfDo()
+ {
+ DSL_IfDoImpl dsL_IfDo = new DSL_IfDoImpl();
+ return dsL_IfDo;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_ElseIfDo createDSL_ElseIfDo()
+ {
+ DSL_ElseIfDoImpl dsL_ElseIfDo = new DSL_ElseIfDoImpl();
+ return dsL_ElseIfDo;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_ElseDo createDSL_ElseDo()
+ {
+ DSL_ElseDoImpl dsL_ElseDo = new DSL_ElseDoImpl();
+ return dsL_ElseDo;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_REF createDSL_REF()
+ {
+ DSL_REFImpl dsL_REF = new DSL_REFImpl();
+ return dsL_REF;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_REF_CONDITION createDSL_REF_CONDITION()
+ {
+ DSL_REF_CONDITIONImpl dsL_REF_CONDITION = new DSL_REF_CONDITIONImpl();
+ return dsL_REF_CONDITION;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_CEP_STATEMENT createDSL_CEP_STATEMENT()
+ {
+ DSL_CEP_STATEMENTImpl dsL_CEP_STATEMENT = new DSL_CEP_STATEMENTImpl();
+ return dsL_CEP_STATEMENT;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_CEP_AFTER createDSL_CEP_AFTER()
+ {
+ DSL_CEP_AFTERImpl dsL_CEP_AFTER = new DSL_CEP_AFTERImpl();
+ return dsL_CEP_AFTER;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_CEP_BEFORE createDSL_CEP_BEFORE()
+ {
+ DSL_CEP_BEFOREImpl dsL_CEP_BEFORE = new DSL_CEP_BEFOREImpl();
+ return dsL_CEP_BEFORE;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_CEP_COINCIDE createDSL_CEP_COINCIDE()
+ {
+ DSL_CEP_COINCIDEImpl dsL_CEP_COINCIDE = new DSL_CEP_COINCIDEImpl();
+ return dsL_CEP_COINCIDE;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_CEP_MIN createDSL_CEP_MIN()
+ {
+ DSL_CEP_MINImpl dsL_CEP_MIN = new DSL_CEP_MINImpl();
+ return dsL_CEP_MIN;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_CEP_MAX createDSL_CEP_MAX()
+ {
+ DSL_CEP_MAXImpl dsL_CEP_MAX = new DSL_CEP_MAXImpl();
+ return dsL_CEP_MAX;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_CEP_AVG createDSL_CEP_AVG()
+ {
+ DSL_CEP_AVGImpl dsL_CEP_AVG = new DSL_CEP_AVGImpl();
+ return dsL_CEP_AVG;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_CEP_SUM createDSL_CEP_SUM()
+ {
+ DSL_CEP_SUMImpl dsL_CEP_SUM = new DSL_CEP_SUMImpl();
+ return dsL_CEP_SUM;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_CEP_COUNT createDSL_CEP_COUNT()
+ {
+ DSL_CEP_COUNTImpl dsL_CEP_COUNT = new DSL_CEP_COUNTImpl();
+ return dsL_CEP_COUNT;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_CEP_DURATION createDSL_CEP_DURATION()
+ {
+ DSL_CEP_DURATIONImpl dsL_CEP_DURATION = new DSL_CEP_DURATIONImpl();
+ return dsL_CEP_DURATION;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_CEP_DURATION_MIN createDSL_CEP_DURATION_MIN()
+ {
+ DSL_CEP_DURATION_MINImpl dsL_CEP_DURATION_MIN = new DSL_CEP_DURATION_MINImpl();
+ return dsL_CEP_DURATION_MIN;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_CEP_DURATION_SEC createDSL_CEP_DURATION_SEC()
+ {
+ DSL_CEP_DURATION_SECImpl dsL_CEP_DURATION_SEC = new DSL_CEP_DURATION_SECImpl();
+ return dsL_CEP_DURATION_SEC;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_ListActions createDSL_ListActions()
+ {
+ DSL_ListActionsImpl dsL_ListActions = new DSL_ListActionsImpl();
+ return dsL_ListActions;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_ResourceAction createDSL_ResourceAction()
+ {
+ DSL_ResourceActionImpl dsL_ResourceAction = new DSL_ResourceActionImpl();
+ return dsL_ResourceAction;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_ListParam createDSL_ListParam()
+ {
+ DSL_ListParamImpl dsL_ListParam = new DSL_ListParamImpl();
+ return dsL_ListParam;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_Expression createDSL_Expression()
+ {
+ DSL_ExpressionImpl dsL_Expression = new DSL_ExpressionImpl();
+ return dsL_Expression;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_Expression_Or createDSL_Expression_Or()
+ {
+ DSL_Expression_OrImpl dsL_Expression_Or = new DSL_Expression_OrImpl();
+ return dsL_Expression_Or;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_Expression_And createDSL_Expression_And()
+ {
+ DSL_Expression_AndImpl dsL_Expression_And = new DSL_Expression_AndImpl();
+ return dsL_Expression_And;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_Expression_Diff createDSL_Expression_Diff()
+ {
+ DSL_Expression_DiffImpl dsL_Expression_Diff = new DSL_Expression_DiffImpl();
+ return dsL_Expression_Diff;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_Expression_Equal createDSL_Expression_Equal()
+ {
+ DSL_Expression_EqualImpl dsL_Expression_Equal = new DSL_Expression_EqualImpl();
+ return dsL_Expression_Equal;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_Expression_Larger createDSL_Expression_Larger()
+ {
+ DSL_Expression_LargerImpl dsL_Expression_Larger = new DSL_Expression_LargerImpl();
+ return dsL_Expression_Larger;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_Expression_Larger_Equal createDSL_Expression_Larger_Equal()
+ {
+ DSL_Expression_Larger_EqualImpl dsL_Expression_Larger_Equal = new DSL_Expression_Larger_EqualImpl();
+ return dsL_Expression_Larger_Equal;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_Expression_Smaller createDSL_Expression_Smaller()
+ {
+ DSL_Expression_SmallerImpl dsL_Expression_Smaller = new DSL_Expression_SmallerImpl();
+ return dsL_Expression_Smaller;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_Expression_Smaller_Equal createDSL_Expression_Smaller_Equal()
+ {
+ DSL_Expression_Smaller_EqualImpl dsL_Expression_Smaller_Equal = new DSL_Expression_Smaller_EqualImpl();
+ return dsL_Expression_Smaller_Equal;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_Expression_Plus createDSL_Expression_Plus()
+ {
+ DSL_Expression_PlusImpl dsL_Expression_Plus = new DSL_Expression_PlusImpl();
+ return dsL_Expression_Plus;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_Expression_Minus createDSL_Expression_Minus()
+ {
+ DSL_Expression_MinusImpl dsL_Expression_Minus = new DSL_Expression_MinusImpl();
+ return dsL_Expression_Minus;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_Expression_Multiplication createDSL_Expression_Multiplication()
+ {
+ DSL_Expression_MultiplicationImpl dsL_Expression_Multiplication = new DSL_Expression_MultiplicationImpl();
+ return dsL_Expression_Multiplication;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_Expression_Division createDSL_Expression_Division()
+ {
+ DSL_Expression_DivisionImpl dsL_Expression_Division = new DSL_Expression_DivisionImpl();
+ return dsL_Expression_Division;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_Expression_Modulo createDSL_Expression_Modulo()
+ {
+ DSL_Expression_ModuloImpl dsL_Expression_Modulo = new DSL_Expression_ModuloImpl();
+ return dsL_Expression_Modulo;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_Object_Number createDSL_Object_Number()
+ {
+ DSL_Object_NumberImpl dsL_Object_Number = new DSL_Object_NumberImpl();
+ return dsL_Object_Number;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_Object_String createDSL_Object_String()
+ {
+ DSL_Object_StringImpl dsL_Object_String = new DSL_Object_StringImpl();
+ return dsL_Object_String;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_Object_Boolean createDSL_Object_Boolean()
+ {
+ DSL_Object_BooleanImpl dsL_Object_Boolean = new DSL_Object_BooleanImpl();
+ return dsL_Object_Boolean;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_Object_Ref createDSL_Object_Ref()
+ {
+ DSL_Object_RefImpl dsL_Object_Ref = new DSL_Object_RefImpl();
+ return dsL_Object_Ref;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_Expression_Negate createDSL_Expression_Negate()
+ {
+ DSL_Expression_NegateImpl dsL_Expression_Negate = new DSL_Expression_NegateImpl();
+ return dsL_Expression_Negate;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public SensinactPackage getSensinactPackage()
+ {
+ return (SensinactPackage)getEPackage();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @deprecated
+ * @generated
+ */
+ @Deprecated
+ public static SensinactPackage getPackage()
+ {
+ return SensinactPackage.eINSTANCE;
+ }
+
+} //SensinactFactoryImpl
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/SensinactImpl.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/SensinactImpl.java
new file mode 100644
index 0000000..e9a7ffd
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/SensinactImpl.java
@@ -0,0 +1,205 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact.impl;
+
+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;
+
+import org.eclipse.sensinact.studio.language.sensinact.DSL_SENSINACT;
+import org.eclipse.sensinact.studio.language.sensinact.Sensinact;
+import org.eclipse.sensinact.studio.language.sensinact.SensinactPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Sensinact</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.sensinact.studio.language.sensinact.impl.SensinactImpl#getEca <em>Eca</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class SensinactImpl extends MinimalEObjectImpl.Container implements Sensinact
+{
+ /**
+ * The cached value of the '{@link #getEca() <em>Eca</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getEca()
+ * @generated
+ * @ordered
+ */
+ protected DSL_SENSINACT eca;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected SensinactImpl()
+ {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EClass eStaticClass()
+ {
+ return SensinactPackage.Literals.SENSINACT;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public DSL_SENSINACT getEca()
+ {
+ return eca;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public NotificationChain basicSetEca(DSL_SENSINACT newEca, NotificationChain msgs)
+ {
+ DSL_SENSINACT oldEca = eca;
+ eca = newEca;
+ if (eNotificationRequired())
+ {
+ ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, SensinactPackage.SENSINACT__ECA, oldEca, newEca);
+ if (msgs == null) msgs = notification; else msgs.add(notification);
+ }
+ return msgs;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public void setEca(DSL_SENSINACT newEca)
+ {
+ if (newEca != eca)
+ {
+ NotificationChain msgs = null;
+ if (eca != null)
+ msgs = ((InternalEObject)eca).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.SENSINACT__ECA, null, msgs);
+ if (newEca != null)
+ msgs = ((InternalEObject)newEca).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - SensinactPackage.SENSINACT__ECA, null, msgs);
+ msgs = basicSetEca(newEca, msgs);
+ if (msgs != null) msgs.dispatch();
+ }
+ else if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, SensinactPackage.SENSINACT__ECA, newEca, newEca));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.SENSINACT__ECA:
+ return basicSetEca(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 SensinactPackage.SENSINACT__ECA:
+ return getEca();
+ }
+ return super.eGet(featureID, resolve, coreType);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eSet(int featureID, Object newValue)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.SENSINACT__ECA:
+ setEca((DSL_SENSINACT)newValue);
+ return;
+ }
+ super.eSet(featureID, newValue);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eUnset(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.SENSINACT__ECA:
+ setEca((DSL_SENSINACT)null);
+ return;
+ }
+ super.eUnset(featureID);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public boolean eIsSet(int featureID)
+ {
+ switch (featureID)
+ {
+ case SensinactPackage.SENSINACT__ECA:
+ return eca != null;
+ }
+ return super.eIsSet(featureID);
+ }
+
+} //SensinactImpl
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/SensinactPackageImpl.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/SensinactPackageImpl.java
new file mode 100644
index 0000000..115ca65
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/impl/SensinactPackageImpl.java
@@ -0,0 +1,2119 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact.impl;
+
+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.sensinact.studio.language.sensinact.DSL_ElseDo;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_ElseIfDo;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Expression;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_And;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Diff;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Division;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Equal;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Larger;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Larger_Equal;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Minus;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Modulo;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Multiplication;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Negate;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Or;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Plus;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Smaller;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Smaller_Equal;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_IfDo;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_ListActions;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_ListParam;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Object_Boolean;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Object_Number;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Object_Ref;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Object_String;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_On;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Resource;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_ResourceAction;
+import org.eclipse.sensinact.studio.language.sensinact.Sensinact;
+import org.eclipse.sensinact.studio.language.sensinact.SensinactFactory;
+import org.eclipse.sensinact.studio.language.sensinact.SensinactPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model <b>Package</b>.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class SensinactPackageImpl extends EPackageImpl implements SensinactPackage
+{
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ private EClass sensinactEClass = null;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ private EClass dsL_SENSINACTEClass = null;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ private EClass dsL_ResourceEClass = null;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ private EClass dsL_OnEClass = null;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ private EClass dsL_ECA_STATEMENTEClass = null;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ private EClass dsL_IfDoEClass = null;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ private EClass dsL_ElseIfDoEClass = null;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ private EClass dsL_ElseDoEClass = null;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ private EClass dsL_REFEClass = null;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ private EClass dsL_REF_CONDITIONEClass = null;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ private EClass dsL_CEP_STATEMENTEClass = null;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ private EClass dsL_CEP_AFTEREClass = null;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ private EClass dsL_CEP_BEFOREEClass = null;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ private EClass dsL_CEP_COINCIDEEClass = null;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ private EClass dsL_CEP_MINEClass = null;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ private EClass dsL_CEP_MAXEClass = null;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ private EClass dsL_CEP_AVGEClass = null;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ private EClass dsL_CEP_SUMEClass = null;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ private EClass dsL_CEP_COUNTEClass = null;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ private EClass dsL_CEP_DURATIONEClass = null;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ private EClass dsL_CEP_DURATION_MINEClass = null;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ private EClass dsL_CEP_DURATION_SECEClass = null;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ private EClass dsL_ListActionsEClass = null;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ private EClass dsL_ResourceActionEClass = null;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ private EClass dsL_ListParamEClass = null;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ private EClass dsL_ExpressionEClass = null;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ private EClass dsL_Expression_OrEClass = null;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ private EClass dsL_Expression_AndEClass = null;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ private EClass dsL_Expression_DiffEClass = null;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ private EClass dsL_Expression_EqualEClass = null;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ private EClass dsL_Expression_LargerEClass = null;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ private EClass dsL_Expression_Larger_EqualEClass = null;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ private EClass dsL_Expression_SmallerEClass = null;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ private EClass dsL_Expression_Smaller_EqualEClass = null;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ private EClass dsL_Expression_PlusEClass = null;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ private EClass dsL_Expression_MinusEClass = null;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ private EClass dsL_Expression_MultiplicationEClass = null;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ private EClass dsL_Expression_DivisionEClass = null;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ private EClass dsL_Expression_ModuloEClass = null;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ private EClass dsL_Object_NumberEClass = null;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ private EClass dsL_Object_StringEClass = null;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ private EClass dsL_Object_BooleanEClass = null;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ private EClass dsL_Object_RefEClass = null;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ private EClass dsL_Expression_NegateEClass = 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 org.eclipse.sensinact.studio.language.sensinact.SensinactPackage#eNS_URI
+ * @see #init()
+ * @generated
+ */
+ private SensinactPackageImpl()
+ {
+ super(eNS_URI, SensinactFactory.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 SensinactPackage#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 SensinactPackage init()
+ {
+ if (isInited) return (SensinactPackage)EPackage.Registry.INSTANCE.getEPackage(SensinactPackage.eNS_URI);
+
+ // Obtain or create and register package
+ SensinactPackageImpl theSensinactPackage = (SensinactPackageImpl)(EPackage.Registry.INSTANCE.get(eNS_URI) instanceof SensinactPackageImpl ? EPackage.Registry.INSTANCE.get(eNS_URI) : new SensinactPackageImpl());
+
+ isInited = true;
+
+ // Create package meta-data objects
+ theSensinactPackage.createPackageContents();
+
+ // Initialize created meta-data
+ theSensinactPackage.initializePackageContents();
+
+ // Mark meta-data to indicate it can't be changed
+ theSensinactPackage.freeze();
+
+
+ // Update the registry and return the package
+ EPackage.Registry.INSTANCE.put(SensinactPackage.eNS_URI, theSensinactPackage);
+ return theSensinactPackage;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EClass getSensinact()
+ {
+ return sensinactEClass;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getSensinact_Eca()
+ {
+ return (EReference)sensinactEClass.getEStructuralFeatures().get(0);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EClass getDSL_SENSINACT()
+ {
+ return dsL_SENSINACTEClass;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getDSL_SENSINACT_Resources()
+ {
+ return (EReference)dsL_SENSINACTEClass.getEStructuralFeatures().get(0);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getDSL_SENSINACT_Cep()
+ {
+ return (EReference)dsL_SENSINACTEClass.getEStructuralFeatures().get(1);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getDSL_SENSINACT_On()
+ {
+ return (EReference)dsL_SENSINACTEClass.getEStructuralFeatures().get(2);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getDSL_SENSINACT_Eca()
+ {
+ return (EReference)dsL_SENSINACTEClass.getEStructuralFeatures().get(3);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EClass getDSL_Resource()
+ {
+ return dsL_ResourceEClass;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EAttribute getDSL_Resource_GatewayID()
+ {
+ return (EAttribute)dsL_ResourceEClass.getEStructuralFeatures().get(0);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EAttribute getDSL_Resource_DeviceID()
+ {
+ return (EAttribute)dsL_ResourceEClass.getEStructuralFeatures().get(1);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EAttribute getDSL_Resource_ServiceID()
+ {
+ return (EAttribute)dsL_ResourceEClass.getEStructuralFeatures().get(2);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EAttribute getDSL_Resource_ResourceID()
+ {
+ return (EAttribute)dsL_ResourceEClass.getEStructuralFeatures().get(3);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EClass getDSL_On()
+ {
+ return dsL_OnEClass;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getDSL_On_Triggers()
+ {
+ return (EReference)dsL_OnEClass.getEStructuralFeatures().get(0);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EClass getDSL_ECA_STATEMENT()
+ {
+ return dsL_ECA_STATEMENTEClass;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getDSL_ECA_STATEMENT_Ifdo()
+ {
+ return (EReference)dsL_ECA_STATEMENTEClass.getEStructuralFeatures().get(0);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getDSL_ECA_STATEMENT_ElseIfdo()
+ {
+ return (EReference)dsL_ECA_STATEMENTEClass.getEStructuralFeatures().get(1);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getDSL_ECA_STATEMENT_Elsedo()
+ {
+ return (EReference)dsL_ECA_STATEMENTEClass.getEStructuralFeatures().get(2);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EClass getDSL_IfDo()
+ {
+ return dsL_IfDoEClass;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getDSL_IfDo_Condition()
+ {
+ return (EReference)dsL_IfDoEClass.getEStructuralFeatures().get(0);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getDSL_IfDo_Actions()
+ {
+ return (EReference)dsL_IfDoEClass.getEStructuralFeatures().get(1);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EClass getDSL_ElseIfDo()
+ {
+ return dsL_ElseIfDoEClass;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getDSL_ElseIfDo_Condition()
+ {
+ return (EReference)dsL_ElseIfDoEClass.getEStructuralFeatures().get(0);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getDSL_ElseIfDo_Actions()
+ {
+ return (EReference)dsL_ElseIfDoEClass.getEStructuralFeatures().get(1);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EClass getDSL_ElseDo()
+ {
+ return dsL_ElseDoEClass;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getDSL_ElseDo_Actions()
+ {
+ return (EReference)dsL_ElseDoEClass.getEStructuralFeatures().get(0);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EClass getDSL_REF()
+ {
+ return dsL_REFEClass;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EAttribute getDSL_REF_Name()
+ {
+ return (EAttribute)dsL_REFEClass.getEStructuralFeatures().get(0);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EClass getDSL_REF_CONDITION()
+ {
+ return dsL_REF_CONDITIONEClass;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getDSL_REF_CONDITION_Ref()
+ {
+ return (EReference)dsL_REF_CONDITIONEClass.getEStructuralFeatures().get(0);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EClass getDSL_CEP_STATEMENT()
+ {
+ return dsL_CEP_STATEMENTEClass;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getDSL_CEP_STATEMENT_Operation()
+ {
+ return (EReference)dsL_CEP_STATEMENTEClass.getEStructuralFeatures().get(0);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EClass getDSL_CEP_AFTER()
+ {
+ return dsL_CEP_AFTEREClass;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getDSL_CEP_AFTER_Ref1()
+ {
+ return (EReference)dsL_CEP_AFTEREClass.getEStructuralFeatures().get(0);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getDSL_CEP_AFTER_Ref2()
+ {
+ return (EReference)dsL_CEP_AFTEREClass.getEStructuralFeatures().get(1);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getDSL_CEP_AFTER_Start()
+ {
+ return (EReference)dsL_CEP_AFTEREClass.getEStructuralFeatures().get(2);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getDSL_CEP_AFTER_End()
+ {
+ return (EReference)dsL_CEP_AFTEREClass.getEStructuralFeatures().get(3);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EClass getDSL_CEP_BEFORE()
+ {
+ return dsL_CEP_BEFOREEClass;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getDSL_CEP_BEFORE_Ref1()
+ {
+ return (EReference)dsL_CEP_BEFOREEClass.getEStructuralFeatures().get(0);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getDSL_CEP_BEFORE_Ref2()
+ {
+ return (EReference)dsL_CEP_BEFOREEClass.getEStructuralFeatures().get(1);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getDSL_CEP_BEFORE_Start()
+ {
+ return (EReference)dsL_CEP_BEFOREEClass.getEStructuralFeatures().get(2);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getDSL_CEP_BEFORE_End()
+ {
+ return (EReference)dsL_CEP_BEFOREEClass.getEStructuralFeatures().get(3);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EClass getDSL_CEP_COINCIDE()
+ {
+ return dsL_CEP_COINCIDEEClass;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getDSL_CEP_COINCIDE_Ref1()
+ {
+ return (EReference)dsL_CEP_COINCIDEEClass.getEStructuralFeatures().get(0);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getDSL_CEP_COINCIDE_Ref2()
+ {
+ return (EReference)dsL_CEP_COINCIDEEClass.getEStructuralFeatures().get(1);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getDSL_CEP_COINCIDE_Window()
+ {
+ return (EReference)dsL_CEP_COINCIDEEClass.getEStructuralFeatures().get(2);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EClass getDSL_CEP_MIN()
+ {
+ return dsL_CEP_MINEClass;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getDSL_CEP_MIN_Ref()
+ {
+ return (EReference)dsL_CEP_MINEClass.getEStructuralFeatures().get(0);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getDSL_CEP_MIN_Window()
+ {
+ return (EReference)dsL_CEP_MINEClass.getEStructuralFeatures().get(1);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EClass getDSL_CEP_MAX()
+ {
+ return dsL_CEP_MAXEClass;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getDSL_CEP_MAX_Ref()
+ {
+ return (EReference)dsL_CEP_MAXEClass.getEStructuralFeatures().get(0);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getDSL_CEP_MAX_Window()
+ {
+ return (EReference)dsL_CEP_MAXEClass.getEStructuralFeatures().get(1);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EClass getDSL_CEP_AVG()
+ {
+ return dsL_CEP_AVGEClass;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getDSL_CEP_AVG_Ref()
+ {
+ return (EReference)dsL_CEP_AVGEClass.getEStructuralFeatures().get(0);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getDSL_CEP_AVG_Window()
+ {
+ return (EReference)dsL_CEP_AVGEClass.getEStructuralFeatures().get(1);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EClass getDSL_CEP_SUM()
+ {
+ return dsL_CEP_SUMEClass;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getDSL_CEP_SUM_Ref()
+ {
+ return (EReference)dsL_CEP_SUMEClass.getEStructuralFeatures().get(0);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getDSL_CEP_SUM_Window()
+ {
+ return (EReference)dsL_CEP_SUMEClass.getEStructuralFeatures().get(1);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EClass getDSL_CEP_COUNT()
+ {
+ return dsL_CEP_COUNTEClass;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getDSL_CEP_COUNT_Ref()
+ {
+ return (EReference)dsL_CEP_COUNTEClass.getEStructuralFeatures().get(0);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getDSL_CEP_COUNT_Window()
+ {
+ return (EReference)dsL_CEP_COUNTEClass.getEStructuralFeatures().get(1);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EClass getDSL_CEP_DURATION()
+ {
+ return dsL_CEP_DURATIONEClass;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getDSL_CEP_DURATION_Units()
+ {
+ return (EReference)dsL_CEP_DURATIONEClass.getEStructuralFeatures().get(0);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EClass getDSL_CEP_DURATION_MIN()
+ {
+ return dsL_CEP_DURATION_MINEClass;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EAttribute getDSL_CEP_DURATION_MIN_Min()
+ {
+ return (EAttribute)dsL_CEP_DURATION_MINEClass.getEStructuralFeatures().get(0);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EClass getDSL_CEP_DURATION_SEC()
+ {
+ return dsL_CEP_DURATION_SECEClass;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EAttribute getDSL_CEP_DURATION_SEC_Sec()
+ {
+ return (EAttribute)dsL_CEP_DURATION_SECEClass.getEStructuralFeatures().get(0);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EClass getDSL_ListActions()
+ {
+ return dsL_ListActionsEClass;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getDSL_ListActions_ActionList()
+ {
+ return (EReference)dsL_ListActionsEClass.getEStructuralFeatures().get(0);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EClass getDSL_ResourceAction()
+ {
+ return dsL_ResourceActionEClass;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EAttribute getDSL_ResourceAction_Variable()
+ {
+ return (EAttribute)dsL_ResourceActionEClass.getEStructuralFeatures().get(0);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getDSL_ResourceAction_Ref()
+ {
+ return (EReference)dsL_ResourceActionEClass.getEStructuralFeatures().get(1);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EAttribute getDSL_ResourceAction_Actiontype()
+ {
+ return (EAttribute)dsL_ResourceActionEClass.getEStructuralFeatures().get(2);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getDSL_ResourceAction_ListParam()
+ {
+ return (EReference)dsL_ResourceActionEClass.getEStructuralFeatures().get(3);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EClass getDSL_ListParam()
+ {
+ return dsL_ListParamEClass;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getDSL_ListParam_Param()
+ {
+ return (EReference)dsL_ListParamEClass.getEStructuralFeatures().get(0);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EClass getDSL_Expression()
+ {
+ return dsL_ExpressionEClass;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EClass getDSL_Expression_Or()
+ {
+ return dsL_Expression_OrEClass;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getDSL_Expression_Or_Left()
+ {
+ return (EReference)dsL_Expression_OrEClass.getEStructuralFeatures().get(0);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getDSL_Expression_Or_Right()
+ {
+ return (EReference)dsL_Expression_OrEClass.getEStructuralFeatures().get(1);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EClass getDSL_Expression_And()
+ {
+ return dsL_Expression_AndEClass;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getDSL_Expression_And_Left()
+ {
+ return (EReference)dsL_Expression_AndEClass.getEStructuralFeatures().get(0);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getDSL_Expression_And_Right()
+ {
+ return (EReference)dsL_Expression_AndEClass.getEStructuralFeatures().get(1);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EClass getDSL_Expression_Diff()
+ {
+ return dsL_Expression_DiffEClass;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getDSL_Expression_Diff_Left()
+ {
+ return (EReference)dsL_Expression_DiffEClass.getEStructuralFeatures().get(0);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getDSL_Expression_Diff_Right()
+ {
+ return (EReference)dsL_Expression_DiffEClass.getEStructuralFeatures().get(1);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EClass getDSL_Expression_Equal()
+ {
+ return dsL_Expression_EqualEClass;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getDSL_Expression_Equal_Left()
+ {
+ return (EReference)dsL_Expression_EqualEClass.getEStructuralFeatures().get(0);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getDSL_Expression_Equal_Right()
+ {
+ return (EReference)dsL_Expression_EqualEClass.getEStructuralFeatures().get(1);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EClass getDSL_Expression_Larger()
+ {
+ return dsL_Expression_LargerEClass;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getDSL_Expression_Larger_Left()
+ {
+ return (EReference)dsL_Expression_LargerEClass.getEStructuralFeatures().get(0);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getDSL_Expression_Larger_Right()
+ {
+ return (EReference)dsL_Expression_LargerEClass.getEStructuralFeatures().get(1);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EClass getDSL_Expression_Larger_Equal()
+ {
+ return dsL_Expression_Larger_EqualEClass;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getDSL_Expression_Larger_Equal_Left()
+ {
+ return (EReference)dsL_Expression_Larger_EqualEClass.getEStructuralFeatures().get(0);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getDSL_Expression_Larger_Equal_Right()
+ {
+ return (EReference)dsL_Expression_Larger_EqualEClass.getEStructuralFeatures().get(1);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EClass getDSL_Expression_Smaller()
+ {
+ return dsL_Expression_SmallerEClass;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getDSL_Expression_Smaller_Left()
+ {
+ return (EReference)dsL_Expression_SmallerEClass.getEStructuralFeatures().get(0);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getDSL_Expression_Smaller_Right()
+ {
+ return (EReference)dsL_Expression_SmallerEClass.getEStructuralFeatures().get(1);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EClass getDSL_Expression_Smaller_Equal()
+ {
+ return dsL_Expression_Smaller_EqualEClass;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getDSL_Expression_Smaller_Equal_Left()
+ {
+ return (EReference)dsL_Expression_Smaller_EqualEClass.getEStructuralFeatures().get(0);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getDSL_Expression_Smaller_Equal_Right()
+ {
+ return (EReference)dsL_Expression_Smaller_EqualEClass.getEStructuralFeatures().get(1);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EClass getDSL_Expression_Plus()
+ {
+ return dsL_Expression_PlusEClass;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getDSL_Expression_Plus_Left()
+ {
+ return (EReference)dsL_Expression_PlusEClass.getEStructuralFeatures().get(0);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getDSL_Expression_Plus_Right()
+ {
+ return (EReference)dsL_Expression_PlusEClass.getEStructuralFeatures().get(1);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EClass getDSL_Expression_Minus()
+ {
+ return dsL_Expression_MinusEClass;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getDSL_Expression_Minus_Left()
+ {
+ return (EReference)dsL_Expression_MinusEClass.getEStructuralFeatures().get(0);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getDSL_Expression_Minus_Right()
+ {
+ return (EReference)dsL_Expression_MinusEClass.getEStructuralFeatures().get(1);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EClass getDSL_Expression_Multiplication()
+ {
+ return dsL_Expression_MultiplicationEClass;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getDSL_Expression_Multiplication_Left()
+ {
+ return (EReference)dsL_Expression_MultiplicationEClass.getEStructuralFeatures().get(0);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getDSL_Expression_Multiplication_Right()
+ {
+ return (EReference)dsL_Expression_MultiplicationEClass.getEStructuralFeatures().get(1);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EClass getDSL_Expression_Division()
+ {
+ return dsL_Expression_DivisionEClass;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getDSL_Expression_Division_Left()
+ {
+ return (EReference)dsL_Expression_DivisionEClass.getEStructuralFeatures().get(0);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getDSL_Expression_Division_Right()
+ {
+ return (EReference)dsL_Expression_DivisionEClass.getEStructuralFeatures().get(1);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EClass getDSL_Expression_Modulo()
+ {
+ return dsL_Expression_ModuloEClass;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getDSL_Expression_Modulo_Left()
+ {
+ return (EReference)dsL_Expression_ModuloEClass.getEStructuralFeatures().get(0);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getDSL_Expression_Modulo_Right()
+ {
+ return (EReference)dsL_Expression_ModuloEClass.getEStructuralFeatures().get(1);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EClass getDSL_Object_Number()
+ {
+ return dsL_Object_NumberEClass;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EAttribute getDSL_Object_Number_Value()
+ {
+ return (EAttribute)dsL_Object_NumberEClass.getEStructuralFeatures().get(0);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EClass getDSL_Object_String()
+ {
+ return dsL_Object_StringEClass;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EAttribute getDSL_Object_String_Value()
+ {
+ return (EAttribute)dsL_Object_StringEClass.getEStructuralFeatures().get(0);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EClass getDSL_Object_Boolean()
+ {
+ return dsL_Object_BooleanEClass;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EAttribute getDSL_Object_Boolean_Value()
+ {
+ return (EAttribute)dsL_Object_BooleanEClass.getEStructuralFeatures().get(0);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EClass getDSL_Object_Ref()
+ {
+ return dsL_Object_RefEClass;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getDSL_Object_Ref_Value()
+ {
+ return (EReference)dsL_Object_RefEClass.getEStructuralFeatures().get(0);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EClass getDSL_Expression_Negate()
+ {
+ return dsL_Expression_NegateEClass;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EReference getDSL_Expression_Negate_Exp()
+ {
+ return (EReference)dsL_Expression_NegateEClass.getEStructuralFeatures().get(0);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public SensinactFactory getSensinactFactory()
+ {
+ return (SensinactFactory)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
+ sensinactEClass = createEClass(SENSINACT);
+ createEReference(sensinactEClass, SENSINACT__ECA);
+
+ dsL_SENSINACTEClass = createEClass(DSL_SENSINACT);
+ createEReference(dsL_SENSINACTEClass, DSL_SENSINACT__RESOURCES);
+ createEReference(dsL_SENSINACTEClass, DSL_SENSINACT__CEP);
+ createEReference(dsL_SENSINACTEClass, DSL_SENSINACT__ON);
+ createEReference(dsL_SENSINACTEClass, DSL_SENSINACT__ECA);
+
+ dsL_ResourceEClass = createEClass(DSL_RESOURCE);
+ createEAttribute(dsL_ResourceEClass, DSL_RESOURCE__GATEWAY_ID);
+ createEAttribute(dsL_ResourceEClass, DSL_RESOURCE__DEVICE_ID);
+ createEAttribute(dsL_ResourceEClass, DSL_RESOURCE__SERVICE_ID);
+ createEAttribute(dsL_ResourceEClass, DSL_RESOURCE__RESOURCE_ID);
+
+ dsL_OnEClass = createEClass(DSL_ON);
+ createEReference(dsL_OnEClass, DSL_ON__TRIGGERS);
+
+ dsL_ECA_STATEMENTEClass = createEClass(DSL_ECA_STATEMENT);
+ createEReference(dsL_ECA_STATEMENTEClass, DSL_ECA_STATEMENT__IFDO);
+ createEReference(dsL_ECA_STATEMENTEClass, DSL_ECA_STATEMENT__ELSE_IFDO);
+ createEReference(dsL_ECA_STATEMENTEClass, DSL_ECA_STATEMENT__ELSEDO);
+
+ dsL_IfDoEClass = createEClass(DSL_IF_DO);
+ createEReference(dsL_IfDoEClass, DSL_IF_DO__CONDITION);
+ createEReference(dsL_IfDoEClass, DSL_IF_DO__ACTIONS);
+
+ dsL_ElseIfDoEClass = createEClass(DSL_ELSE_IF_DO);
+ createEReference(dsL_ElseIfDoEClass, DSL_ELSE_IF_DO__CONDITION);
+ createEReference(dsL_ElseIfDoEClass, DSL_ELSE_IF_DO__ACTIONS);
+
+ dsL_ElseDoEClass = createEClass(DSL_ELSE_DO);
+ createEReference(dsL_ElseDoEClass, DSL_ELSE_DO__ACTIONS);
+
+ dsL_REFEClass = createEClass(DSL_REF);
+ createEAttribute(dsL_REFEClass, DSL_REF__NAME);
+
+ dsL_REF_CONDITIONEClass = createEClass(DSL_REF_CONDITION);
+ createEReference(dsL_REF_CONDITIONEClass, DSL_REF_CONDITION__REF);
+
+ dsL_CEP_STATEMENTEClass = createEClass(DSL_CEP_STATEMENT);
+ createEReference(dsL_CEP_STATEMENTEClass, DSL_CEP_STATEMENT__OPERATION);
+
+ dsL_CEP_AFTEREClass = createEClass(DSL_CEP_AFTER);
+ createEReference(dsL_CEP_AFTEREClass, DSL_CEP_AFTER__REF1);
+ createEReference(dsL_CEP_AFTEREClass, DSL_CEP_AFTER__REF2);
+ createEReference(dsL_CEP_AFTEREClass, DSL_CEP_AFTER__START);
+ createEReference(dsL_CEP_AFTEREClass, DSL_CEP_AFTER__END);
+
+ dsL_CEP_BEFOREEClass = createEClass(DSL_CEP_BEFORE);
+ createEReference(dsL_CEP_BEFOREEClass, DSL_CEP_BEFORE__REF1);
+ createEReference(dsL_CEP_BEFOREEClass, DSL_CEP_BEFORE__REF2);
+ createEReference(dsL_CEP_BEFOREEClass, DSL_CEP_BEFORE__START);
+ createEReference(dsL_CEP_BEFOREEClass, DSL_CEP_BEFORE__END);
+
+ dsL_CEP_COINCIDEEClass = createEClass(DSL_CEP_COINCIDE);
+ createEReference(dsL_CEP_COINCIDEEClass, DSL_CEP_COINCIDE__REF1);
+ createEReference(dsL_CEP_COINCIDEEClass, DSL_CEP_COINCIDE__REF2);
+ createEReference(dsL_CEP_COINCIDEEClass, DSL_CEP_COINCIDE__WINDOW);
+
+ dsL_CEP_MINEClass = createEClass(DSL_CEP_MIN);
+ createEReference(dsL_CEP_MINEClass, DSL_CEP_MIN__REF);
+ createEReference(dsL_CEP_MINEClass, DSL_CEP_MIN__WINDOW);
+
+ dsL_CEP_MAXEClass = createEClass(DSL_CEP_MAX);
+ createEReference(dsL_CEP_MAXEClass, DSL_CEP_MAX__REF);
+ createEReference(dsL_CEP_MAXEClass, DSL_CEP_MAX__WINDOW);
+
+ dsL_CEP_AVGEClass = createEClass(DSL_CEP_AVG);
+ createEReference(dsL_CEP_AVGEClass, DSL_CEP_AVG__REF);
+ createEReference(dsL_CEP_AVGEClass, DSL_CEP_AVG__WINDOW);
+
+ dsL_CEP_SUMEClass = createEClass(DSL_CEP_SUM);
+ createEReference(dsL_CEP_SUMEClass, DSL_CEP_SUM__REF);
+ createEReference(dsL_CEP_SUMEClass, DSL_CEP_SUM__WINDOW);
+
+ dsL_CEP_COUNTEClass = createEClass(DSL_CEP_COUNT);
+ createEReference(dsL_CEP_COUNTEClass, DSL_CEP_COUNT__REF);
+ createEReference(dsL_CEP_COUNTEClass, DSL_CEP_COUNT__WINDOW);
+
+ dsL_CEP_DURATIONEClass = createEClass(DSL_CEP_DURATION);
+ createEReference(dsL_CEP_DURATIONEClass, DSL_CEP_DURATION__UNITS);
+
+ dsL_CEP_DURATION_MINEClass = createEClass(DSL_CEP_DURATION_MIN);
+ createEAttribute(dsL_CEP_DURATION_MINEClass, DSL_CEP_DURATION_MIN__MIN);
+
+ dsL_CEP_DURATION_SECEClass = createEClass(DSL_CEP_DURATION_SEC);
+ createEAttribute(dsL_CEP_DURATION_SECEClass, DSL_CEP_DURATION_SEC__SEC);
+
+ dsL_ListActionsEClass = createEClass(DSL_LIST_ACTIONS);
+ createEReference(dsL_ListActionsEClass, DSL_LIST_ACTIONS__ACTION_LIST);
+
+ dsL_ResourceActionEClass = createEClass(DSL_RESOURCE_ACTION);
+ createEAttribute(dsL_ResourceActionEClass, DSL_RESOURCE_ACTION__VARIABLE);
+ createEReference(dsL_ResourceActionEClass, DSL_RESOURCE_ACTION__REF);
+ createEAttribute(dsL_ResourceActionEClass, DSL_RESOURCE_ACTION__ACTIONTYPE);
+ createEReference(dsL_ResourceActionEClass, DSL_RESOURCE_ACTION__LIST_PARAM);
+
+ dsL_ListParamEClass = createEClass(DSL_LIST_PARAM);
+ createEReference(dsL_ListParamEClass, DSL_LIST_PARAM__PARAM);
+
+ dsL_ExpressionEClass = createEClass(DSL_EXPRESSION);
+
+ dsL_Expression_OrEClass = createEClass(DSL_EXPRESSION_OR);
+ createEReference(dsL_Expression_OrEClass, DSL_EXPRESSION_OR__LEFT);
+ createEReference(dsL_Expression_OrEClass, DSL_EXPRESSION_OR__RIGHT);
+
+ dsL_Expression_AndEClass = createEClass(DSL_EXPRESSION_AND);
+ createEReference(dsL_Expression_AndEClass, DSL_EXPRESSION_AND__LEFT);
+ createEReference(dsL_Expression_AndEClass, DSL_EXPRESSION_AND__RIGHT);
+
+ dsL_Expression_DiffEClass = createEClass(DSL_EXPRESSION_DIFF);
+ createEReference(dsL_Expression_DiffEClass, DSL_EXPRESSION_DIFF__LEFT);
+ createEReference(dsL_Expression_DiffEClass, DSL_EXPRESSION_DIFF__RIGHT);
+
+ dsL_Expression_EqualEClass = createEClass(DSL_EXPRESSION_EQUAL);
+ createEReference(dsL_Expression_EqualEClass, DSL_EXPRESSION_EQUAL__LEFT);
+ createEReference(dsL_Expression_EqualEClass, DSL_EXPRESSION_EQUAL__RIGHT);
+
+ dsL_Expression_LargerEClass = createEClass(DSL_EXPRESSION_LARGER);
+ createEReference(dsL_Expression_LargerEClass, DSL_EXPRESSION_LARGER__LEFT);
+ createEReference(dsL_Expression_LargerEClass, DSL_EXPRESSION_LARGER__RIGHT);
+
+ dsL_Expression_Larger_EqualEClass = createEClass(DSL_EXPRESSION_LARGER_EQUAL);
+ createEReference(dsL_Expression_Larger_EqualEClass, DSL_EXPRESSION_LARGER_EQUAL__LEFT);
+ createEReference(dsL_Expression_Larger_EqualEClass, DSL_EXPRESSION_LARGER_EQUAL__RIGHT);
+
+ dsL_Expression_SmallerEClass = createEClass(DSL_EXPRESSION_SMALLER);
+ createEReference(dsL_Expression_SmallerEClass, DSL_EXPRESSION_SMALLER__LEFT);
+ createEReference(dsL_Expression_SmallerEClass, DSL_EXPRESSION_SMALLER__RIGHT);
+
+ dsL_Expression_Smaller_EqualEClass = createEClass(DSL_EXPRESSION_SMALLER_EQUAL);
+ createEReference(dsL_Expression_Smaller_EqualEClass, DSL_EXPRESSION_SMALLER_EQUAL__LEFT);
+ createEReference(dsL_Expression_Smaller_EqualEClass, DSL_EXPRESSION_SMALLER_EQUAL__RIGHT);
+
+ dsL_Expression_PlusEClass = createEClass(DSL_EXPRESSION_PLUS);
+ createEReference(dsL_Expression_PlusEClass, DSL_EXPRESSION_PLUS__LEFT);
+ createEReference(dsL_Expression_PlusEClass, DSL_EXPRESSION_PLUS__RIGHT);
+
+ dsL_Expression_MinusEClass = createEClass(DSL_EXPRESSION_MINUS);
+ createEReference(dsL_Expression_MinusEClass, DSL_EXPRESSION_MINUS__LEFT);
+ createEReference(dsL_Expression_MinusEClass, DSL_EXPRESSION_MINUS__RIGHT);
+
+ dsL_Expression_MultiplicationEClass = createEClass(DSL_EXPRESSION_MULTIPLICATION);
+ createEReference(dsL_Expression_MultiplicationEClass, DSL_EXPRESSION_MULTIPLICATION__LEFT);
+ createEReference(dsL_Expression_MultiplicationEClass, DSL_EXPRESSION_MULTIPLICATION__RIGHT);
+
+ dsL_Expression_DivisionEClass = createEClass(DSL_EXPRESSION_DIVISION);
+ createEReference(dsL_Expression_DivisionEClass, DSL_EXPRESSION_DIVISION__LEFT);
+ createEReference(dsL_Expression_DivisionEClass, DSL_EXPRESSION_DIVISION__RIGHT);
+
+ dsL_Expression_ModuloEClass = createEClass(DSL_EXPRESSION_MODULO);
+ createEReference(dsL_Expression_ModuloEClass, DSL_EXPRESSION_MODULO__LEFT);
+ createEReference(dsL_Expression_ModuloEClass, DSL_EXPRESSION_MODULO__RIGHT);
+
+ dsL_Object_NumberEClass = createEClass(DSL_OBJECT_NUMBER);
+ createEAttribute(dsL_Object_NumberEClass, DSL_OBJECT_NUMBER__VALUE);
+
+ dsL_Object_StringEClass = createEClass(DSL_OBJECT_STRING);
+ createEAttribute(dsL_Object_StringEClass, DSL_OBJECT_STRING__VALUE);
+
+ dsL_Object_BooleanEClass = createEClass(DSL_OBJECT_BOOLEAN);
+ createEAttribute(dsL_Object_BooleanEClass, DSL_OBJECT_BOOLEAN__VALUE);
+
+ dsL_Object_RefEClass = createEClass(DSL_OBJECT_REF);
+ createEReference(dsL_Object_RefEClass, DSL_OBJECT_REF__VALUE);
+
+ dsL_Expression_NegateEClass = createEClass(DSL_EXPRESSION_NEGATE);
+ createEReference(dsL_Expression_NegateEClass, DSL_EXPRESSION_NEGATE__EXP);
+ }
+
+ /**
+ * <!-- 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);
+
+ // Create type parameters
+
+ // Set bounds for type parameters
+
+ // Add supertypes to classes
+ dsL_ResourceEClass.getESuperTypes().add(this.getDSL_REF());
+ dsL_CEP_STATEMENTEClass.getESuperTypes().add(this.getDSL_REF());
+ dsL_Expression_OrEClass.getESuperTypes().add(this.getDSL_Expression());
+ dsL_Expression_AndEClass.getESuperTypes().add(this.getDSL_Expression());
+ dsL_Expression_DiffEClass.getESuperTypes().add(this.getDSL_Expression());
+ dsL_Expression_EqualEClass.getESuperTypes().add(this.getDSL_Expression());
+ dsL_Expression_LargerEClass.getESuperTypes().add(this.getDSL_Expression());
+ dsL_Expression_Larger_EqualEClass.getESuperTypes().add(this.getDSL_Expression());
+ dsL_Expression_SmallerEClass.getESuperTypes().add(this.getDSL_Expression());
+ dsL_Expression_Smaller_EqualEClass.getESuperTypes().add(this.getDSL_Expression());
+ dsL_Expression_PlusEClass.getESuperTypes().add(this.getDSL_Expression());
+ dsL_Expression_MinusEClass.getESuperTypes().add(this.getDSL_Expression());
+ dsL_Expression_MultiplicationEClass.getESuperTypes().add(this.getDSL_Expression());
+ dsL_Expression_DivisionEClass.getESuperTypes().add(this.getDSL_Expression());
+ dsL_Expression_ModuloEClass.getESuperTypes().add(this.getDSL_Expression());
+ dsL_Object_NumberEClass.getESuperTypes().add(this.getDSL_Expression());
+ dsL_Object_StringEClass.getESuperTypes().add(this.getDSL_Expression());
+ dsL_Object_BooleanEClass.getESuperTypes().add(this.getDSL_Expression());
+ dsL_Object_RefEClass.getESuperTypes().add(this.getDSL_Expression());
+ dsL_Expression_NegateEClass.getESuperTypes().add(this.getDSL_Expression());
+
+ // Initialize classes and features; add operations and parameters
+ initEClass(sensinactEClass, Sensinact.class, "Sensinact", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+ initEReference(getSensinact_Eca(), this.getDSL_SENSINACT(), null, "eca", null, 0, 1, Sensinact.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+ initEClass(dsL_SENSINACTEClass, org.eclipse.sensinact.studio.language.sensinact.DSL_SENSINACT.class, "DSL_SENSINACT", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+ initEReference(getDSL_SENSINACT_Resources(), this.getDSL_Resource(), null, "resources", null, 0, -1, org.eclipse.sensinact.studio.language.sensinact.DSL_SENSINACT.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+ initEReference(getDSL_SENSINACT_Cep(), this.getDSL_CEP_STATEMENT(), null, "cep", null, 0, -1, org.eclipse.sensinact.studio.language.sensinact.DSL_SENSINACT.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+ initEReference(getDSL_SENSINACT_On(), this.getDSL_On(), null, "on", null, 0, 1, org.eclipse.sensinact.studio.language.sensinact.DSL_SENSINACT.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+ initEReference(getDSL_SENSINACT_Eca(), this.getDSL_ECA_STATEMENT(), null, "eca", null, 0, 1, org.eclipse.sensinact.studio.language.sensinact.DSL_SENSINACT.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+ initEClass(dsL_ResourceEClass, DSL_Resource.class, "DSL_Resource", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+ initEAttribute(getDSL_Resource_GatewayID(), ecorePackage.getEString(), "gatewayID", null, 0, 1, DSL_Resource.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+ initEAttribute(getDSL_Resource_DeviceID(), ecorePackage.getEString(), "deviceID", null, 0, 1, DSL_Resource.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+ initEAttribute(getDSL_Resource_ServiceID(), ecorePackage.getEString(), "serviceID", null, 0, 1, DSL_Resource.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+ initEAttribute(getDSL_Resource_ResourceID(), ecorePackage.getEString(), "resourceID", null, 0, 1, DSL_Resource.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+ initEClass(dsL_OnEClass, DSL_On.class, "DSL_On", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+ initEReference(getDSL_On_Triggers(), this.getDSL_REF_CONDITION(), null, "triggers", null, 0, -1, DSL_On.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+ initEClass(dsL_ECA_STATEMENTEClass, org.eclipse.sensinact.studio.language.sensinact.DSL_ECA_STATEMENT.class, "DSL_ECA_STATEMENT", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+ initEReference(getDSL_ECA_STATEMENT_Ifdo(), this.getDSL_IfDo(), null, "ifdo", null, 0, 1, org.eclipse.sensinact.studio.language.sensinact.DSL_ECA_STATEMENT.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+ initEReference(getDSL_ECA_STATEMENT_ElseIfdo(), this.getDSL_ElseIfDo(), null, "elseIfdo", null, 0, -1, org.eclipse.sensinact.studio.language.sensinact.DSL_ECA_STATEMENT.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+ initEReference(getDSL_ECA_STATEMENT_Elsedo(), this.getDSL_ElseDo(), null, "elsedo", null, 0, 1, org.eclipse.sensinact.studio.language.sensinact.DSL_ECA_STATEMENT.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+ initEClass(dsL_IfDoEClass, DSL_IfDo.class, "DSL_IfDo", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+ initEReference(getDSL_IfDo_Condition(), this.getDSL_Expression(), null, "condition", null, 0, 1, DSL_IfDo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+ initEReference(getDSL_IfDo_Actions(), this.getDSL_ListActions(), null, "actions", null, 0, 1, DSL_IfDo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+ initEClass(dsL_ElseIfDoEClass, DSL_ElseIfDo.class, "DSL_ElseIfDo", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+ initEReference(getDSL_ElseIfDo_Condition(), this.getDSL_Expression(), null, "condition", null, 0, 1, DSL_ElseIfDo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+ initEReference(getDSL_ElseIfDo_Actions(), this.getDSL_ListActions(), null, "actions", null, 0, 1, DSL_ElseIfDo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+ initEClass(dsL_ElseDoEClass, DSL_ElseDo.class, "DSL_ElseDo", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+ initEReference(getDSL_ElseDo_Actions(), this.getDSL_ListActions(), null, "actions", null, 0, 1, DSL_ElseDo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+ initEClass(dsL_REFEClass, org.eclipse.sensinact.studio.language.sensinact.DSL_REF.class, "DSL_REF", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+ initEAttribute(getDSL_REF_Name(), ecorePackage.getEString(), "name", null, 0, 1, org.eclipse.sensinact.studio.language.sensinact.DSL_REF.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+ initEClass(dsL_REF_CONDITIONEClass, org.eclipse.sensinact.studio.language.sensinact.DSL_REF_CONDITION.class, "DSL_REF_CONDITION", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+ initEReference(getDSL_REF_CONDITION_Ref(), this.getDSL_REF(), null, "ref", null, 0, 1, org.eclipse.sensinact.studio.language.sensinact.DSL_REF_CONDITION.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+ initEClass(dsL_CEP_STATEMENTEClass, org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_STATEMENT.class, "DSL_CEP_STATEMENT", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+ initEReference(getDSL_CEP_STATEMENT_Operation(), ecorePackage.getEObject(), null, "operation", null, 0, 1, org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_STATEMENT.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+ initEClass(dsL_CEP_AFTEREClass, org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_AFTER.class, "DSL_CEP_AFTER", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+ initEReference(getDSL_CEP_AFTER_Ref1(), this.getDSL_REF_CONDITION(), null, "ref1", null, 0, 1, org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_AFTER.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+ initEReference(getDSL_CEP_AFTER_Ref2(), this.getDSL_REF_CONDITION(), null, "ref2", null, 0, 1, org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_AFTER.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+ initEReference(getDSL_CEP_AFTER_Start(), this.getDSL_CEP_DURATION(), null, "start", null, 0, 1, org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_AFTER.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+ initEReference(getDSL_CEP_AFTER_End(), this.getDSL_CEP_DURATION(), null, "end", null, 0, 1, org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_AFTER.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+ initEClass(dsL_CEP_BEFOREEClass, org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_BEFORE.class, "DSL_CEP_BEFORE", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+ initEReference(getDSL_CEP_BEFORE_Ref1(), this.getDSL_REF_CONDITION(), null, "ref1", null, 0, 1, org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_BEFORE.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+ initEReference(getDSL_CEP_BEFORE_Ref2(), this.getDSL_REF_CONDITION(), null, "ref2", null, 0, 1, org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_BEFORE.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+ initEReference(getDSL_CEP_BEFORE_Start(), this.getDSL_CEP_DURATION(), null, "start", null, 0, 1, org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_BEFORE.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+ initEReference(getDSL_CEP_BEFORE_End(), this.getDSL_CEP_DURATION(), null, "end", null, 0, 1, org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_BEFORE.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+ initEClass(dsL_CEP_COINCIDEEClass, org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_COINCIDE.class, "DSL_CEP_COINCIDE", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+ initEReference(getDSL_CEP_COINCIDE_Ref1(), this.getDSL_REF_CONDITION(), null, "ref1", null, 0, 1, org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_COINCIDE.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+ initEReference(getDSL_CEP_COINCIDE_Ref2(), this.getDSL_REF_CONDITION(), null, "ref2", null, 0, 1, org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_COINCIDE.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+ initEReference(getDSL_CEP_COINCIDE_Window(), this.getDSL_CEP_DURATION(), null, "window", null, 0, 1, org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_COINCIDE.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+ initEClass(dsL_CEP_MINEClass, org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_MIN.class, "DSL_CEP_MIN", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+ initEReference(getDSL_CEP_MIN_Ref(), this.getDSL_REF_CONDITION(), null, "ref", null, 0, 1, org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_MIN.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+ initEReference(getDSL_CEP_MIN_Window(), this.getDSL_CEP_DURATION(), null, "window", null, 0, 1, org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_MIN.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+ initEClass(dsL_CEP_MAXEClass, org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_MAX.class, "DSL_CEP_MAX", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+ initEReference(getDSL_CEP_MAX_Ref(), this.getDSL_REF_CONDITION(), null, "ref", null, 0, 1, org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_MAX.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+ initEReference(getDSL_CEP_MAX_Window(), this.getDSL_CEP_DURATION(), null, "window", null, 0, 1, org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_MAX.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+ initEClass(dsL_CEP_AVGEClass, org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_AVG.class, "DSL_CEP_AVG", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+ initEReference(getDSL_CEP_AVG_Ref(), this.getDSL_REF_CONDITION(), null, "ref", null, 0, 1, org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_AVG.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+ initEReference(getDSL_CEP_AVG_Window(), this.getDSL_CEP_DURATION(), null, "window", null, 0, 1, org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_AVG.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+ initEClass(dsL_CEP_SUMEClass, org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_SUM.class, "DSL_CEP_SUM", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+ initEReference(getDSL_CEP_SUM_Ref(), this.getDSL_REF_CONDITION(), null, "ref", null, 0, 1, org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_SUM.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+ initEReference(getDSL_CEP_SUM_Window(), this.getDSL_CEP_DURATION(), null, "window", null, 0, 1, org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_SUM.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+ initEClass(dsL_CEP_COUNTEClass, org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_COUNT.class, "DSL_CEP_COUNT", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+ initEReference(getDSL_CEP_COUNT_Ref(), this.getDSL_REF_CONDITION(), null, "ref", null, 0, 1, org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_COUNT.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+ initEReference(getDSL_CEP_COUNT_Window(), this.getDSL_CEP_DURATION(), null, "window", null, 0, 1, org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_COUNT.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+ initEClass(dsL_CEP_DURATIONEClass, org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_DURATION.class, "DSL_CEP_DURATION", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+ initEReference(getDSL_CEP_DURATION_Units(), ecorePackage.getEObject(), null, "units", null, 0, -1, org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_DURATION.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+ initEClass(dsL_CEP_DURATION_MINEClass, org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_DURATION_MIN.class, "DSL_CEP_DURATION_MIN", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+ initEAttribute(getDSL_CEP_DURATION_MIN_Min(), ecorePackage.getEBigDecimal(), "min", null, 0, 1, org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_DURATION_MIN.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+ initEClass(dsL_CEP_DURATION_SECEClass, org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_DURATION_SEC.class, "DSL_CEP_DURATION_SEC", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+ initEAttribute(getDSL_CEP_DURATION_SEC_Sec(), ecorePackage.getEBigDecimal(), "sec", null, 0, 1, org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_DURATION_SEC.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+ initEClass(dsL_ListActionsEClass, DSL_ListActions.class, "DSL_ListActions", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+ initEReference(getDSL_ListActions_ActionList(), this.getDSL_ResourceAction(), null, "actionList", null, 0, -1, DSL_ListActions.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+ initEClass(dsL_ResourceActionEClass, DSL_ResourceAction.class, "DSL_ResourceAction", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+ initEAttribute(getDSL_ResourceAction_Variable(), ecorePackage.getEString(), "variable", null, 0, 1, DSL_ResourceAction.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+ initEReference(getDSL_ResourceAction_Ref(), this.getDSL_REF(), null, "ref", null, 0, 1, DSL_ResourceAction.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+ initEAttribute(getDSL_ResourceAction_Actiontype(), ecorePackage.getEString(), "actiontype", null, 0, 1, DSL_ResourceAction.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+ initEReference(getDSL_ResourceAction_ListParam(), this.getDSL_ListParam(), null, "listParam", null, 0, 1, DSL_ResourceAction.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+ initEClass(dsL_ListParamEClass, DSL_ListParam.class, "DSL_ListParam", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+ initEReference(getDSL_ListParam_Param(), this.getDSL_Expression(), null, "param", null, 0, -1, DSL_ListParam.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+ initEClass(dsL_ExpressionEClass, DSL_Expression.class, "DSL_Expression", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+ initEClass(dsL_Expression_OrEClass, DSL_Expression_Or.class, "DSL_Expression_Or", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+ initEReference(getDSL_Expression_Or_Left(), this.getDSL_Expression(), null, "left", null, 0, 1, DSL_Expression_Or.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+ initEReference(getDSL_Expression_Or_Right(), this.getDSL_Expression(), null, "right", null, 0, 1, DSL_Expression_Or.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+ initEClass(dsL_Expression_AndEClass, DSL_Expression_And.class, "DSL_Expression_And", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+ initEReference(getDSL_Expression_And_Left(), this.getDSL_Expression(), null, "left", null, 0, 1, DSL_Expression_And.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+ initEReference(getDSL_Expression_And_Right(), this.getDSL_Expression(), null, "right", null, 0, 1, DSL_Expression_And.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+ initEClass(dsL_Expression_DiffEClass, DSL_Expression_Diff.class, "DSL_Expression_Diff", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+ initEReference(getDSL_Expression_Diff_Left(), this.getDSL_Expression(), null, "left", null, 0, 1, DSL_Expression_Diff.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+ initEReference(getDSL_Expression_Diff_Right(), this.getDSL_Expression(), null, "right", null, 0, 1, DSL_Expression_Diff.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+ initEClass(dsL_Expression_EqualEClass, DSL_Expression_Equal.class, "DSL_Expression_Equal", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+ initEReference(getDSL_Expression_Equal_Left(), this.getDSL_Expression(), null, "left", null, 0, 1, DSL_Expression_Equal.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+ initEReference(getDSL_Expression_Equal_Right(), this.getDSL_Expression(), null, "right", null, 0, 1, DSL_Expression_Equal.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+ initEClass(dsL_Expression_LargerEClass, DSL_Expression_Larger.class, "DSL_Expression_Larger", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+ initEReference(getDSL_Expression_Larger_Left(), this.getDSL_Expression(), null, "left", null, 0, 1, DSL_Expression_Larger.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+ initEReference(getDSL_Expression_Larger_Right(), this.getDSL_Expression(), null, "right", null, 0, 1, DSL_Expression_Larger.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+ initEClass(dsL_Expression_Larger_EqualEClass, DSL_Expression_Larger_Equal.class, "DSL_Expression_Larger_Equal", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+ initEReference(getDSL_Expression_Larger_Equal_Left(), this.getDSL_Expression(), null, "left", null, 0, 1, DSL_Expression_Larger_Equal.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+ initEReference(getDSL_Expression_Larger_Equal_Right(), this.getDSL_Expression(), null, "right", null, 0, 1, DSL_Expression_Larger_Equal.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+ initEClass(dsL_Expression_SmallerEClass, DSL_Expression_Smaller.class, "DSL_Expression_Smaller", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+ initEReference(getDSL_Expression_Smaller_Left(), this.getDSL_Expression(), null, "left", null, 0, 1, DSL_Expression_Smaller.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+ initEReference(getDSL_Expression_Smaller_Right(), this.getDSL_Expression(), null, "right", null, 0, 1, DSL_Expression_Smaller.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+ initEClass(dsL_Expression_Smaller_EqualEClass, DSL_Expression_Smaller_Equal.class, "DSL_Expression_Smaller_Equal", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+ initEReference(getDSL_Expression_Smaller_Equal_Left(), this.getDSL_Expression(), null, "left", null, 0, 1, DSL_Expression_Smaller_Equal.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+ initEReference(getDSL_Expression_Smaller_Equal_Right(), this.getDSL_Expression(), null, "right", null, 0, 1, DSL_Expression_Smaller_Equal.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+ initEClass(dsL_Expression_PlusEClass, DSL_Expression_Plus.class, "DSL_Expression_Plus", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+ initEReference(getDSL_Expression_Plus_Left(), this.getDSL_Expression(), null, "left", null, 0, 1, DSL_Expression_Plus.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+ initEReference(getDSL_Expression_Plus_Right(), this.getDSL_Expression(), null, "right", null, 0, 1, DSL_Expression_Plus.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+ initEClass(dsL_Expression_MinusEClass, DSL_Expression_Minus.class, "DSL_Expression_Minus", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+ initEReference(getDSL_Expression_Minus_Left(), this.getDSL_Expression(), null, "left", null, 0, 1, DSL_Expression_Minus.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+ initEReference(getDSL_Expression_Minus_Right(), this.getDSL_Expression(), null, "right", null, 0, 1, DSL_Expression_Minus.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+ initEClass(dsL_Expression_MultiplicationEClass, DSL_Expression_Multiplication.class, "DSL_Expression_Multiplication", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+ initEReference(getDSL_Expression_Multiplication_Left(), this.getDSL_Expression(), null, "left", null, 0, 1, DSL_Expression_Multiplication.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+ initEReference(getDSL_Expression_Multiplication_Right(), this.getDSL_Expression(), null, "right", null, 0, 1, DSL_Expression_Multiplication.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+ initEClass(dsL_Expression_DivisionEClass, DSL_Expression_Division.class, "DSL_Expression_Division", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+ initEReference(getDSL_Expression_Division_Left(), this.getDSL_Expression(), null, "left", null, 0, 1, DSL_Expression_Division.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+ initEReference(getDSL_Expression_Division_Right(), this.getDSL_Expression(), null, "right", null, 0, 1, DSL_Expression_Division.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+ initEClass(dsL_Expression_ModuloEClass, DSL_Expression_Modulo.class, "DSL_Expression_Modulo", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+ initEReference(getDSL_Expression_Modulo_Left(), this.getDSL_Expression(), null, "left", null, 0, 1, DSL_Expression_Modulo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+ initEReference(getDSL_Expression_Modulo_Right(), this.getDSL_Expression(), null, "right", null, 0, 1, DSL_Expression_Modulo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+ initEClass(dsL_Object_NumberEClass, DSL_Object_Number.class, "DSL_Object_Number", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+ initEAttribute(getDSL_Object_Number_Value(), ecorePackage.getEBigDecimal(), "value", null, 0, 1, DSL_Object_Number.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+ initEClass(dsL_Object_StringEClass, DSL_Object_String.class, "DSL_Object_String", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+ initEAttribute(getDSL_Object_String_Value(), ecorePackage.getEString(), "value", null, 0, 1, DSL_Object_String.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+ initEClass(dsL_Object_BooleanEClass, DSL_Object_Boolean.class, "DSL_Object_Boolean", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+ initEAttribute(getDSL_Object_Boolean_Value(), ecorePackage.getEBoolean(), "value", null, 0, 1, DSL_Object_Boolean.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+ initEClass(dsL_Object_RefEClass, DSL_Object_Ref.class, "DSL_Object_Ref", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+ initEReference(getDSL_Object_Ref_Value(), this.getDSL_REF(), null, "value", null, 0, 1, DSL_Object_Ref.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+ initEClass(dsL_Expression_NegateEClass, DSL_Expression_Negate.class, "DSL_Expression_Negate", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+ initEReference(getDSL_Expression_Negate_Exp(), this.getDSL_Expression(), null, "exp", null, 0, 1, DSL_Expression_Negate.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+ // Create resource
+ createResource(eNS_URI);
+ }
+
+} //SensinactPackageImpl
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/util/SensinactAdapterFactory.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/util/SensinactAdapterFactory.java
new file mode 100644
index 0000000..9546018
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/util/SensinactAdapterFactory.java
@@ -0,0 +1,1003 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact.util;
+
+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;
+
+import org.eclipse.sensinact.studio.language.sensinact.*;
+
+/**
+ * <!-- 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 org.eclipse.sensinact.studio.language.sensinact.SensinactPackage
+ * @generated
+ */
+public class SensinactAdapterFactory extends AdapterFactoryImpl
+{
+ /**
+ * The cached model package.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected static SensinactPackage modelPackage;
+
+ /**
+ * Creates an instance of the adapter factory.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public SensinactAdapterFactory()
+ {
+ if (modelPackage == null)
+ {
+ modelPackage = SensinactPackage.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 SensinactSwitch<Adapter> modelSwitch =
+ new SensinactSwitch<Adapter>()
+ {
+ @Override
+ public Adapter caseSensinact(Sensinact object)
+ {
+ return createSensinactAdapter();
+ }
+ @Override
+ public Adapter caseDSL_SENSINACT(DSL_SENSINACT object)
+ {
+ return createDSL_SENSINACTAdapter();
+ }
+ @Override
+ public Adapter caseDSL_Resource(DSL_Resource object)
+ {
+ return createDSL_ResourceAdapter();
+ }
+ @Override
+ public Adapter caseDSL_On(DSL_On object)
+ {
+ return createDSL_OnAdapter();
+ }
+ @Override
+ public Adapter caseDSL_ECA_STATEMENT(DSL_ECA_STATEMENT object)
+ {
+ return createDSL_ECA_STATEMENTAdapter();
+ }
+ @Override
+ public Adapter caseDSL_IfDo(DSL_IfDo object)
+ {
+ return createDSL_IfDoAdapter();
+ }
+ @Override
+ public Adapter caseDSL_ElseIfDo(DSL_ElseIfDo object)
+ {
+ return createDSL_ElseIfDoAdapter();
+ }
+ @Override
+ public Adapter caseDSL_ElseDo(DSL_ElseDo object)
+ {
+ return createDSL_ElseDoAdapter();
+ }
+ @Override
+ public Adapter caseDSL_REF(DSL_REF object)
+ {
+ return createDSL_REFAdapter();
+ }
+ @Override
+ public Adapter caseDSL_REF_CONDITION(DSL_REF_CONDITION object)
+ {
+ return createDSL_REF_CONDITIONAdapter();
+ }
+ @Override
+ public Adapter caseDSL_CEP_STATEMENT(DSL_CEP_STATEMENT object)
+ {
+ return createDSL_CEP_STATEMENTAdapter();
+ }
+ @Override
+ public Adapter caseDSL_CEP_AFTER(DSL_CEP_AFTER object)
+ {
+ return createDSL_CEP_AFTERAdapter();
+ }
+ @Override
+ public Adapter caseDSL_CEP_BEFORE(DSL_CEP_BEFORE object)
+ {
+ return createDSL_CEP_BEFOREAdapter();
+ }
+ @Override
+ public Adapter caseDSL_CEP_COINCIDE(DSL_CEP_COINCIDE object)
+ {
+ return createDSL_CEP_COINCIDEAdapter();
+ }
+ @Override
+ public Adapter caseDSL_CEP_MIN(DSL_CEP_MIN object)
+ {
+ return createDSL_CEP_MINAdapter();
+ }
+ @Override
+ public Adapter caseDSL_CEP_MAX(DSL_CEP_MAX object)
+ {
+ return createDSL_CEP_MAXAdapter();
+ }
+ @Override
+ public Adapter caseDSL_CEP_AVG(DSL_CEP_AVG object)
+ {
+ return createDSL_CEP_AVGAdapter();
+ }
+ @Override
+ public Adapter caseDSL_CEP_SUM(DSL_CEP_SUM object)
+ {
+ return createDSL_CEP_SUMAdapter();
+ }
+ @Override
+ public Adapter caseDSL_CEP_COUNT(DSL_CEP_COUNT object)
+ {
+ return createDSL_CEP_COUNTAdapter();
+ }
+ @Override
+ public Adapter caseDSL_CEP_DURATION(DSL_CEP_DURATION object)
+ {
+ return createDSL_CEP_DURATIONAdapter();
+ }
+ @Override
+ public Adapter caseDSL_CEP_DURATION_MIN(DSL_CEP_DURATION_MIN object)
+ {
+ return createDSL_CEP_DURATION_MINAdapter();
+ }
+ @Override
+ public Adapter caseDSL_CEP_DURATION_SEC(DSL_CEP_DURATION_SEC object)
+ {
+ return createDSL_CEP_DURATION_SECAdapter();
+ }
+ @Override
+ public Adapter caseDSL_ListActions(DSL_ListActions object)
+ {
+ return createDSL_ListActionsAdapter();
+ }
+ @Override
+ public Adapter caseDSL_ResourceAction(DSL_ResourceAction object)
+ {
+ return createDSL_ResourceActionAdapter();
+ }
+ @Override
+ public Adapter caseDSL_ListParam(DSL_ListParam object)
+ {
+ return createDSL_ListParamAdapter();
+ }
+ @Override
+ public Adapter caseDSL_Expression(DSL_Expression object)
+ {
+ return createDSL_ExpressionAdapter();
+ }
+ @Override
+ public Adapter caseDSL_Expression_Or(DSL_Expression_Or object)
+ {
+ return createDSL_Expression_OrAdapter();
+ }
+ @Override
+ public Adapter caseDSL_Expression_And(DSL_Expression_And object)
+ {
+ return createDSL_Expression_AndAdapter();
+ }
+ @Override
+ public Adapter caseDSL_Expression_Diff(DSL_Expression_Diff object)
+ {
+ return createDSL_Expression_DiffAdapter();
+ }
+ @Override
+ public Adapter caseDSL_Expression_Equal(DSL_Expression_Equal object)
+ {
+ return createDSL_Expression_EqualAdapter();
+ }
+ @Override
+ public Adapter caseDSL_Expression_Larger(DSL_Expression_Larger object)
+ {
+ return createDSL_Expression_LargerAdapter();
+ }
+ @Override
+ public Adapter caseDSL_Expression_Larger_Equal(DSL_Expression_Larger_Equal object)
+ {
+ return createDSL_Expression_Larger_EqualAdapter();
+ }
+ @Override
+ public Adapter caseDSL_Expression_Smaller(DSL_Expression_Smaller object)
+ {
+ return createDSL_Expression_SmallerAdapter();
+ }
+ @Override
+ public Adapter caseDSL_Expression_Smaller_Equal(DSL_Expression_Smaller_Equal object)
+ {
+ return createDSL_Expression_Smaller_EqualAdapter();
+ }
+ @Override
+ public Adapter caseDSL_Expression_Plus(DSL_Expression_Plus object)
+ {
+ return createDSL_Expression_PlusAdapter();
+ }
+ @Override
+ public Adapter caseDSL_Expression_Minus(DSL_Expression_Minus object)
+ {
+ return createDSL_Expression_MinusAdapter();
+ }
+ @Override
+ public Adapter caseDSL_Expression_Multiplication(DSL_Expression_Multiplication object)
+ {
+ return createDSL_Expression_MultiplicationAdapter();
+ }
+ @Override
+ public Adapter caseDSL_Expression_Division(DSL_Expression_Division object)
+ {
+ return createDSL_Expression_DivisionAdapter();
+ }
+ @Override
+ public Adapter caseDSL_Expression_Modulo(DSL_Expression_Modulo object)
+ {
+ return createDSL_Expression_ModuloAdapter();
+ }
+ @Override
+ public Adapter caseDSL_Object_Number(DSL_Object_Number object)
+ {
+ return createDSL_Object_NumberAdapter();
+ }
+ @Override
+ public Adapter caseDSL_Object_String(DSL_Object_String object)
+ {
+ return createDSL_Object_StringAdapter();
+ }
+ @Override
+ public Adapter caseDSL_Object_Boolean(DSL_Object_Boolean object)
+ {
+ return createDSL_Object_BooleanAdapter();
+ }
+ @Override
+ public Adapter caseDSL_Object_Ref(DSL_Object_Ref object)
+ {
+ return createDSL_Object_RefAdapter();
+ }
+ @Override
+ public Adapter caseDSL_Expression_Negate(DSL_Expression_Negate object)
+ {
+ return createDSL_Expression_NegateAdapter();
+ }
+ @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 org.eclipse.sensinact.studio.language.sensinact.Sensinact <em>Sensinact</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 org.eclipse.sensinact.studio.language.sensinact.Sensinact
+ * @generated
+ */
+ public Adapter createSensinactAdapter()
+ {
+ return null;
+ }
+
+ /**
+ * Creates a new adapter for an object of class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_SENSINACT <em>DSL SENSINACT</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 org.eclipse.sensinact.studio.language.sensinact.DSL_SENSINACT
+ * @generated
+ */
+ public Adapter createDSL_SENSINACTAdapter()
+ {
+ return null;
+ }
+
+ /**
+ * Creates a new adapter for an object of class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Resource <em>DSL Resource</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 org.eclipse.sensinact.studio.language.sensinact.DSL_Resource
+ * @generated
+ */
+ public Adapter createDSL_ResourceAdapter()
+ {
+ return null;
+ }
+
+ /**
+ * Creates a new adapter for an object of class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_On <em>DSL On</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 org.eclipse.sensinact.studio.language.sensinact.DSL_On
+ * @generated
+ */
+ public Adapter createDSL_OnAdapter()
+ {
+ return null;
+ }
+
+ /**
+ * Creates a new adapter for an object of class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_ECA_STATEMENT <em>DSL ECA STATEMENT</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 org.eclipse.sensinact.studio.language.sensinact.DSL_ECA_STATEMENT
+ * @generated
+ */
+ public Adapter createDSL_ECA_STATEMENTAdapter()
+ {
+ return null;
+ }
+
+ /**
+ * Creates a new adapter for an object of class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_IfDo <em>DSL If Do</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 org.eclipse.sensinact.studio.language.sensinact.DSL_IfDo
+ * @generated
+ */
+ public Adapter createDSL_IfDoAdapter()
+ {
+ return null;
+ }
+
+ /**
+ * Creates a new adapter for an object of class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_ElseIfDo <em>DSL Else If Do</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 org.eclipse.sensinact.studio.language.sensinact.DSL_ElseIfDo
+ * @generated
+ */
+ public Adapter createDSL_ElseIfDoAdapter()
+ {
+ return null;
+ }
+
+ /**
+ * Creates a new adapter for an object of class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_ElseDo <em>DSL Else Do</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 org.eclipse.sensinact.studio.language.sensinact.DSL_ElseDo
+ * @generated
+ */
+ public Adapter createDSL_ElseDoAdapter()
+ {
+ return null;
+ }
+
+ /**
+ * Creates a new adapter for an object of class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_REF <em>DSL REF</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 org.eclipse.sensinact.studio.language.sensinact.DSL_REF
+ * @generated
+ */
+ public Adapter createDSL_REFAdapter()
+ {
+ return null;
+ }
+
+ /**
+ * Creates a new adapter for an object of class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_REF_CONDITION <em>DSL REF CONDITION</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 org.eclipse.sensinact.studio.language.sensinact.DSL_REF_CONDITION
+ * @generated
+ */
+ public Adapter createDSL_REF_CONDITIONAdapter()
+ {
+ return null;
+ }
+
+ /**
+ * Creates a new adapter for an object of class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_STATEMENT <em>DSL CEP STATEMENT</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 org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_STATEMENT
+ * @generated
+ */
+ public Adapter createDSL_CEP_STATEMENTAdapter()
+ {
+ return null;
+ }
+
+ /**
+ * Creates a new adapter for an object of class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_AFTER <em>DSL CEP AFTER</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 org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_AFTER
+ * @generated
+ */
+ public Adapter createDSL_CEP_AFTERAdapter()
+ {
+ return null;
+ }
+
+ /**
+ * Creates a new adapter for an object of class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_BEFORE <em>DSL CEP BEFORE</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 org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_BEFORE
+ * @generated
+ */
+ public Adapter createDSL_CEP_BEFOREAdapter()
+ {
+ return null;
+ }
+
+ /**
+ * Creates a new adapter for an object of class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_COINCIDE <em>DSL CEP COINCIDE</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 org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_COINCIDE
+ * @generated
+ */
+ public Adapter createDSL_CEP_COINCIDEAdapter()
+ {
+ return null;
+ }
+
+ /**
+ * Creates a new adapter for an object of class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_MIN <em>DSL CEP MIN</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 org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_MIN
+ * @generated
+ */
+ public Adapter createDSL_CEP_MINAdapter()
+ {
+ return null;
+ }
+
+ /**
+ * Creates a new adapter for an object of class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_MAX <em>DSL CEP MAX</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 org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_MAX
+ * @generated
+ */
+ public Adapter createDSL_CEP_MAXAdapter()
+ {
+ return null;
+ }
+
+ /**
+ * Creates a new adapter for an object of class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_AVG <em>DSL CEP AVG</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 org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_AVG
+ * @generated
+ */
+ public Adapter createDSL_CEP_AVGAdapter()
+ {
+ return null;
+ }
+
+ /**
+ * Creates a new adapter for an object of class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_SUM <em>DSL CEP SUM</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 org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_SUM
+ * @generated
+ */
+ public Adapter createDSL_CEP_SUMAdapter()
+ {
+ return null;
+ }
+
+ /**
+ * Creates a new adapter for an object of class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_COUNT <em>DSL CEP COUNT</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 org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_COUNT
+ * @generated
+ */
+ public Adapter createDSL_CEP_COUNTAdapter()
+ {
+ return null;
+ }
+
+ /**
+ * Creates a new adapter for an object of class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_DURATION <em>DSL CEP DURATION</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 org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_DURATION
+ * @generated
+ */
+ public Adapter createDSL_CEP_DURATIONAdapter()
+ {
+ return null;
+ }
+
+ /**
+ * Creates a new adapter for an object of class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_DURATION_MIN <em>DSL CEP DURATION MIN</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 org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_DURATION_MIN
+ * @generated
+ */
+ public Adapter createDSL_CEP_DURATION_MINAdapter()
+ {
+ return null;
+ }
+
+ /**
+ * Creates a new adapter for an object of class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_DURATION_SEC <em>DSL CEP DURATION SEC</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 org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_DURATION_SEC
+ * @generated
+ */
+ public Adapter createDSL_CEP_DURATION_SECAdapter()
+ {
+ return null;
+ }
+
+ /**
+ * Creates a new adapter for an object of class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_ListActions <em>DSL List Actions</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 org.eclipse.sensinact.studio.language.sensinact.DSL_ListActions
+ * @generated
+ */
+ public Adapter createDSL_ListActionsAdapter()
+ {
+ return null;
+ }
+
+ /**
+ * Creates a new adapter for an object of class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_ResourceAction <em>DSL Resource Action</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 org.eclipse.sensinact.studio.language.sensinact.DSL_ResourceAction
+ * @generated
+ */
+ public Adapter createDSL_ResourceActionAdapter()
+ {
+ return null;
+ }
+
+ /**
+ * Creates a new adapter for an object of class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_ListParam <em>DSL List Param</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 org.eclipse.sensinact.studio.language.sensinact.DSL_ListParam
+ * @generated
+ */
+ public Adapter createDSL_ListParamAdapter()
+ {
+ return null;
+ }
+
+ /**
+ * Creates a new adapter for an object of class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression <em>DSL Expression</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 org.eclipse.sensinact.studio.language.sensinact.DSL_Expression
+ * @generated
+ */
+ public Adapter createDSL_ExpressionAdapter()
+ {
+ return null;
+ }
+
+ /**
+ * Creates a new adapter for an object of class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Or <em>DSL Expression Or</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 org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Or
+ * @generated
+ */
+ public Adapter createDSL_Expression_OrAdapter()
+ {
+ return null;
+ }
+
+ /**
+ * Creates a new adapter for an object of class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_And <em>DSL Expression And</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 org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_And
+ * @generated
+ */
+ public Adapter createDSL_Expression_AndAdapter()
+ {
+ return null;
+ }
+
+ /**
+ * Creates a new adapter for an object of class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Diff <em>DSL Expression Diff</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 org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Diff
+ * @generated
+ */
+ public Adapter createDSL_Expression_DiffAdapter()
+ {
+ return null;
+ }
+
+ /**
+ * Creates a new adapter for an object of class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Equal <em>DSL Expression Equal</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 org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Equal
+ * @generated
+ */
+ public Adapter createDSL_Expression_EqualAdapter()
+ {
+ return null;
+ }
+
+ /**
+ * Creates a new adapter for an object of class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Larger <em>DSL Expression Larger</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 org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Larger
+ * @generated
+ */
+ public Adapter createDSL_Expression_LargerAdapter()
+ {
+ return null;
+ }
+
+ /**
+ * Creates a new adapter for an object of class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Larger_Equal <em>DSL Expression Larger Equal</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 org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Larger_Equal
+ * @generated
+ */
+ public Adapter createDSL_Expression_Larger_EqualAdapter()
+ {
+ return null;
+ }
+
+ /**
+ * Creates a new adapter for an object of class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Smaller <em>DSL Expression Smaller</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 org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Smaller
+ * @generated
+ */
+ public Adapter createDSL_Expression_SmallerAdapter()
+ {
+ return null;
+ }
+
+ /**
+ * Creates a new adapter for an object of class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Smaller_Equal <em>DSL Expression Smaller Equal</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 org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Smaller_Equal
+ * @generated
+ */
+ public Adapter createDSL_Expression_Smaller_EqualAdapter()
+ {
+ return null;
+ }
+
+ /**
+ * Creates a new adapter for an object of class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Plus <em>DSL Expression Plus</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 org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Plus
+ * @generated
+ */
+ public Adapter createDSL_Expression_PlusAdapter()
+ {
+ return null;
+ }
+
+ /**
+ * Creates a new adapter for an object of class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Minus <em>DSL Expression Minus</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 org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Minus
+ * @generated
+ */
+ public Adapter createDSL_Expression_MinusAdapter()
+ {
+ return null;
+ }
+
+ /**
+ * Creates a new adapter for an object of class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Multiplication <em>DSL Expression Multiplication</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 org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Multiplication
+ * @generated
+ */
+ public Adapter createDSL_Expression_MultiplicationAdapter()
+ {
+ return null;
+ }
+
+ /**
+ * Creates a new adapter for an object of class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Division <em>DSL Expression Division</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 org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Division
+ * @generated
+ */
+ public Adapter createDSL_Expression_DivisionAdapter()
+ {
+ return null;
+ }
+
+ /**
+ * Creates a new adapter for an object of class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Modulo <em>DSL Expression Modulo</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 org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Modulo
+ * @generated
+ */
+ public Adapter createDSL_Expression_ModuloAdapter()
+ {
+ return null;
+ }
+
+ /**
+ * Creates a new adapter for an object of class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Object_Number <em>DSL Object Number</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 org.eclipse.sensinact.studio.language.sensinact.DSL_Object_Number
+ * @generated
+ */
+ public Adapter createDSL_Object_NumberAdapter()
+ {
+ return null;
+ }
+
+ /**
+ * Creates a new adapter for an object of class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Object_String <em>DSL Object String</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 org.eclipse.sensinact.studio.language.sensinact.DSL_Object_String
+ * @generated
+ */
+ public Adapter createDSL_Object_StringAdapter()
+ {
+ return null;
+ }
+
+ /**
+ * Creates a new adapter for an object of class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Object_Boolean <em>DSL Object Boolean</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 org.eclipse.sensinact.studio.language.sensinact.DSL_Object_Boolean
+ * @generated
+ */
+ public Adapter createDSL_Object_BooleanAdapter()
+ {
+ return null;
+ }
+
+ /**
+ * Creates a new adapter for an object of class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Object_Ref <em>DSL Object Ref</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 org.eclipse.sensinact.studio.language.sensinact.DSL_Object_Ref
+ * @generated
+ */
+ public Adapter createDSL_Object_RefAdapter()
+ {
+ return null;
+ }
+
+ /**
+ * Creates a new adapter for an object of class '{@link org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Negate <em>DSL Expression Negate</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 org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Negate
+ * @generated
+ */
+ public Adapter createDSL_Expression_NegateAdapter()
+ {
+ 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;
+ }
+
+} //SensinactAdapterFactory
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/util/SensinactSwitch.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/util/SensinactSwitch.java
new file mode 100644
index 0000000..fb3ee3f
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/sensinact/util/SensinactSwitch.java
@@ -0,0 +1,1139 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/**
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.sensinact.util;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+
+import org.eclipse.emf.ecore.util.Switch;
+
+import org.eclipse.sensinact.studio.language.sensinact.*;
+
+/**
+ * <!-- 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 org.eclipse.sensinact.studio.language.sensinact.SensinactPackage
+ * @generated
+ */
+public class SensinactSwitch<T> extends Switch<T>
+{
+ /**
+ * The cached model package
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected static SensinactPackage modelPackage;
+
+ /**
+ * Creates an instance of the switch.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public SensinactSwitch()
+ {
+ if (modelPackage == null)
+ {
+ modelPackage = SensinactPackage.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 SensinactPackage.SENSINACT:
+ {
+ Sensinact sensinact = (Sensinact)theEObject;
+ T result = caseSensinact(sensinact);
+ if (result == null) result = defaultCase(theEObject);
+ return result;
+ }
+ case SensinactPackage.DSL_SENSINACT:
+ {
+ DSL_SENSINACT dsL_SENSINACT = (DSL_SENSINACT)theEObject;
+ T result = caseDSL_SENSINACT(dsL_SENSINACT);
+ if (result == null) result = defaultCase(theEObject);
+ return result;
+ }
+ case SensinactPackage.DSL_RESOURCE:
+ {
+ DSL_Resource dsL_Resource = (DSL_Resource)theEObject;
+ T result = caseDSL_Resource(dsL_Resource);
+ if (result == null) result = caseDSL_REF(dsL_Resource);
+ if (result == null) result = defaultCase(theEObject);
+ return result;
+ }
+ case SensinactPackage.DSL_ON:
+ {
+ DSL_On dsL_On = (DSL_On)theEObject;
+ T result = caseDSL_On(dsL_On);
+ if (result == null) result = defaultCase(theEObject);
+ return result;
+ }
+ case SensinactPackage.DSL_ECA_STATEMENT:
+ {
+ DSL_ECA_STATEMENT dsL_ECA_STATEMENT = (DSL_ECA_STATEMENT)theEObject;
+ T result = caseDSL_ECA_STATEMENT(dsL_ECA_STATEMENT);
+ if (result == null) result = defaultCase(theEObject);
+ return result;
+ }
+ case SensinactPackage.DSL_IF_DO:
+ {
+ DSL_IfDo dsL_IfDo = (DSL_IfDo)theEObject;
+ T result = caseDSL_IfDo(dsL_IfDo);
+ if (result == null) result = defaultCase(theEObject);
+ return result;
+ }
+ case SensinactPackage.DSL_ELSE_IF_DO:
+ {
+ DSL_ElseIfDo dsL_ElseIfDo = (DSL_ElseIfDo)theEObject;
+ T result = caseDSL_ElseIfDo(dsL_ElseIfDo);
+ if (result == null) result = defaultCase(theEObject);
+ return result;
+ }
+ case SensinactPackage.DSL_ELSE_DO:
+ {
+ DSL_ElseDo dsL_ElseDo = (DSL_ElseDo)theEObject;
+ T result = caseDSL_ElseDo(dsL_ElseDo);
+ if (result == null) result = defaultCase(theEObject);
+ return result;
+ }
+ case SensinactPackage.DSL_REF:
+ {
+ DSL_REF dsL_REF = (DSL_REF)theEObject;
+ T result = caseDSL_REF(dsL_REF);
+ if (result == null) result = defaultCase(theEObject);
+ return result;
+ }
+ case SensinactPackage.DSL_REF_CONDITION:
+ {
+ DSL_REF_CONDITION dsL_REF_CONDITION = (DSL_REF_CONDITION)theEObject;
+ T result = caseDSL_REF_CONDITION(dsL_REF_CONDITION);
+ if (result == null) result = defaultCase(theEObject);
+ return result;
+ }
+ case SensinactPackage.DSL_CEP_STATEMENT:
+ {
+ DSL_CEP_STATEMENT dsL_CEP_STATEMENT = (DSL_CEP_STATEMENT)theEObject;
+ T result = caseDSL_CEP_STATEMENT(dsL_CEP_STATEMENT);
+ if (result == null) result = caseDSL_REF(dsL_CEP_STATEMENT);
+ if (result == null) result = defaultCase(theEObject);
+ return result;
+ }
+ case SensinactPackage.DSL_CEP_AFTER:
+ {
+ DSL_CEP_AFTER dsL_CEP_AFTER = (DSL_CEP_AFTER)theEObject;
+ T result = caseDSL_CEP_AFTER(dsL_CEP_AFTER);
+ if (result == null) result = defaultCase(theEObject);
+ return result;
+ }
+ case SensinactPackage.DSL_CEP_BEFORE:
+ {
+ DSL_CEP_BEFORE dsL_CEP_BEFORE = (DSL_CEP_BEFORE)theEObject;
+ T result = caseDSL_CEP_BEFORE(dsL_CEP_BEFORE);
+ if (result == null) result = defaultCase(theEObject);
+ return result;
+ }
+ case SensinactPackage.DSL_CEP_COINCIDE:
+ {
+ DSL_CEP_COINCIDE dsL_CEP_COINCIDE = (DSL_CEP_COINCIDE)theEObject;
+ T result = caseDSL_CEP_COINCIDE(dsL_CEP_COINCIDE);
+ if (result == null) result = defaultCase(theEObject);
+ return result;
+ }
+ case SensinactPackage.DSL_CEP_MIN:
+ {
+ DSL_CEP_MIN dsL_CEP_MIN = (DSL_CEP_MIN)theEObject;
+ T result = caseDSL_CEP_MIN(dsL_CEP_MIN);
+ if (result == null) result = defaultCase(theEObject);
+ return result;
+ }
+ case SensinactPackage.DSL_CEP_MAX:
+ {
+ DSL_CEP_MAX dsL_CEP_MAX = (DSL_CEP_MAX)theEObject;
+ T result = caseDSL_CEP_MAX(dsL_CEP_MAX);
+ if (result == null) result = defaultCase(theEObject);
+ return result;
+ }
+ case SensinactPackage.DSL_CEP_AVG:
+ {
+ DSL_CEP_AVG dsL_CEP_AVG = (DSL_CEP_AVG)theEObject;
+ T result = caseDSL_CEP_AVG(dsL_CEP_AVG);
+ if (result == null) result = defaultCase(theEObject);
+ return result;
+ }
+ case SensinactPackage.DSL_CEP_SUM:
+ {
+ DSL_CEP_SUM dsL_CEP_SUM = (DSL_CEP_SUM)theEObject;
+ T result = caseDSL_CEP_SUM(dsL_CEP_SUM);
+ if (result == null) result = defaultCase(theEObject);
+ return result;
+ }
+ case SensinactPackage.DSL_CEP_COUNT:
+ {
+ DSL_CEP_COUNT dsL_CEP_COUNT = (DSL_CEP_COUNT)theEObject;
+ T result = caseDSL_CEP_COUNT(dsL_CEP_COUNT);
+ if (result == null) result = defaultCase(theEObject);
+ return result;
+ }
+ case SensinactPackage.DSL_CEP_DURATION:
+ {
+ DSL_CEP_DURATION dsL_CEP_DURATION = (DSL_CEP_DURATION)theEObject;
+ T result = caseDSL_CEP_DURATION(dsL_CEP_DURATION);
+ if (result == null) result = defaultCase(theEObject);
+ return result;
+ }
+ case SensinactPackage.DSL_CEP_DURATION_MIN:
+ {
+ DSL_CEP_DURATION_MIN dsL_CEP_DURATION_MIN = (DSL_CEP_DURATION_MIN)theEObject;
+ T result = caseDSL_CEP_DURATION_MIN(dsL_CEP_DURATION_MIN);
+ if (result == null) result = defaultCase(theEObject);
+ return result;
+ }
+ case SensinactPackage.DSL_CEP_DURATION_SEC:
+ {
+ DSL_CEP_DURATION_SEC dsL_CEP_DURATION_SEC = (DSL_CEP_DURATION_SEC)theEObject;
+ T result = caseDSL_CEP_DURATION_SEC(dsL_CEP_DURATION_SEC);
+ if (result == null) result = defaultCase(theEObject);
+ return result;
+ }
+ case SensinactPackage.DSL_LIST_ACTIONS:
+ {
+ DSL_ListActions dsL_ListActions = (DSL_ListActions)theEObject;
+ T result = caseDSL_ListActions(dsL_ListActions);
+ if (result == null) result = defaultCase(theEObject);
+ return result;
+ }
+ case SensinactPackage.DSL_RESOURCE_ACTION:
+ {
+ DSL_ResourceAction dsL_ResourceAction = (DSL_ResourceAction)theEObject;
+ T result = caseDSL_ResourceAction(dsL_ResourceAction);
+ if (result == null) result = defaultCase(theEObject);
+ return result;
+ }
+ case SensinactPackage.DSL_LIST_PARAM:
+ {
+ DSL_ListParam dsL_ListParam = (DSL_ListParam)theEObject;
+ T result = caseDSL_ListParam(dsL_ListParam);
+ if (result == null) result = defaultCase(theEObject);
+ return result;
+ }
+ case SensinactPackage.DSL_EXPRESSION:
+ {
+ DSL_Expression dsL_Expression = (DSL_Expression)theEObject;
+ T result = caseDSL_Expression(dsL_Expression);
+ if (result == null) result = defaultCase(theEObject);
+ return result;
+ }
+ case SensinactPackage.DSL_EXPRESSION_OR:
+ {
+ DSL_Expression_Or dsL_Expression_Or = (DSL_Expression_Or)theEObject;
+ T result = caseDSL_Expression_Or(dsL_Expression_Or);
+ if (result == null) result = caseDSL_Expression(dsL_Expression_Or);
+ if (result == null) result = defaultCase(theEObject);
+ return result;
+ }
+ case SensinactPackage.DSL_EXPRESSION_AND:
+ {
+ DSL_Expression_And dsL_Expression_And = (DSL_Expression_And)theEObject;
+ T result = caseDSL_Expression_And(dsL_Expression_And);
+ if (result == null) result = caseDSL_Expression(dsL_Expression_And);
+ if (result == null) result = defaultCase(theEObject);
+ return result;
+ }
+ case SensinactPackage.DSL_EXPRESSION_DIFF:
+ {
+ DSL_Expression_Diff dsL_Expression_Diff = (DSL_Expression_Diff)theEObject;
+ T result = caseDSL_Expression_Diff(dsL_Expression_Diff);
+ if (result == null) result = caseDSL_Expression(dsL_Expression_Diff);
+ if (result == null) result = defaultCase(theEObject);
+ return result;
+ }
+ case SensinactPackage.DSL_EXPRESSION_EQUAL:
+ {
+ DSL_Expression_Equal dsL_Expression_Equal = (DSL_Expression_Equal)theEObject;
+ T result = caseDSL_Expression_Equal(dsL_Expression_Equal);
+ if (result == null) result = caseDSL_Expression(dsL_Expression_Equal);
+ if (result == null) result = defaultCase(theEObject);
+ return result;
+ }
+ case SensinactPackage.DSL_EXPRESSION_LARGER:
+ {
+ DSL_Expression_Larger dsL_Expression_Larger = (DSL_Expression_Larger)theEObject;
+ T result = caseDSL_Expression_Larger(dsL_Expression_Larger);
+ if (result == null) result = caseDSL_Expression(dsL_Expression_Larger);
+ if (result == null) result = defaultCase(theEObject);
+ return result;
+ }
+ case SensinactPackage.DSL_EXPRESSION_LARGER_EQUAL:
+ {
+ DSL_Expression_Larger_Equal dsL_Expression_Larger_Equal = (DSL_Expression_Larger_Equal)theEObject;
+ T result = caseDSL_Expression_Larger_Equal(dsL_Expression_Larger_Equal);
+ if (result == null) result = caseDSL_Expression(dsL_Expression_Larger_Equal);
+ if (result == null) result = defaultCase(theEObject);
+ return result;
+ }
+ case SensinactPackage.DSL_EXPRESSION_SMALLER:
+ {
+ DSL_Expression_Smaller dsL_Expression_Smaller = (DSL_Expression_Smaller)theEObject;
+ T result = caseDSL_Expression_Smaller(dsL_Expression_Smaller);
+ if (result == null) result = caseDSL_Expression(dsL_Expression_Smaller);
+ if (result == null) result = defaultCase(theEObject);
+ return result;
+ }
+ case SensinactPackage.DSL_EXPRESSION_SMALLER_EQUAL:
+ {
+ DSL_Expression_Smaller_Equal dsL_Expression_Smaller_Equal = (DSL_Expression_Smaller_Equal)theEObject;
+ T result = caseDSL_Expression_Smaller_Equal(dsL_Expression_Smaller_Equal);
+ if (result == null) result = caseDSL_Expression(dsL_Expression_Smaller_Equal);
+ if (result == null) result = defaultCase(theEObject);
+ return result;
+ }
+ case SensinactPackage.DSL_EXPRESSION_PLUS:
+ {
+ DSL_Expression_Plus dsL_Expression_Plus = (DSL_Expression_Plus)theEObject;
+ T result = caseDSL_Expression_Plus(dsL_Expression_Plus);
+ if (result == null) result = caseDSL_Expression(dsL_Expression_Plus);
+ if (result == null) result = defaultCase(theEObject);
+ return result;
+ }
+ case SensinactPackage.DSL_EXPRESSION_MINUS:
+ {
+ DSL_Expression_Minus dsL_Expression_Minus = (DSL_Expression_Minus)theEObject;
+ T result = caseDSL_Expression_Minus(dsL_Expression_Minus);
+ if (result == null) result = caseDSL_Expression(dsL_Expression_Minus);
+ if (result == null) result = defaultCase(theEObject);
+ return result;
+ }
+ case SensinactPackage.DSL_EXPRESSION_MULTIPLICATION:
+ {
+ DSL_Expression_Multiplication dsL_Expression_Multiplication = (DSL_Expression_Multiplication)theEObject;
+ T result = caseDSL_Expression_Multiplication(dsL_Expression_Multiplication);
+ if (result == null) result = caseDSL_Expression(dsL_Expression_Multiplication);
+ if (result == null) result = defaultCase(theEObject);
+ return result;
+ }
+ case SensinactPackage.DSL_EXPRESSION_DIVISION:
+ {
+ DSL_Expression_Division dsL_Expression_Division = (DSL_Expression_Division)theEObject;
+ T result = caseDSL_Expression_Division(dsL_Expression_Division);
+ if (result == null) result = caseDSL_Expression(dsL_Expression_Division);
+ if (result == null) result = defaultCase(theEObject);
+ return result;
+ }
+ case SensinactPackage.DSL_EXPRESSION_MODULO:
+ {
+ DSL_Expression_Modulo dsL_Expression_Modulo = (DSL_Expression_Modulo)theEObject;
+ T result = caseDSL_Expression_Modulo(dsL_Expression_Modulo);
+ if (result == null) result = caseDSL_Expression(dsL_Expression_Modulo);
+ if (result == null) result = defaultCase(theEObject);
+ return result;
+ }
+ case SensinactPackage.DSL_OBJECT_NUMBER:
+ {
+ DSL_Object_Number dsL_Object_Number = (DSL_Object_Number)theEObject;
+ T result = caseDSL_Object_Number(dsL_Object_Number);
+ if (result == null) result = caseDSL_Expression(dsL_Object_Number);
+ if (result == null) result = defaultCase(theEObject);
+ return result;
+ }
+ case SensinactPackage.DSL_OBJECT_STRING:
+ {
+ DSL_Object_String dsL_Object_String = (DSL_Object_String)theEObject;
+ T result = caseDSL_Object_String(dsL_Object_String);
+ if (result == null) result = caseDSL_Expression(dsL_Object_String);
+ if (result == null) result = defaultCase(theEObject);
+ return result;
+ }
+ case SensinactPackage.DSL_OBJECT_BOOLEAN:
+ {
+ DSL_Object_Boolean dsL_Object_Boolean = (DSL_Object_Boolean)theEObject;
+ T result = caseDSL_Object_Boolean(dsL_Object_Boolean);
+ if (result == null) result = caseDSL_Expression(dsL_Object_Boolean);
+ if (result == null) result = defaultCase(theEObject);
+ return result;
+ }
+ case SensinactPackage.DSL_OBJECT_REF:
+ {
+ DSL_Object_Ref dsL_Object_Ref = (DSL_Object_Ref)theEObject;
+ T result = caseDSL_Object_Ref(dsL_Object_Ref);
+ if (result == null) result = caseDSL_Expression(dsL_Object_Ref);
+ if (result == null) result = defaultCase(theEObject);
+ return result;
+ }
+ case SensinactPackage.DSL_EXPRESSION_NEGATE:
+ {
+ DSL_Expression_Negate dsL_Expression_Negate = (DSL_Expression_Negate)theEObject;
+ T result = caseDSL_Expression_Negate(dsL_Expression_Negate);
+ if (result == null) result = caseDSL_Expression(dsL_Expression_Negate);
+ if (result == null) result = defaultCase(theEObject);
+ return result;
+ }
+ default: return defaultCase(theEObject);
+ }
+ }
+
+ /**
+ * Returns the result of interpreting the object as an instance of '<em>Sensinact</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>Sensinact</em>'.
+ * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+ * @generated
+ */
+ public T caseSensinact(Sensinact object)
+ {
+ return null;
+ }
+
+ /**
+ * Returns the result of interpreting the object as an instance of '<em>DSL SENSINACT</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>DSL SENSINACT</em>'.
+ * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+ * @generated
+ */
+ public T caseDSL_SENSINACT(DSL_SENSINACT object)
+ {
+ return null;
+ }
+
+ /**
+ * Returns the result of interpreting the object as an instance of '<em>DSL Resource</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>DSL Resource</em>'.
+ * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+ * @generated
+ */
+ public T caseDSL_Resource(DSL_Resource object)
+ {
+ return null;
+ }
+
+ /**
+ * Returns the result of interpreting the object as an instance of '<em>DSL On</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>DSL On</em>'.
+ * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+ * @generated
+ */
+ public T caseDSL_On(DSL_On object)
+ {
+ return null;
+ }
+
+ /**
+ * Returns the result of interpreting the object as an instance of '<em>DSL ECA STATEMENT</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>DSL ECA STATEMENT</em>'.
+ * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+ * @generated
+ */
+ public T caseDSL_ECA_STATEMENT(DSL_ECA_STATEMENT object)
+ {
+ return null;
+ }
+
+ /**
+ * Returns the result of interpreting the object as an instance of '<em>DSL If Do</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>DSL If Do</em>'.
+ * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+ * @generated
+ */
+ public T caseDSL_IfDo(DSL_IfDo object)
+ {
+ return null;
+ }
+
+ /**
+ * Returns the result of interpreting the object as an instance of '<em>DSL Else If Do</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>DSL Else If Do</em>'.
+ * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+ * @generated
+ */
+ public T caseDSL_ElseIfDo(DSL_ElseIfDo object)
+ {
+ return null;
+ }
+
+ /**
+ * Returns the result of interpreting the object as an instance of '<em>DSL Else Do</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>DSL Else Do</em>'.
+ * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+ * @generated
+ */
+ public T caseDSL_ElseDo(DSL_ElseDo object)
+ {
+ return null;
+ }
+
+ /**
+ * Returns the result of interpreting the object as an instance of '<em>DSL REF</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>DSL REF</em>'.
+ * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+ * @generated
+ */
+ public T caseDSL_REF(DSL_REF object)
+ {
+ return null;
+ }
+
+ /**
+ * Returns the result of interpreting the object as an instance of '<em>DSL REF CONDITION</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>DSL REF CONDITION</em>'.
+ * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+ * @generated
+ */
+ public T caseDSL_REF_CONDITION(DSL_REF_CONDITION object)
+ {
+ return null;
+ }
+
+ /**
+ * Returns the result of interpreting the object as an instance of '<em>DSL CEP STATEMENT</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>DSL CEP STATEMENT</em>'.
+ * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+ * @generated
+ */
+ public T caseDSL_CEP_STATEMENT(DSL_CEP_STATEMENT object)
+ {
+ return null;
+ }
+
+ /**
+ * Returns the result of interpreting the object as an instance of '<em>DSL CEP AFTER</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>DSL CEP AFTER</em>'.
+ * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+ * @generated
+ */
+ public T caseDSL_CEP_AFTER(DSL_CEP_AFTER object)
+ {
+ return null;
+ }
+
+ /**
+ * Returns the result of interpreting the object as an instance of '<em>DSL CEP BEFORE</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>DSL CEP BEFORE</em>'.
+ * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+ * @generated
+ */
+ public T caseDSL_CEP_BEFORE(DSL_CEP_BEFORE object)
+ {
+ return null;
+ }
+
+ /**
+ * Returns the result of interpreting the object as an instance of '<em>DSL CEP COINCIDE</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>DSL CEP COINCIDE</em>'.
+ * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+ * @generated
+ */
+ public T caseDSL_CEP_COINCIDE(DSL_CEP_COINCIDE object)
+ {
+ return null;
+ }
+
+ /**
+ * Returns the result of interpreting the object as an instance of '<em>DSL CEP MIN</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>DSL CEP MIN</em>'.
+ * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+ * @generated
+ */
+ public T caseDSL_CEP_MIN(DSL_CEP_MIN object)
+ {
+ return null;
+ }
+
+ /**
+ * Returns the result of interpreting the object as an instance of '<em>DSL CEP MAX</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>DSL CEP MAX</em>'.
+ * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+ * @generated
+ */
+ public T caseDSL_CEP_MAX(DSL_CEP_MAX object)
+ {
+ return null;
+ }
+
+ /**
+ * Returns the result of interpreting the object as an instance of '<em>DSL CEP AVG</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>DSL CEP AVG</em>'.
+ * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+ * @generated
+ */
+ public T caseDSL_CEP_AVG(DSL_CEP_AVG object)
+ {
+ return null;
+ }
+
+ /**
+ * Returns the result of interpreting the object as an instance of '<em>DSL CEP SUM</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>DSL CEP SUM</em>'.
+ * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+ * @generated
+ */
+ public T caseDSL_CEP_SUM(DSL_CEP_SUM object)
+ {
+ return null;
+ }
+
+ /**
+ * Returns the result of interpreting the object as an instance of '<em>DSL CEP COUNT</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>DSL CEP COUNT</em>'.
+ * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+ * @generated
+ */
+ public T caseDSL_CEP_COUNT(DSL_CEP_COUNT object)
+ {
+ return null;
+ }
+
+ /**
+ * Returns the result of interpreting the object as an instance of '<em>DSL CEP DURATION</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>DSL CEP DURATION</em>'.
+ * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+ * @generated
+ */
+ public T caseDSL_CEP_DURATION(DSL_CEP_DURATION object)
+ {
+ return null;
+ }
+
+ /**
+ * Returns the result of interpreting the object as an instance of '<em>DSL CEP DURATION MIN</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>DSL CEP DURATION MIN</em>'.
+ * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+ * @generated
+ */
+ public T caseDSL_CEP_DURATION_MIN(DSL_CEP_DURATION_MIN object)
+ {
+ return null;
+ }
+
+ /**
+ * Returns the result of interpreting the object as an instance of '<em>DSL CEP DURATION SEC</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>DSL CEP DURATION SEC</em>'.
+ * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+ * @generated
+ */
+ public T caseDSL_CEP_DURATION_SEC(DSL_CEP_DURATION_SEC object)
+ {
+ return null;
+ }
+
+ /**
+ * Returns the result of interpreting the object as an instance of '<em>DSL List Actions</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>DSL List Actions</em>'.
+ * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+ * @generated
+ */
+ public T caseDSL_ListActions(DSL_ListActions object)
+ {
+ return null;
+ }
+
+ /**
+ * Returns the result of interpreting the object as an instance of '<em>DSL Resource Action</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>DSL Resource Action</em>'.
+ * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+ * @generated
+ */
+ public T caseDSL_ResourceAction(DSL_ResourceAction object)
+ {
+ return null;
+ }
+
+ /**
+ * Returns the result of interpreting the object as an instance of '<em>DSL List Param</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>DSL List Param</em>'.
+ * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+ * @generated
+ */
+ public T caseDSL_ListParam(DSL_ListParam object)
+ {
+ return null;
+ }
+
+ /**
+ * Returns the result of interpreting the object as an instance of '<em>DSL Expression</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>DSL Expression</em>'.
+ * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+ * @generated
+ */
+ public T caseDSL_Expression(DSL_Expression object)
+ {
+ return null;
+ }
+
+ /**
+ * Returns the result of interpreting the object as an instance of '<em>DSL Expression Or</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>DSL Expression Or</em>'.
+ * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+ * @generated
+ */
+ public T caseDSL_Expression_Or(DSL_Expression_Or object)
+ {
+ return null;
+ }
+
+ /**
+ * Returns the result of interpreting the object as an instance of '<em>DSL Expression And</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>DSL Expression And</em>'.
+ * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+ * @generated
+ */
+ public T caseDSL_Expression_And(DSL_Expression_And object)
+ {
+ return null;
+ }
+
+ /**
+ * Returns the result of interpreting the object as an instance of '<em>DSL Expression Diff</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>DSL Expression Diff</em>'.
+ * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+ * @generated
+ */
+ public T caseDSL_Expression_Diff(DSL_Expression_Diff object)
+ {
+ return null;
+ }
+
+ /**
+ * Returns the result of interpreting the object as an instance of '<em>DSL Expression Equal</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>DSL Expression Equal</em>'.
+ * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+ * @generated
+ */
+ public T caseDSL_Expression_Equal(DSL_Expression_Equal object)
+ {
+ return null;
+ }
+
+ /**
+ * Returns the result of interpreting the object as an instance of '<em>DSL Expression Larger</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>DSL Expression Larger</em>'.
+ * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+ * @generated
+ */
+ public T caseDSL_Expression_Larger(DSL_Expression_Larger object)
+ {
+ return null;
+ }
+
+ /**
+ * Returns the result of interpreting the object as an instance of '<em>DSL Expression Larger Equal</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>DSL Expression Larger Equal</em>'.
+ * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+ * @generated
+ */
+ public T caseDSL_Expression_Larger_Equal(DSL_Expression_Larger_Equal object)
+ {
+ return null;
+ }
+
+ /**
+ * Returns the result of interpreting the object as an instance of '<em>DSL Expression Smaller</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>DSL Expression Smaller</em>'.
+ * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+ * @generated
+ */
+ public T caseDSL_Expression_Smaller(DSL_Expression_Smaller object)
+ {
+ return null;
+ }
+
+ /**
+ * Returns the result of interpreting the object as an instance of '<em>DSL Expression Smaller Equal</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>DSL Expression Smaller Equal</em>'.
+ * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+ * @generated
+ */
+ public T caseDSL_Expression_Smaller_Equal(DSL_Expression_Smaller_Equal object)
+ {
+ return null;
+ }
+
+ /**
+ * Returns the result of interpreting the object as an instance of '<em>DSL Expression Plus</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>DSL Expression Plus</em>'.
+ * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+ * @generated
+ */
+ public T caseDSL_Expression_Plus(DSL_Expression_Plus object)
+ {
+ return null;
+ }
+
+ /**
+ * Returns the result of interpreting the object as an instance of '<em>DSL Expression Minus</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>DSL Expression Minus</em>'.
+ * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+ * @generated
+ */
+ public T caseDSL_Expression_Minus(DSL_Expression_Minus object)
+ {
+ return null;
+ }
+
+ /**
+ * Returns the result of interpreting the object as an instance of '<em>DSL Expression Multiplication</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>DSL Expression Multiplication</em>'.
+ * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+ * @generated
+ */
+ public T caseDSL_Expression_Multiplication(DSL_Expression_Multiplication object)
+ {
+ return null;
+ }
+
+ /**
+ * Returns the result of interpreting the object as an instance of '<em>DSL Expression Division</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>DSL Expression Division</em>'.
+ * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+ * @generated
+ */
+ public T caseDSL_Expression_Division(DSL_Expression_Division object)
+ {
+ return null;
+ }
+
+ /**
+ * Returns the result of interpreting the object as an instance of '<em>DSL Expression Modulo</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>DSL Expression Modulo</em>'.
+ * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+ * @generated
+ */
+ public T caseDSL_Expression_Modulo(DSL_Expression_Modulo object)
+ {
+ return null;
+ }
+
+ /**
+ * Returns the result of interpreting the object as an instance of '<em>DSL Object Number</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>DSL Object Number</em>'.
+ * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+ * @generated
+ */
+ public T caseDSL_Object_Number(DSL_Object_Number object)
+ {
+ return null;
+ }
+
+ /**
+ * Returns the result of interpreting the object as an instance of '<em>DSL Object String</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>DSL Object String</em>'.
+ * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+ * @generated
+ */
+ public T caseDSL_Object_String(DSL_Object_String object)
+ {
+ return null;
+ }
+
+ /**
+ * Returns the result of interpreting the object as an instance of '<em>DSL Object Boolean</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>DSL Object Boolean</em>'.
+ * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+ * @generated
+ */
+ public T caseDSL_Object_Boolean(DSL_Object_Boolean object)
+ {
+ return null;
+ }
+
+ /**
+ * Returns the result of interpreting the object as an instance of '<em>DSL Object Ref</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>DSL Object Ref</em>'.
+ * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+ * @generated
+ */
+ public T caseDSL_Object_Ref(DSL_Object_Ref object)
+ {
+ return null;
+ }
+
+ /**
+ * Returns the result of interpreting the object as an instance of '<em>DSL Expression Negate</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>DSL Expression Negate</em>'.
+ * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+ * @generated
+ */
+ public T caseDSL_Expression_Negate(DSL_Expression_Negate 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;
+ }
+
+} //SensinactSwitch
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/serializer/SensinactSemanticSequencer.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/serializer/SensinactSemanticSequencer.java
new file mode 100644
index 0000000..9b22c96
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/serializer/SensinactSemanticSequencer.java
@@ -0,0 +1,1347 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/*
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.serializer;
+
+import com.google.inject.Inject;
+import java.util.Set;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_AFTER;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_AVG;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_BEFORE;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_COINCIDE;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_COUNT;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_DURATION;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_DURATION_MIN;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_DURATION_SEC;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_MAX;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_MIN;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_STATEMENT;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_SUM;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_ECA_STATEMENT;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_ElseDo;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_ElseIfDo;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_And;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Diff;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Division;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Equal;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Larger;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Larger_Equal;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Minus;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Modulo;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Multiplication;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Negate;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Or;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Plus;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Smaller;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Expression_Smaller_Equal;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_IfDo;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_ListActions;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_ListParam;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Object_Boolean;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Object_Number;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Object_Ref;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Object_String;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_On;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_REF_CONDITION;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Resource;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_ResourceAction;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_SENSINACT;
+import org.eclipse.sensinact.studio.language.sensinact.Sensinact;
+import org.eclipse.sensinact.studio.language.sensinact.SensinactPackage;
+import org.eclipse.sensinact.studio.language.services.SensinactGrammarAccess;
+import org.eclipse.xtext.Action;
+import org.eclipse.xtext.Parameter;
+import org.eclipse.xtext.ParserRule;
+import org.eclipse.xtext.serializer.ISerializationContext;
+import org.eclipse.xtext.serializer.acceptor.SequenceFeeder;
+import org.eclipse.xtext.serializer.sequencer.AbstractDelegatingSemanticSequencer;
+import org.eclipse.xtext.serializer.sequencer.ITransientValueService.ValueTransient;
+
+@SuppressWarnings("all")
+public class SensinactSemanticSequencer extends AbstractDelegatingSemanticSequencer {
+
+ @Inject
+ private SensinactGrammarAccess grammarAccess;
+
+ @Override
+ public void sequence(ISerializationContext context, EObject semanticObject) {
+ EPackage epackage = semanticObject.eClass().getEPackage();
+ ParserRule rule = context.getParserRule();
+ Action action = context.getAssignedAction();
+ Set<Parameter> parameters = context.getEnabledBooleanParameters();
+ if (epackage == SensinactPackage.eINSTANCE)
+ switch (semanticObject.eClass().getClassifierID()) {
+ case SensinactPackage.DSL_CEP_AFTER:
+ sequence_DSL_CEP_AFTER(context, (DSL_CEP_AFTER) semanticObject);
+ return;
+ case SensinactPackage.DSL_CEP_AVG:
+ sequence_DSL_CEP_AVG(context, (DSL_CEP_AVG) semanticObject);
+ return;
+ case SensinactPackage.DSL_CEP_BEFORE:
+ sequence_DSL_CEP_BEFORE(context, (DSL_CEP_BEFORE) semanticObject);
+ return;
+ case SensinactPackage.DSL_CEP_COINCIDE:
+ sequence_DSL_CEP_COINCIDE(context, (DSL_CEP_COINCIDE) semanticObject);
+ return;
+ case SensinactPackage.DSL_CEP_COUNT:
+ sequence_DSL_CEP_COUNT(context, (DSL_CEP_COUNT) semanticObject);
+ return;
+ case SensinactPackage.DSL_CEP_DURATION:
+ sequence_DSL_CEP_DURATION(context, (DSL_CEP_DURATION) semanticObject);
+ return;
+ case SensinactPackage.DSL_CEP_DURATION_MIN:
+ sequence_DSL_CEP_DURATION_MIN(context, (DSL_CEP_DURATION_MIN) semanticObject);
+ return;
+ case SensinactPackage.DSL_CEP_DURATION_SEC:
+ sequence_DSL_CEP_DURATION_SEC(context, (DSL_CEP_DURATION_SEC) semanticObject);
+ return;
+ case SensinactPackage.DSL_CEP_MAX:
+ sequence_DSL_CEP_MAX(context, (DSL_CEP_MAX) semanticObject);
+ return;
+ case SensinactPackage.DSL_CEP_MIN:
+ sequence_DSL_CEP_MIN(context, (DSL_CEP_MIN) semanticObject);
+ return;
+ case SensinactPackage.DSL_CEP_STATEMENT:
+ sequence_DSL_CEP_STATEMENT(context, (DSL_CEP_STATEMENT) semanticObject);
+ return;
+ case SensinactPackage.DSL_CEP_SUM:
+ sequence_DSL_CEP_SUM(context, (DSL_CEP_SUM) semanticObject);
+ return;
+ case SensinactPackage.DSL_ECA_STATEMENT:
+ sequence_DSL_ECA_STATEMENT(context, (DSL_ECA_STATEMENT) semanticObject);
+ return;
+ case SensinactPackage.DSL_ELSE_DO:
+ sequence_DSL_ElseDo(context, (DSL_ElseDo) semanticObject);
+ return;
+ case SensinactPackage.DSL_ELSE_IF_DO:
+ sequence_DSL_ElseIfDo(context, (DSL_ElseIfDo) semanticObject);
+ return;
+ case SensinactPackage.DSL_EXPRESSION_AND:
+ sequence_DSL_Expression_And(context, (DSL_Expression_And) semanticObject);
+ return;
+ case SensinactPackage.DSL_EXPRESSION_DIFF:
+ sequence_DSL_Expression_DiffEqual(context, (DSL_Expression_Diff) semanticObject);
+ return;
+ case SensinactPackage.DSL_EXPRESSION_DIVISION:
+ sequence_DSL_Expression_MultiplicationDivision(context, (DSL_Expression_Division) semanticObject);
+ return;
+ case SensinactPackage.DSL_EXPRESSION_EQUAL:
+ sequence_DSL_Expression_DiffEqual(context, (DSL_Expression_Equal) semanticObject);
+ return;
+ case SensinactPackage.DSL_EXPRESSION_LARGER:
+ sequence_DSL_Expression_Compare(context, (DSL_Expression_Larger) semanticObject);
+ return;
+ case SensinactPackage.DSL_EXPRESSION_LARGER_EQUAL:
+ sequence_DSL_Expression_Compare(context, (DSL_Expression_Larger_Equal) semanticObject);
+ return;
+ case SensinactPackage.DSL_EXPRESSION_MINUS:
+ sequence_DSL_Expression_PlusMinus(context, (DSL_Expression_Minus) semanticObject);
+ return;
+ case SensinactPackage.DSL_EXPRESSION_MODULO:
+ sequence_DSL_Expression_MultiplicationDivision(context, (DSL_Expression_Modulo) semanticObject);
+ return;
+ case SensinactPackage.DSL_EXPRESSION_MULTIPLICATION:
+ sequence_DSL_Expression_MultiplicationDivision(context, (DSL_Expression_Multiplication) semanticObject);
+ return;
+ case SensinactPackage.DSL_EXPRESSION_NEGATE:
+ sequence_DSL_Expression_Unary(context, (DSL_Expression_Negate) semanticObject);
+ return;
+ case SensinactPackage.DSL_EXPRESSION_OR:
+ sequence_DSL_Expression_Or(context, (DSL_Expression_Or) semanticObject);
+ return;
+ case SensinactPackage.DSL_EXPRESSION_PLUS:
+ sequence_DSL_Expression_PlusMinus(context, (DSL_Expression_Plus) semanticObject);
+ return;
+ case SensinactPackage.DSL_EXPRESSION_SMALLER:
+ sequence_DSL_Expression_Compare(context, (DSL_Expression_Smaller) semanticObject);
+ return;
+ case SensinactPackage.DSL_EXPRESSION_SMALLER_EQUAL:
+ sequence_DSL_Expression_Compare(context, (DSL_Expression_Smaller_Equal) semanticObject);
+ return;
+ case SensinactPackage.DSL_IF_DO:
+ sequence_DSL_IfDo(context, (DSL_IfDo) semanticObject);
+ return;
+ case SensinactPackage.DSL_LIST_ACTIONS:
+ sequence_DSL_ListActions(context, (DSL_ListActions) semanticObject);
+ return;
+ case SensinactPackage.DSL_LIST_PARAM:
+ sequence_DSL_ListParam(context, (DSL_ListParam) semanticObject);
+ return;
+ case SensinactPackage.DSL_OBJECT_BOOLEAN:
+ sequence_DSL_Expression_Unary(context, (DSL_Object_Boolean) semanticObject);
+ return;
+ case SensinactPackage.DSL_OBJECT_NUMBER:
+ sequence_DSL_Expression_Unary(context, (DSL_Object_Number) semanticObject);
+ return;
+ case SensinactPackage.DSL_OBJECT_REF:
+ sequence_DSL_Expression_Unary(context, (DSL_Object_Ref) semanticObject);
+ return;
+ case SensinactPackage.DSL_OBJECT_STRING:
+ sequence_DSL_Expression_Unary(context, (DSL_Object_String) semanticObject);
+ return;
+ case SensinactPackage.DSL_ON:
+ sequence_DSL_On(context, (DSL_On) semanticObject);
+ return;
+ case SensinactPackage.DSL_REF_CONDITION:
+ sequence_DSL_REF_CONDITION(context, (DSL_REF_CONDITION) semanticObject);
+ return;
+ case SensinactPackage.DSL_RESOURCE:
+ sequence_DSL_Resource(context, (DSL_Resource) semanticObject);
+ return;
+ case SensinactPackage.DSL_RESOURCE_ACTION:
+ sequence_DSL_ResourceAction(context, (DSL_ResourceAction) semanticObject);
+ return;
+ case SensinactPackage.DSL_SENSINACT:
+ sequence_DSL_SENSINACT(context, (DSL_SENSINACT) semanticObject);
+ return;
+ case SensinactPackage.SENSINACT:
+ sequence_Sensinact(context, (Sensinact) semanticObject);
+ return;
+ }
+ if (errorAcceptor != null)
+ errorAcceptor.accept(diagnosticProvider.createInvalidContextOrTypeDiagnostic(semanticObject, context));
+ }
+
+ /**
+ * Contexts:
+ * DSL_CEP_AFTER returns DSL_CEP_AFTER
+ *
+ * Constraint:
+ * (ref1=DSL_REF_CONDITION ref2=DSL_REF_CONDITION start=DSL_CEP_DURATION? end=DSL_CEP_DURATION)
+ */
+ protected void sequence_DSL_CEP_AFTER(ISerializationContext context, DSL_CEP_AFTER semanticObject) {
+ genericSequencer.createSequence(context, semanticObject);
+ }
+
+
+ /**
+ * Contexts:
+ * DSL_CEP_AVG returns DSL_CEP_AVG
+ *
+ * Constraint:
+ * (ref=DSL_REF_CONDITION window=DSL_CEP_DURATION)
+ */
+ protected void sequence_DSL_CEP_AVG(ISerializationContext context, DSL_CEP_AVG semanticObject) {
+ if (errorAcceptor != null) {
+ if (transientValues.isValueTransient(semanticObject, SensinactPackage.Literals.DSL_CEP_AVG__REF) == ValueTransient.YES)
+ errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SensinactPackage.Literals.DSL_CEP_AVG__REF));
+ if (transientValues.isValueTransient(semanticObject, SensinactPackage.Literals.DSL_CEP_AVG__WINDOW) == ValueTransient.YES)
+ errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SensinactPackage.Literals.DSL_CEP_AVG__WINDOW));
+ }
+ SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+ feeder.accept(grammarAccess.getDSL_CEP_AVGAccess().getRefDSL_REF_CONDITIONParserRuleCall_2_0(), semanticObject.getRef());
+ feeder.accept(grammarAccess.getDSL_CEP_AVGAccess().getWindowDSL_CEP_DURATIONParserRuleCall_4_0(), semanticObject.getWindow());
+ feeder.finish();
+ }
+
+
+ /**
+ * Contexts:
+ * DSL_CEP_BEFORE returns DSL_CEP_BEFORE
+ *
+ * Constraint:
+ * (ref1=DSL_REF_CONDITION ref2=DSL_REF_CONDITION start=DSL_CEP_DURATION? end=DSL_CEP_DURATION)
+ */
+ protected void sequence_DSL_CEP_BEFORE(ISerializationContext context, DSL_CEP_BEFORE semanticObject) {
+ genericSequencer.createSequence(context, semanticObject);
+ }
+
+
+ /**
+ * Contexts:
+ * DSL_CEP_COINCIDE returns DSL_CEP_COINCIDE
+ *
+ * Constraint:
+ * (ref1=DSL_REF_CONDITION ref2=DSL_REF_CONDITION window=DSL_CEP_DURATION)
+ */
+ protected void sequence_DSL_CEP_COINCIDE(ISerializationContext context, DSL_CEP_COINCIDE semanticObject) {
+ if (errorAcceptor != null) {
+ if (transientValues.isValueTransient(semanticObject, SensinactPackage.Literals.DSL_CEP_COINCIDE__REF1) == ValueTransient.YES)
+ errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SensinactPackage.Literals.DSL_CEP_COINCIDE__REF1));
+ if (transientValues.isValueTransient(semanticObject, SensinactPackage.Literals.DSL_CEP_COINCIDE__REF2) == ValueTransient.YES)
+ errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SensinactPackage.Literals.DSL_CEP_COINCIDE__REF2));
+ if (transientValues.isValueTransient(semanticObject, SensinactPackage.Literals.DSL_CEP_COINCIDE__WINDOW) == ValueTransient.YES)
+ errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SensinactPackage.Literals.DSL_CEP_COINCIDE__WINDOW));
+ }
+ SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+ feeder.accept(grammarAccess.getDSL_CEP_COINCIDEAccess().getRef1DSL_REF_CONDITIONParserRuleCall_2_0(), semanticObject.getRef1());
+ feeder.accept(grammarAccess.getDSL_CEP_COINCIDEAccess().getRef2DSL_REF_CONDITIONParserRuleCall_4_0(), semanticObject.getRef2());
+ feeder.accept(grammarAccess.getDSL_CEP_COINCIDEAccess().getWindowDSL_CEP_DURATIONParserRuleCall_6_0(), semanticObject.getWindow());
+ feeder.finish();
+ }
+
+
+ /**
+ * Contexts:
+ * DSL_CEP_COUNT returns DSL_CEP_COUNT
+ *
+ * Constraint:
+ * (ref=DSL_REF_CONDITION window=DSL_CEP_DURATION)
+ */
+ protected void sequence_DSL_CEP_COUNT(ISerializationContext context, DSL_CEP_COUNT semanticObject) {
+ if (errorAcceptor != null) {
+ if (transientValues.isValueTransient(semanticObject, SensinactPackage.Literals.DSL_CEP_COUNT__REF) == ValueTransient.YES)
+ errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SensinactPackage.Literals.DSL_CEP_COUNT__REF));
+ if (transientValues.isValueTransient(semanticObject, SensinactPackage.Literals.DSL_CEP_COUNT__WINDOW) == ValueTransient.YES)
+ errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SensinactPackage.Literals.DSL_CEP_COUNT__WINDOW));
+ }
+ SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+ feeder.accept(grammarAccess.getDSL_CEP_COUNTAccess().getRefDSL_REF_CONDITIONParserRuleCall_2_0(), semanticObject.getRef());
+ feeder.accept(grammarAccess.getDSL_CEP_COUNTAccess().getWindowDSL_CEP_DURATIONParserRuleCall_4_0(), semanticObject.getWindow());
+ feeder.finish();
+ }
+
+
+ /**
+ * Contexts:
+ * DSL_CEP_DURATION returns DSL_CEP_DURATION
+ *
+ * Constraint:
+ * (units+=DSL_CEP_DURATION_MIN | units+=DSL_CEP_DURATION_SEC)+
+ */
+ protected void sequence_DSL_CEP_DURATION(ISerializationContext context, DSL_CEP_DURATION semanticObject) {
+ genericSequencer.createSequence(context, semanticObject);
+ }
+
+
+ /**
+ * Contexts:
+ * DSL_CEP_DURATION_MIN returns DSL_CEP_DURATION_MIN
+ *
+ * Constraint:
+ * min=NUMBER
+ */
+ protected void sequence_DSL_CEP_DURATION_MIN(ISerializationContext context, DSL_CEP_DURATION_MIN semanticObject) {
+ if (errorAcceptor != null) {
+ if (transientValues.isValueTransient(semanticObject, SensinactPackage.Literals.DSL_CEP_DURATION_MIN__MIN) == ValueTransient.YES)
+ errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SensinactPackage.Literals.DSL_CEP_DURATION_MIN__MIN));
+ }
+ SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+ feeder.accept(grammarAccess.getDSL_CEP_DURATION_MINAccess().getMinNUMBERParserRuleCall_0_0(), semanticObject.getMin());
+ feeder.finish();
+ }
+
+
+ /**
+ * Contexts:
+ * DSL_CEP_DURATION_SEC returns DSL_CEP_DURATION_SEC
+ *
+ * Constraint:
+ * sec=NUMBER
+ */
+ protected void sequence_DSL_CEP_DURATION_SEC(ISerializationContext context, DSL_CEP_DURATION_SEC semanticObject) {
+ if (errorAcceptor != null) {
+ if (transientValues.isValueTransient(semanticObject, SensinactPackage.Literals.DSL_CEP_DURATION_SEC__SEC) == ValueTransient.YES)
+ errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SensinactPackage.Literals.DSL_CEP_DURATION_SEC__SEC));
+ }
+ SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+ feeder.accept(grammarAccess.getDSL_CEP_DURATION_SECAccess().getSecNUMBERParserRuleCall_0_0(), semanticObject.getSec());
+ feeder.finish();
+ }
+
+
+ /**
+ * Contexts:
+ * DSL_CEP_MAX returns DSL_CEP_MAX
+ *
+ * Constraint:
+ * (ref=DSL_REF_CONDITION window=DSL_CEP_DURATION)
+ */
+ protected void sequence_DSL_CEP_MAX(ISerializationContext context, DSL_CEP_MAX semanticObject) {
+ if (errorAcceptor != null) {
+ if (transientValues.isValueTransient(semanticObject, SensinactPackage.Literals.DSL_CEP_MAX__REF) == ValueTransient.YES)
+ errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SensinactPackage.Literals.DSL_CEP_MAX__REF));
+ if (transientValues.isValueTransient(semanticObject, SensinactPackage.Literals.DSL_CEP_MAX__WINDOW) == ValueTransient.YES)
+ errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SensinactPackage.Literals.DSL_CEP_MAX__WINDOW));
+ }
+ SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+ feeder.accept(grammarAccess.getDSL_CEP_MAXAccess().getRefDSL_REF_CONDITIONParserRuleCall_2_0(), semanticObject.getRef());
+ feeder.accept(grammarAccess.getDSL_CEP_MAXAccess().getWindowDSL_CEP_DURATIONParserRuleCall_4_0(), semanticObject.getWindow());
+ feeder.finish();
+ }
+
+
+ /**
+ * Contexts:
+ * DSL_CEP_MIN returns DSL_CEP_MIN
+ *
+ * Constraint:
+ * (ref=DSL_REF_CONDITION window=DSL_CEP_DURATION)
+ */
+ protected void sequence_DSL_CEP_MIN(ISerializationContext context, DSL_CEP_MIN semanticObject) {
+ if (errorAcceptor != null) {
+ if (transientValues.isValueTransient(semanticObject, SensinactPackage.Literals.DSL_CEP_MIN__REF) == ValueTransient.YES)
+ errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SensinactPackage.Literals.DSL_CEP_MIN__REF));
+ if (transientValues.isValueTransient(semanticObject, SensinactPackage.Literals.DSL_CEP_MIN__WINDOW) == ValueTransient.YES)
+ errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SensinactPackage.Literals.DSL_CEP_MIN__WINDOW));
+ }
+ SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+ feeder.accept(grammarAccess.getDSL_CEP_MINAccess().getRefDSL_REF_CONDITIONParserRuleCall_2_0(), semanticObject.getRef());
+ feeder.accept(grammarAccess.getDSL_CEP_MINAccess().getWindowDSL_CEP_DURATIONParserRuleCall_4_0(), semanticObject.getWindow());
+ feeder.finish();
+ }
+
+
+ /**
+ * Contexts:
+ * DSL_REF returns DSL_CEP_STATEMENT
+ * DSL_CEP_STATEMENT returns DSL_CEP_STATEMENT
+ *
+ * Constraint:
+ * (
+ * name=ID
+ * (
+ * operation=DSL_CEP_AFTER |
+ * operation=DSL_CEP_BEFORE |
+ * operation=DSL_CEP_COINCIDE |
+ * operation=DSL_CEP_MIN |
+ * operation=DSL_CEP_MAX |
+ * operation=DSL_CEP_AVG |
+ * operation=DSL_CEP_SUM |
+ * operation=DSL_CEP_COUNT
+ * )
+ * )
+ */
+ protected void sequence_DSL_CEP_STATEMENT(ISerializationContext context, DSL_CEP_STATEMENT semanticObject) {
+ genericSequencer.createSequence(context, semanticObject);
+ }
+
+
+ /**
+ * Contexts:
+ * DSL_CEP_SUM returns DSL_CEP_SUM
+ *
+ * Constraint:
+ * (ref=DSL_REF_CONDITION window=DSL_CEP_DURATION)
+ */
+ protected void sequence_DSL_CEP_SUM(ISerializationContext context, DSL_CEP_SUM semanticObject) {
+ if (errorAcceptor != null) {
+ if (transientValues.isValueTransient(semanticObject, SensinactPackage.Literals.DSL_CEP_SUM__REF) == ValueTransient.YES)
+ errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SensinactPackage.Literals.DSL_CEP_SUM__REF));
+ if (transientValues.isValueTransient(semanticObject, SensinactPackage.Literals.DSL_CEP_SUM__WINDOW) == ValueTransient.YES)
+ errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SensinactPackage.Literals.DSL_CEP_SUM__WINDOW));
+ }
+ SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+ feeder.accept(grammarAccess.getDSL_CEP_SUMAccess().getRefDSL_REF_CONDITIONParserRuleCall_2_0(), semanticObject.getRef());
+ feeder.accept(grammarAccess.getDSL_CEP_SUMAccess().getWindowDSL_CEP_DURATIONParserRuleCall_4_0(), semanticObject.getWindow());
+ feeder.finish();
+ }
+
+
+ /**
+ * Contexts:
+ * DSL_ECA_STATEMENT returns DSL_ECA_STATEMENT
+ *
+ * Constraint:
+ * (ifdo=DSL_IfDo elseIfdo+=DSL_ElseIfDo* elsedo=DSL_ElseDo?)
+ */
+ protected void sequence_DSL_ECA_STATEMENT(ISerializationContext context, DSL_ECA_STATEMENT semanticObject) {
+ genericSequencer.createSequence(context, semanticObject);
+ }
+
+
+ /**
+ * Contexts:
+ * DSL_ElseDo returns DSL_ElseDo
+ *
+ * Constraint:
+ * actions=DSL_ListActions
+ */
+ protected void sequence_DSL_ElseDo(ISerializationContext context, DSL_ElseDo semanticObject) {
+ if (errorAcceptor != null) {
+ if (transientValues.isValueTransient(semanticObject, SensinactPackage.Literals.DSL_ELSE_DO__ACTIONS) == ValueTransient.YES)
+ errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SensinactPackage.Literals.DSL_ELSE_DO__ACTIONS));
+ }
+ SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+ feeder.accept(grammarAccess.getDSL_ElseDoAccess().getActionsDSL_ListActionsParserRuleCall_1_0(), semanticObject.getActions());
+ feeder.finish();
+ }
+
+
+ /**
+ * Contexts:
+ * DSL_ElseIfDo returns DSL_ElseIfDo
+ *
+ * Constraint:
+ * (condition=DSL_Expression_Or actions=DSL_ListActions)
+ */
+ protected void sequence_DSL_ElseIfDo(ISerializationContext context, DSL_ElseIfDo semanticObject) {
+ if (errorAcceptor != null) {
+ if (transientValues.isValueTransient(semanticObject, SensinactPackage.Literals.DSL_ELSE_IF_DO__CONDITION) == ValueTransient.YES)
+ errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SensinactPackage.Literals.DSL_ELSE_IF_DO__CONDITION));
+ if (transientValues.isValueTransient(semanticObject, SensinactPackage.Literals.DSL_ELSE_IF_DO__ACTIONS) == ValueTransient.YES)
+ errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SensinactPackage.Literals.DSL_ELSE_IF_DO__ACTIONS));
+ }
+ SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+ feeder.accept(grammarAccess.getDSL_ElseIfDoAccess().getConditionDSL_Expression_OrParserRuleCall_1_0(), semanticObject.getCondition());
+ feeder.accept(grammarAccess.getDSL_ElseIfDoAccess().getActionsDSL_ListActionsParserRuleCall_3_0(), semanticObject.getActions());
+ feeder.finish();
+ }
+
+
+ /**
+ * Contexts:
+ * DSL_Expression_Or returns DSL_Expression_And
+ * DSL_Expression_Or.DSL_Expression_Or_1_1 returns DSL_Expression_And
+ * DSL_Expression_And returns DSL_Expression_And
+ * DSL_Expression_And.DSL_Expression_And_1_1 returns DSL_Expression_And
+ * DSL_Expression_DiffEqual returns DSL_Expression_And
+ * DSL_Expression_DiffEqual.DSL_Expression_Diff_1_0_1 returns DSL_Expression_And
+ * DSL_Expression_DiffEqual.DSL_Expression_Equal_1_1_1 returns DSL_Expression_And
+ * DSL_Expression_Compare returns DSL_Expression_And
+ * DSL_Expression_Compare.DSL_Expression_Larger_1_0_1 returns DSL_Expression_And
+ * DSL_Expression_Compare.DSL_Expression_Larger_Equal_1_1_1 returns DSL_Expression_And
+ * DSL_Expression_Compare.DSL_Expression_Smaller_1_2_1 returns DSL_Expression_And
+ * DSL_Expression_Compare.DSL_Expression_Smaller_Equal_1_3_1 returns DSL_Expression_And
+ * DSL_Expression_PlusMinus returns DSL_Expression_And
+ * DSL_Expression_PlusMinus.DSL_Expression_Plus_1_0_1 returns DSL_Expression_And
+ * DSL_Expression_PlusMinus.DSL_Expression_Minus_1_1_1 returns DSL_Expression_And
+ * DSL_Expression_MultiplicationDivision returns DSL_Expression_And
+ * DSL_Expression_MultiplicationDivision.DSL_Expression_Multiplication_1_0_1 returns DSL_Expression_And
+ * DSL_Expression_MultiplicationDivision.DSL_Expression_Division_1_1_1 returns DSL_Expression_And
+ * DSL_Expression_MultiplicationDivision.DSL_Expression_Modulo_1_2_1 returns DSL_Expression_And
+ * DSL_Expression_Unary returns DSL_Expression_And
+ *
+ * Constraint:
+ * (left=DSL_Expression_And_DSL_Expression_And_1_1 right=DSL_Expression_DiffEqual)
+ */
+ protected void sequence_DSL_Expression_And(ISerializationContext context, DSL_Expression_And semanticObject) {
+ if (errorAcceptor != null) {
+ if (transientValues.isValueTransient(semanticObject, SensinactPackage.Literals.DSL_EXPRESSION_AND__LEFT) == ValueTransient.YES)
+ errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SensinactPackage.Literals.DSL_EXPRESSION_AND__LEFT));
+ if (transientValues.isValueTransient(semanticObject, SensinactPackage.Literals.DSL_EXPRESSION_AND__RIGHT) == ValueTransient.YES)
+ errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SensinactPackage.Literals.DSL_EXPRESSION_AND__RIGHT));
+ }
+ SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+ feeder.accept(grammarAccess.getDSL_Expression_AndAccess().getDSL_Expression_AndLeftAction_1_1(), semanticObject.getLeft());
+ feeder.accept(grammarAccess.getDSL_Expression_AndAccess().getRightDSL_Expression_DiffEqualParserRuleCall_1_2_0(), semanticObject.getRight());
+ feeder.finish();
+ }
+
+
+ /**
+ * Contexts:
+ * DSL_Expression_Or returns DSL_Expression_Larger
+ * DSL_Expression_Or.DSL_Expression_Or_1_1 returns DSL_Expression_Larger
+ * DSL_Expression_And returns DSL_Expression_Larger
+ * DSL_Expression_And.DSL_Expression_And_1_1 returns DSL_Expression_Larger
+ * DSL_Expression_DiffEqual returns DSL_Expression_Larger
+ * DSL_Expression_DiffEqual.DSL_Expression_Diff_1_0_1 returns DSL_Expression_Larger
+ * DSL_Expression_DiffEqual.DSL_Expression_Equal_1_1_1 returns DSL_Expression_Larger
+ * DSL_Expression_Compare returns DSL_Expression_Larger
+ * DSL_Expression_Compare.DSL_Expression_Larger_1_0_1 returns DSL_Expression_Larger
+ * DSL_Expression_Compare.DSL_Expression_Larger_Equal_1_1_1 returns DSL_Expression_Larger
+ * DSL_Expression_Compare.DSL_Expression_Smaller_1_2_1 returns DSL_Expression_Larger
+ * DSL_Expression_Compare.DSL_Expression_Smaller_Equal_1_3_1 returns DSL_Expression_Larger
+ * DSL_Expression_PlusMinus returns DSL_Expression_Larger
+ * DSL_Expression_PlusMinus.DSL_Expression_Plus_1_0_1 returns DSL_Expression_Larger
+ * DSL_Expression_PlusMinus.DSL_Expression_Minus_1_1_1 returns DSL_Expression_Larger
+ * DSL_Expression_MultiplicationDivision returns DSL_Expression_Larger
+ * DSL_Expression_MultiplicationDivision.DSL_Expression_Multiplication_1_0_1 returns DSL_Expression_Larger
+ * DSL_Expression_MultiplicationDivision.DSL_Expression_Division_1_1_1 returns DSL_Expression_Larger
+ * DSL_Expression_MultiplicationDivision.DSL_Expression_Modulo_1_2_1 returns DSL_Expression_Larger
+ * DSL_Expression_Unary returns DSL_Expression_Larger
+ *
+ * Constraint:
+ * (left=DSL_Expression_Compare_DSL_Expression_Larger_1_0_1 right=DSL_Expression_PlusMinus)
+ */
+ protected void sequence_DSL_Expression_Compare(ISerializationContext context, DSL_Expression_Larger semanticObject) {
+ if (errorAcceptor != null) {
+ if (transientValues.isValueTransient(semanticObject, SensinactPackage.Literals.DSL_EXPRESSION_LARGER__LEFT) == ValueTransient.YES)
+ errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SensinactPackage.Literals.DSL_EXPRESSION_LARGER__LEFT));
+ if (transientValues.isValueTransient(semanticObject, SensinactPackage.Literals.DSL_EXPRESSION_LARGER__RIGHT) == ValueTransient.YES)
+ errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SensinactPackage.Literals.DSL_EXPRESSION_LARGER__RIGHT));
+ }
+ SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+ feeder.accept(grammarAccess.getDSL_Expression_CompareAccess().getDSL_Expression_LargerLeftAction_1_0_1(), semanticObject.getLeft());
+ feeder.accept(grammarAccess.getDSL_Expression_CompareAccess().getRightDSL_Expression_PlusMinusParserRuleCall_1_0_2_0(), semanticObject.getRight());
+ feeder.finish();
+ }
+
+
+ /**
+ * Contexts:
+ * DSL_Expression_Or returns DSL_Expression_Larger_Equal
+ * DSL_Expression_Or.DSL_Expression_Or_1_1 returns DSL_Expression_Larger_Equal
+ * DSL_Expression_And returns DSL_Expression_Larger_Equal
+ * DSL_Expression_And.DSL_Expression_And_1_1 returns DSL_Expression_Larger_Equal
+ * DSL_Expression_DiffEqual returns DSL_Expression_Larger_Equal
+ * DSL_Expression_DiffEqual.DSL_Expression_Diff_1_0_1 returns DSL_Expression_Larger_Equal
+ * DSL_Expression_DiffEqual.DSL_Expression_Equal_1_1_1 returns DSL_Expression_Larger_Equal
+ * DSL_Expression_Compare returns DSL_Expression_Larger_Equal
+ * DSL_Expression_Compare.DSL_Expression_Larger_1_0_1 returns DSL_Expression_Larger_Equal
+ * DSL_Expression_Compare.DSL_Expression_Larger_Equal_1_1_1 returns DSL_Expression_Larger_Equal
+ * DSL_Expression_Compare.DSL_Expression_Smaller_1_2_1 returns DSL_Expression_Larger_Equal
+ * DSL_Expression_Compare.DSL_Expression_Smaller_Equal_1_3_1 returns DSL_Expression_Larger_Equal
+ * DSL_Expression_PlusMinus returns DSL_Expression_Larger_Equal
+ * DSL_Expression_PlusMinus.DSL_Expression_Plus_1_0_1 returns DSL_Expression_Larger_Equal
+ * DSL_Expression_PlusMinus.DSL_Expression_Minus_1_1_1 returns DSL_Expression_Larger_Equal
+ * DSL_Expression_MultiplicationDivision returns DSL_Expression_Larger_Equal
+ * DSL_Expression_MultiplicationDivision.DSL_Expression_Multiplication_1_0_1 returns DSL_Expression_Larger_Equal
+ * DSL_Expression_MultiplicationDivision.DSL_Expression_Division_1_1_1 returns DSL_Expression_Larger_Equal
+ * DSL_Expression_MultiplicationDivision.DSL_Expression_Modulo_1_2_1 returns DSL_Expression_Larger_Equal
+ * DSL_Expression_Unary returns DSL_Expression_Larger_Equal
+ *
+ * Constraint:
+ * (left=DSL_Expression_Compare_DSL_Expression_Larger_Equal_1_1_1 right=DSL_Expression_PlusMinus)
+ */
+ protected void sequence_DSL_Expression_Compare(ISerializationContext context, DSL_Expression_Larger_Equal semanticObject) {
+ if (errorAcceptor != null) {
+ if (transientValues.isValueTransient(semanticObject, SensinactPackage.Literals.DSL_EXPRESSION_LARGER_EQUAL__LEFT) == ValueTransient.YES)
+ errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SensinactPackage.Literals.DSL_EXPRESSION_LARGER_EQUAL__LEFT));
+ if (transientValues.isValueTransient(semanticObject, SensinactPackage.Literals.DSL_EXPRESSION_LARGER_EQUAL__RIGHT) == ValueTransient.YES)
+ errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SensinactPackage.Literals.DSL_EXPRESSION_LARGER_EQUAL__RIGHT));
+ }
+ SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+ feeder.accept(grammarAccess.getDSL_Expression_CompareAccess().getDSL_Expression_Larger_EqualLeftAction_1_1_1(), semanticObject.getLeft());
+ feeder.accept(grammarAccess.getDSL_Expression_CompareAccess().getRightDSL_Expression_PlusMinusParserRuleCall_1_1_2_0(), semanticObject.getRight());
+ feeder.finish();
+ }
+
+
+ /**
+ * Contexts:
+ * DSL_Expression_Or returns DSL_Expression_Smaller
+ * DSL_Expression_Or.DSL_Expression_Or_1_1 returns DSL_Expression_Smaller
+ * DSL_Expression_And returns DSL_Expression_Smaller
+ * DSL_Expression_And.DSL_Expression_And_1_1 returns DSL_Expression_Smaller
+ * DSL_Expression_DiffEqual returns DSL_Expression_Smaller
+ * DSL_Expression_DiffEqual.DSL_Expression_Diff_1_0_1 returns DSL_Expression_Smaller
+ * DSL_Expression_DiffEqual.DSL_Expression_Equal_1_1_1 returns DSL_Expression_Smaller
+ * DSL_Expression_Compare returns DSL_Expression_Smaller
+ * DSL_Expression_Compare.DSL_Expression_Larger_1_0_1 returns DSL_Expression_Smaller
+ * DSL_Expression_Compare.DSL_Expression_Larger_Equal_1_1_1 returns DSL_Expression_Smaller
+ * DSL_Expression_Compare.DSL_Expression_Smaller_1_2_1 returns DSL_Expression_Smaller
+ * DSL_Expression_Compare.DSL_Expression_Smaller_Equal_1_3_1 returns DSL_Expression_Smaller
+ * DSL_Expression_PlusMinus returns DSL_Expression_Smaller
+ * DSL_Expression_PlusMinus.DSL_Expression_Plus_1_0_1 returns DSL_Expression_Smaller
+ * DSL_Expression_PlusMinus.DSL_Expression_Minus_1_1_1 returns DSL_Expression_Smaller
+ * DSL_Expression_MultiplicationDivision returns DSL_Expression_Smaller
+ * DSL_Expression_MultiplicationDivision.DSL_Expression_Multiplication_1_0_1 returns DSL_Expression_Smaller
+ * DSL_Expression_MultiplicationDivision.DSL_Expression_Division_1_1_1 returns DSL_Expression_Smaller
+ * DSL_Expression_MultiplicationDivision.DSL_Expression_Modulo_1_2_1 returns DSL_Expression_Smaller
+ * DSL_Expression_Unary returns DSL_Expression_Smaller
+ *
+ * Constraint:
+ * (left=DSL_Expression_Compare_DSL_Expression_Smaller_1_2_1 right=DSL_Expression_PlusMinus)
+ */
+ protected void sequence_DSL_Expression_Compare(ISerializationContext context, DSL_Expression_Smaller semanticObject) {
+ if (errorAcceptor != null) {
+ if (transientValues.isValueTransient(semanticObject, SensinactPackage.Literals.DSL_EXPRESSION_SMALLER__LEFT) == ValueTransient.YES)
+ errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SensinactPackage.Literals.DSL_EXPRESSION_SMALLER__LEFT));
+ if (transientValues.isValueTransient(semanticObject, SensinactPackage.Literals.DSL_EXPRESSION_SMALLER__RIGHT) == ValueTransient.YES)
+ errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SensinactPackage.Literals.DSL_EXPRESSION_SMALLER__RIGHT));
+ }
+ SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+ feeder.accept(grammarAccess.getDSL_Expression_CompareAccess().getDSL_Expression_SmallerLeftAction_1_2_1(), semanticObject.getLeft());
+ feeder.accept(grammarAccess.getDSL_Expression_CompareAccess().getRightDSL_Expression_PlusMinusParserRuleCall_1_2_2_0(), semanticObject.getRight());
+ feeder.finish();
+ }
+
+
+ /**
+ * Contexts:
+ * DSL_Expression_Or returns DSL_Expression_Smaller_Equal
+ * DSL_Expression_Or.DSL_Expression_Or_1_1 returns DSL_Expression_Smaller_Equal
+ * DSL_Expression_And returns DSL_Expression_Smaller_Equal
+ * DSL_Expression_And.DSL_Expression_And_1_1 returns DSL_Expression_Smaller_Equal
+ * DSL_Expression_DiffEqual returns DSL_Expression_Smaller_Equal
+ * DSL_Expression_DiffEqual.DSL_Expression_Diff_1_0_1 returns DSL_Expression_Smaller_Equal
+ * DSL_Expression_DiffEqual.DSL_Expression_Equal_1_1_1 returns DSL_Expression_Smaller_Equal
+ * DSL_Expression_Compare returns DSL_Expression_Smaller_Equal
+ * DSL_Expression_Compare.DSL_Expression_Larger_1_0_1 returns DSL_Expression_Smaller_Equal
+ * DSL_Expression_Compare.DSL_Expression_Larger_Equal_1_1_1 returns DSL_Expression_Smaller_Equal
+ * DSL_Expression_Compare.DSL_Expression_Smaller_1_2_1 returns DSL_Expression_Smaller_Equal
+ * DSL_Expression_Compare.DSL_Expression_Smaller_Equal_1_3_1 returns DSL_Expression_Smaller_Equal
+ * DSL_Expression_PlusMinus returns DSL_Expression_Smaller_Equal
+ * DSL_Expression_PlusMinus.DSL_Expression_Plus_1_0_1 returns DSL_Expression_Smaller_Equal
+ * DSL_Expression_PlusMinus.DSL_Expression_Minus_1_1_1 returns DSL_Expression_Smaller_Equal
+ * DSL_Expression_MultiplicationDivision returns DSL_Expression_Smaller_Equal
+ * DSL_Expression_MultiplicationDivision.DSL_Expression_Multiplication_1_0_1 returns DSL_Expression_Smaller_Equal
+ * DSL_Expression_MultiplicationDivision.DSL_Expression_Division_1_1_1 returns DSL_Expression_Smaller_Equal
+ * DSL_Expression_MultiplicationDivision.DSL_Expression_Modulo_1_2_1 returns DSL_Expression_Smaller_Equal
+ * DSL_Expression_Unary returns DSL_Expression_Smaller_Equal
+ *
+ * Constraint:
+ * (left=DSL_Expression_Compare_DSL_Expression_Smaller_Equal_1_3_1 right=DSL_Expression_PlusMinus)
+ */
+ protected void sequence_DSL_Expression_Compare(ISerializationContext context, DSL_Expression_Smaller_Equal semanticObject) {
+ if (errorAcceptor != null) {
+ if (transientValues.isValueTransient(semanticObject, SensinactPackage.Literals.DSL_EXPRESSION_SMALLER_EQUAL__LEFT) == ValueTransient.YES)
+ errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SensinactPackage.Literals.DSL_EXPRESSION_SMALLER_EQUAL__LEFT));
+ if (transientValues.isValueTransient(semanticObject, SensinactPackage.Literals.DSL_EXPRESSION_SMALLER_EQUAL__RIGHT) == ValueTransient.YES)
+ errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SensinactPackage.Literals.DSL_EXPRESSION_SMALLER_EQUAL__RIGHT));
+ }
+ SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+ feeder.accept(grammarAccess.getDSL_Expression_CompareAccess().getDSL_Expression_Smaller_EqualLeftAction_1_3_1(), semanticObject.getLeft());
+ feeder.accept(grammarAccess.getDSL_Expression_CompareAccess().getRightDSL_Expression_PlusMinusParserRuleCall_1_3_2_0(), semanticObject.getRight());
+ feeder.finish();
+ }
+
+
+ /**
+ * Contexts:
+ * DSL_Expression_Or returns DSL_Expression_Diff
+ * DSL_Expression_Or.DSL_Expression_Or_1_1 returns DSL_Expression_Diff
+ * DSL_Expression_And returns DSL_Expression_Diff
+ * DSL_Expression_And.DSL_Expression_And_1_1 returns DSL_Expression_Diff
+ * DSL_Expression_DiffEqual returns DSL_Expression_Diff
+ * DSL_Expression_DiffEqual.DSL_Expression_Diff_1_0_1 returns DSL_Expression_Diff
+ * DSL_Expression_DiffEqual.DSL_Expression_Equal_1_1_1 returns DSL_Expression_Diff
+ * DSL_Expression_Compare returns DSL_Expression_Diff
+ * DSL_Expression_Compare.DSL_Expression_Larger_1_0_1 returns DSL_Expression_Diff
+ * DSL_Expression_Compare.DSL_Expression_Larger_Equal_1_1_1 returns DSL_Expression_Diff
+ * DSL_Expression_Compare.DSL_Expression_Smaller_1_2_1 returns DSL_Expression_Diff
+ * DSL_Expression_Compare.DSL_Expression_Smaller_Equal_1_3_1 returns DSL_Expression_Diff
+ * DSL_Expression_PlusMinus returns DSL_Expression_Diff
+ * DSL_Expression_PlusMinus.DSL_Expression_Plus_1_0_1 returns DSL_Expression_Diff
+ * DSL_Expression_PlusMinus.DSL_Expression_Minus_1_1_1 returns DSL_Expression_Diff
+ * DSL_Expression_MultiplicationDivision returns DSL_Expression_Diff
+ * DSL_Expression_MultiplicationDivision.DSL_Expression_Multiplication_1_0_1 returns DSL_Expression_Diff
+ * DSL_Expression_MultiplicationDivision.DSL_Expression_Division_1_1_1 returns DSL_Expression_Diff
+ * DSL_Expression_MultiplicationDivision.DSL_Expression_Modulo_1_2_1 returns DSL_Expression_Diff
+ * DSL_Expression_Unary returns DSL_Expression_Diff
+ *
+ * Constraint:
+ * (left=DSL_Expression_DiffEqual_DSL_Expression_Diff_1_0_1 right=DSL_Expression_Compare)
+ */
+ protected void sequence_DSL_Expression_DiffEqual(ISerializationContext context, DSL_Expression_Diff semanticObject) {
+ if (errorAcceptor != null) {
+ if (transientValues.isValueTransient(semanticObject, SensinactPackage.Literals.DSL_EXPRESSION_DIFF__LEFT) == ValueTransient.YES)
+ errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SensinactPackage.Literals.DSL_EXPRESSION_DIFF__LEFT));
+ if (transientValues.isValueTransient(semanticObject, SensinactPackage.Literals.DSL_EXPRESSION_DIFF__RIGHT) == ValueTransient.YES)
+ errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SensinactPackage.Literals.DSL_EXPRESSION_DIFF__RIGHT));
+ }
+ SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+ feeder.accept(grammarAccess.getDSL_Expression_DiffEqualAccess().getDSL_Expression_DiffLeftAction_1_0_1(), semanticObject.getLeft());
+ feeder.accept(grammarAccess.getDSL_Expression_DiffEqualAccess().getRightDSL_Expression_CompareParserRuleCall_1_0_2_0(), semanticObject.getRight());
+ feeder.finish();
+ }
+
+
+ /**
+ * Contexts:
+ * DSL_Expression_Or returns DSL_Expression_Equal
+ * DSL_Expression_Or.DSL_Expression_Or_1_1 returns DSL_Expression_Equal
+ * DSL_Expression_And returns DSL_Expression_Equal
+ * DSL_Expression_And.DSL_Expression_And_1_1 returns DSL_Expression_Equal
+ * DSL_Expression_DiffEqual returns DSL_Expression_Equal
+ * DSL_Expression_DiffEqual.DSL_Expression_Diff_1_0_1 returns DSL_Expression_Equal
+ * DSL_Expression_DiffEqual.DSL_Expression_Equal_1_1_1 returns DSL_Expression_Equal
+ * DSL_Expression_Compare returns DSL_Expression_Equal
+ * DSL_Expression_Compare.DSL_Expression_Larger_1_0_1 returns DSL_Expression_Equal
+ * DSL_Expression_Compare.DSL_Expression_Larger_Equal_1_1_1 returns DSL_Expression_Equal
+ * DSL_Expression_Compare.DSL_Expression_Smaller_1_2_1 returns DSL_Expression_Equal
+ * DSL_Expression_Compare.DSL_Expression_Smaller_Equal_1_3_1 returns DSL_Expression_Equal
+ * DSL_Expression_PlusMinus returns DSL_Expression_Equal
+ * DSL_Expression_PlusMinus.DSL_Expression_Plus_1_0_1 returns DSL_Expression_Equal
+ * DSL_Expression_PlusMinus.DSL_Expression_Minus_1_1_1 returns DSL_Expression_Equal
+ * DSL_Expression_MultiplicationDivision returns DSL_Expression_Equal
+ * DSL_Expression_MultiplicationDivision.DSL_Expression_Multiplication_1_0_1 returns DSL_Expression_Equal
+ * DSL_Expression_MultiplicationDivision.DSL_Expression_Division_1_1_1 returns DSL_Expression_Equal
+ * DSL_Expression_MultiplicationDivision.DSL_Expression_Modulo_1_2_1 returns DSL_Expression_Equal
+ * DSL_Expression_Unary returns DSL_Expression_Equal
+ *
+ * Constraint:
+ * (left=DSL_Expression_DiffEqual_DSL_Expression_Equal_1_1_1 right=DSL_Expression_Compare)
+ */
+ protected void sequence_DSL_Expression_DiffEqual(ISerializationContext context, DSL_Expression_Equal semanticObject) {
+ if (errorAcceptor != null) {
+ if (transientValues.isValueTransient(semanticObject, SensinactPackage.Literals.DSL_EXPRESSION_EQUAL__LEFT) == ValueTransient.YES)
+ errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SensinactPackage.Literals.DSL_EXPRESSION_EQUAL__LEFT));
+ if (transientValues.isValueTransient(semanticObject, SensinactPackage.Literals.DSL_EXPRESSION_EQUAL__RIGHT) == ValueTransient.YES)
+ errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SensinactPackage.Literals.DSL_EXPRESSION_EQUAL__RIGHT));
+ }
+ SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+ feeder.accept(grammarAccess.getDSL_Expression_DiffEqualAccess().getDSL_Expression_EqualLeftAction_1_1_1(), semanticObject.getLeft());
+ feeder.accept(grammarAccess.getDSL_Expression_DiffEqualAccess().getRightDSL_Expression_CompareParserRuleCall_1_1_2_0(), semanticObject.getRight());
+ feeder.finish();
+ }
+
+
+ /**
+ * Contexts:
+ * DSL_Expression_Or returns DSL_Expression_Division
+ * DSL_Expression_Or.DSL_Expression_Or_1_1 returns DSL_Expression_Division
+ * DSL_Expression_And returns DSL_Expression_Division
+ * DSL_Expression_And.DSL_Expression_And_1_1 returns DSL_Expression_Division
+ * DSL_Expression_DiffEqual returns DSL_Expression_Division
+ * DSL_Expression_DiffEqual.DSL_Expression_Diff_1_0_1 returns DSL_Expression_Division
+ * DSL_Expression_DiffEqual.DSL_Expression_Equal_1_1_1 returns DSL_Expression_Division
+ * DSL_Expression_Compare returns DSL_Expression_Division
+ * DSL_Expression_Compare.DSL_Expression_Larger_1_0_1 returns DSL_Expression_Division
+ * DSL_Expression_Compare.DSL_Expression_Larger_Equal_1_1_1 returns DSL_Expression_Division
+ * DSL_Expression_Compare.DSL_Expression_Smaller_1_2_1 returns DSL_Expression_Division
+ * DSL_Expression_Compare.DSL_Expression_Smaller_Equal_1_3_1 returns DSL_Expression_Division
+ * DSL_Expression_PlusMinus returns DSL_Expression_Division
+ * DSL_Expression_PlusMinus.DSL_Expression_Plus_1_0_1 returns DSL_Expression_Division
+ * DSL_Expression_PlusMinus.DSL_Expression_Minus_1_1_1 returns DSL_Expression_Division
+ * DSL_Expression_MultiplicationDivision returns DSL_Expression_Division
+ * DSL_Expression_MultiplicationDivision.DSL_Expression_Multiplication_1_0_1 returns DSL_Expression_Division
+ * DSL_Expression_MultiplicationDivision.DSL_Expression_Division_1_1_1 returns DSL_Expression_Division
+ * DSL_Expression_MultiplicationDivision.DSL_Expression_Modulo_1_2_1 returns DSL_Expression_Division
+ * DSL_Expression_Unary returns DSL_Expression_Division
+ *
+ * Constraint:
+ * (left=DSL_Expression_MultiplicationDivision_DSL_Expression_Division_1_1_1 right=DSL_Expression_Unary)
+ */
+ protected void sequence_DSL_Expression_MultiplicationDivision(ISerializationContext context, DSL_Expression_Division semanticObject) {
+ if (errorAcceptor != null) {
+ if (transientValues.isValueTransient(semanticObject, SensinactPackage.Literals.DSL_EXPRESSION_DIVISION__LEFT) == ValueTransient.YES)
+ errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SensinactPackage.Literals.DSL_EXPRESSION_DIVISION__LEFT));
+ if (transientValues.isValueTransient(semanticObject, SensinactPackage.Literals.DSL_EXPRESSION_DIVISION__RIGHT) == ValueTransient.YES)
+ errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SensinactPackage.Literals.DSL_EXPRESSION_DIVISION__RIGHT));
+ }
+ SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+ feeder.accept(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getDSL_Expression_DivisionLeftAction_1_1_1(), semanticObject.getLeft());
+ feeder.accept(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getRightDSL_Expression_UnaryParserRuleCall_1_1_2_0(), semanticObject.getRight());
+ feeder.finish();
+ }
+
+
+ /**
+ * Contexts:
+ * DSL_Expression_Or returns DSL_Expression_Modulo
+ * DSL_Expression_Or.DSL_Expression_Or_1_1 returns DSL_Expression_Modulo
+ * DSL_Expression_And returns DSL_Expression_Modulo
+ * DSL_Expression_And.DSL_Expression_And_1_1 returns DSL_Expression_Modulo
+ * DSL_Expression_DiffEqual returns DSL_Expression_Modulo
+ * DSL_Expression_DiffEqual.DSL_Expression_Diff_1_0_1 returns DSL_Expression_Modulo
+ * DSL_Expression_DiffEqual.DSL_Expression_Equal_1_1_1 returns DSL_Expression_Modulo
+ * DSL_Expression_Compare returns DSL_Expression_Modulo
+ * DSL_Expression_Compare.DSL_Expression_Larger_1_0_1 returns DSL_Expression_Modulo
+ * DSL_Expression_Compare.DSL_Expression_Larger_Equal_1_1_1 returns DSL_Expression_Modulo
+ * DSL_Expression_Compare.DSL_Expression_Smaller_1_2_1 returns DSL_Expression_Modulo
+ * DSL_Expression_Compare.DSL_Expression_Smaller_Equal_1_3_1 returns DSL_Expression_Modulo
+ * DSL_Expression_PlusMinus returns DSL_Expression_Modulo
+ * DSL_Expression_PlusMinus.DSL_Expression_Plus_1_0_1 returns DSL_Expression_Modulo
+ * DSL_Expression_PlusMinus.DSL_Expression_Minus_1_1_1 returns DSL_Expression_Modulo
+ * DSL_Expression_MultiplicationDivision returns DSL_Expression_Modulo
+ * DSL_Expression_MultiplicationDivision.DSL_Expression_Multiplication_1_0_1 returns DSL_Expression_Modulo
+ * DSL_Expression_MultiplicationDivision.DSL_Expression_Division_1_1_1 returns DSL_Expression_Modulo
+ * DSL_Expression_MultiplicationDivision.DSL_Expression_Modulo_1_2_1 returns DSL_Expression_Modulo
+ * DSL_Expression_Unary returns DSL_Expression_Modulo
+ *
+ * Constraint:
+ * (left=DSL_Expression_MultiplicationDivision_DSL_Expression_Modulo_1_2_1 right=DSL_Expression_Unary)
+ */
+ protected void sequence_DSL_Expression_MultiplicationDivision(ISerializationContext context, DSL_Expression_Modulo semanticObject) {
+ if (errorAcceptor != null) {
+ if (transientValues.isValueTransient(semanticObject, SensinactPackage.Literals.DSL_EXPRESSION_MODULO__LEFT) == ValueTransient.YES)
+ errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SensinactPackage.Literals.DSL_EXPRESSION_MODULO__LEFT));
+ if (transientValues.isValueTransient(semanticObject, SensinactPackage.Literals.DSL_EXPRESSION_MODULO__RIGHT) == ValueTransient.YES)
+ errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SensinactPackage.Literals.DSL_EXPRESSION_MODULO__RIGHT));
+ }
+ SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+ feeder.accept(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getDSL_Expression_ModuloLeftAction_1_2_1(), semanticObject.getLeft());
+ feeder.accept(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getRightDSL_Expression_UnaryParserRuleCall_1_2_2_0(), semanticObject.getRight());
+ feeder.finish();
+ }
+
+
+ /**
+ * Contexts:
+ * DSL_Expression_Or returns DSL_Expression_Multiplication
+ * DSL_Expression_Or.DSL_Expression_Or_1_1 returns DSL_Expression_Multiplication
+ * DSL_Expression_And returns DSL_Expression_Multiplication
+ * DSL_Expression_And.DSL_Expression_And_1_1 returns DSL_Expression_Multiplication
+ * DSL_Expression_DiffEqual returns DSL_Expression_Multiplication
+ * DSL_Expression_DiffEqual.DSL_Expression_Diff_1_0_1 returns DSL_Expression_Multiplication
+ * DSL_Expression_DiffEqual.DSL_Expression_Equal_1_1_1 returns DSL_Expression_Multiplication
+ * DSL_Expression_Compare returns DSL_Expression_Multiplication
+ * DSL_Expression_Compare.DSL_Expression_Larger_1_0_1 returns DSL_Expression_Multiplication
+ * DSL_Expression_Compare.DSL_Expression_Larger_Equal_1_1_1 returns DSL_Expression_Multiplication
+ * DSL_Expression_Compare.DSL_Expression_Smaller_1_2_1 returns DSL_Expression_Multiplication
+ * DSL_Expression_Compare.DSL_Expression_Smaller_Equal_1_3_1 returns DSL_Expression_Multiplication
+ * DSL_Expression_PlusMinus returns DSL_Expression_Multiplication
+ * DSL_Expression_PlusMinus.DSL_Expression_Plus_1_0_1 returns DSL_Expression_Multiplication
+ * DSL_Expression_PlusMinus.DSL_Expression_Minus_1_1_1 returns DSL_Expression_Multiplication
+ * DSL_Expression_MultiplicationDivision returns DSL_Expression_Multiplication
+ * DSL_Expression_MultiplicationDivision.DSL_Expression_Multiplication_1_0_1 returns DSL_Expression_Multiplication
+ * DSL_Expression_MultiplicationDivision.DSL_Expression_Division_1_1_1 returns DSL_Expression_Multiplication
+ * DSL_Expression_MultiplicationDivision.DSL_Expression_Modulo_1_2_1 returns DSL_Expression_Multiplication
+ * DSL_Expression_Unary returns DSL_Expression_Multiplication
+ *
+ * Constraint:
+ * (left=DSL_Expression_MultiplicationDivision_DSL_Expression_Multiplication_1_0_1 right=DSL_Expression_Unary)
+ */
+ protected void sequence_DSL_Expression_MultiplicationDivision(ISerializationContext context, DSL_Expression_Multiplication semanticObject) {
+ if (errorAcceptor != null) {
+ if (transientValues.isValueTransient(semanticObject, SensinactPackage.Literals.DSL_EXPRESSION_MULTIPLICATION__LEFT) == ValueTransient.YES)
+ errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SensinactPackage.Literals.DSL_EXPRESSION_MULTIPLICATION__LEFT));
+ if (transientValues.isValueTransient(semanticObject, SensinactPackage.Literals.DSL_EXPRESSION_MULTIPLICATION__RIGHT) == ValueTransient.YES)
+ errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SensinactPackage.Literals.DSL_EXPRESSION_MULTIPLICATION__RIGHT));
+ }
+ SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+ feeder.accept(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getDSL_Expression_MultiplicationLeftAction_1_0_1(), semanticObject.getLeft());
+ feeder.accept(grammarAccess.getDSL_Expression_MultiplicationDivisionAccess().getRightDSL_Expression_UnaryParserRuleCall_1_0_2_0(), semanticObject.getRight());
+ feeder.finish();
+ }
+
+
+ /**
+ * Contexts:
+ * DSL_Expression_Or returns DSL_Expression_Or
+ * DSL_Expression_Or.DSL_Expression_Or_1_1 returns DSL_Expression_Or
+ * DSL_Expression_And returns DSL_Expression_Or
+ * DSL_Expression_And.DSL_Expression_And_1_1 returns DSL_Expression_Or
+ * DSL_Expression_DiffEqual returns DSL_Expression_Or
+ * DSL_Expression_DiffEqual.DSL_Expression_Diff_1_0_1 returns DSL_Expression_Or
+ * DSL_Expression_DiffEqual.DSL_Expression_Equal_1_1_1 returns DSL_Expression_Or
+ * DSL_Expression_Compare returns DSL_Expression_Or
+ * DSL_Expression_Compare.DSL_Expression_Larger_1_0_1 returns DSL_Expression_Or
+ * DSL_Expression_Compare.DSL_Expression_Larger_Equal_1_1_1 returns DSL_Expression_Or
+ * DSL_Expression_Compare.DSL_Expression_Smaller_1_2_1 returns DSL_Expression_Or
+ * DSL_Expression_Compare.DSL_Expression_Smaller_Equal_1_3_1 returns DSL_Expression_Or
+ * DSL_Expression_PlusMinus returns DSL_Expression_Or
+ * DSL_Expression_PlusMinus.DSL_Expression_Plus_1_0_1 returns DSL_Expression_Or
+ * DSL_Expression_PlusMinus.DSL_Expression_Minus_1_1_1 returns DSL_Expression_Or
+ * DSL_Expression_MultiplicationDivision returns DSL_Expression_Or
+ * DSL_Expression_MultiplicationDivision.DSL_Expression_Multiplication_1_0_1 returns DSL_Expression_Or
+ * DSL_Expression_MultiplicationDivision.DSL_Expression_Division_1_1_1 returns DSL_Expression_Or
+ * DSL_Expression_MultiplicationDivision.DSL_Expression_Modulo_1_2_1 returns DSL_Expression_Or
+ * DSL_Expression_Unary returns DSL_Expression_Or
+ *
+ * Constraint:
+ * (left=DSL_Expression_Or_DSL_Expression_Or_1_1 right=DSL_Expression_And)
+ */
+ protected void sequence_DSL_Expression_Or(ISerializationContext context, DSL_Expression_Or semanticObject) {
+ if (errorAcceptor != null) {
+ if (transientValues.isValueTransient(semanticObject, SensinactPackage.Literals.DSL_EXPRESSION_OR__LEFT) == ValueTransient.YES)
+ errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SensinactPackage.Literals.DSL_EXPRESSION_OR__LEFT));
+ if (transientValues.isValueTransient(semanticObject, SensinactPackage.Literals.DSL_EXPRESSION_OR__RIGHT) == ValueTransient.YES)
+ errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SensinactPackage.Literals.DSL_EXPRESSION_OR__RIGHT));
+ }
+ SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+ feeder.accept(grammarAccess.getDSL_Expression_OrAccess().getDSL_Expression_OrLeftAction_1_1(), semanticObject.getLeft());
+ feeder.accept(grammarAccess.getDSL_Expression_OrAccess().getRightDSL_Expression_AndParserRuleCall_1_2_0(), semanticObject.getRight());
+ feeder.finish();
+ }
+
+
+ /**
+ * Contexts:
+ * DSL_Expression_Or returns DSL_Expression_Minus
+ * DSL_Expression_Or.DSL_Expression_Or_1_1 returns DSL_Expression_Minus
+ * DSL_Expression_And returns DSL_Expression_Minus
+ * DSL_Expression_And.DSL_Expression_And_1_1 returns DSL_Expression_Minus
+ * DSL_Expression_DiffEqual returns DSL_Expression_Minus
+ * DSL_Expression_DiffEqual.DSL_Expression_Diff_1_0_1 returns DSL_Expression_Minus
+ * DSL_Expression_DiffEqual.DSL_Expression_Equal_1_1_1 returns DSL_Expression_Minus
+ * DSL_Expression_Compare returns DSL_Expression_Minus
+ * DSL_Expression_Compare.DSL_Expression_Larger_1_0_1 returns DSL_Expression_Minus
+ * DSL_Expression_Compare.DSL_Expression_Larger_Equal_1_1_1 returns DSL_Expression_Minus
+ * DSL_Expression_Compare.DSL_Expression_Smaller_1_2_1 returns DSL_Expression_Minus
+ * DSL_Expression_Compare.DSL_Expression_Smaller_Equal_1_3_1 returns DSL_Expression_Minus
+ * DSL_Expression_PlusMinus returns DSL_Expression_Minus
+ * DSL_Expression_PlusMinus.DSL_Expression_Plus_1_0_1 returns DSL_Expression_Minus
+ * DSL_Expression_PlusMinus.DSL_Expression_Minus_1_1_1 returns DSL_Expression_Minus
+ * DSL_Expression_MultiplicationDivision returns DSL_Expression_Minus
+ * DSL_Expression_MultiplicationDivision.DSL_Expression_Multiplication_1_0_1 returns DSL_Expression_Minus
+ * DSL_Expression_MultiplicationDivision.DSL_Expression_Division_1_1_1 returns DSL_Expression_Minus
+ * DSL_Expression_MultiplicationDivision.DSL_Expression_Modulo_1_2_1 returns DSL_Expression_Minus
+ * DSL_Expression_Unary returns DSL_Expression_Minus
+ *
+ * Constraint:
+ * (left=DSL_Expression_PlusMinus_DSL_Expression_Minus_1_1_1 right=DSL_Expression_MultiplicationDivision)
+ */
+ protected void sequence_DSL_Expression_PlusMinus(ISerializationContext context, DSL_Expression_Minus semanticObject) {
+ if (errorAcceptor != null) {
+ if (transientValues.isValueTransient(semanticObject, SensinactPackage.Literals.DSL_EXPRESSION_MINUS__LEFT) == ValueTransient.YES)
+ errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SensinactPackage.Literals.DSL_EXPRESSION_MINUS__LEFT));
+ if (transientValues.isValueTransient(semanticObject, SensinactPackage.Literals.DSL_EXPRESSION_MINUS__RIGHT) == ValueTransient.YES)
+ errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SensinactPackage.Literals.DSL_EXPRESSION_MINUS__RIGHT));
+ }
+ SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+ feeder.accept(grammarAccess.getDSL_Expression_PlusMinusAccess().getDSL_Expression_MinusLeftAction_1_1_1(), semanticObject.getLeft());
+ feeder.accept(grammarAccess.getDSL_Expression_PlusMinusAccess().getRightDSL_Expression_MultiplicationDivisionParserRuleCall_1_1_2_0(), semanticObject.getRight());
+ feeder.finish();
+ }
+
+
+ /**
+ * Contexts:
+ * DSL_Expression_Or returns DSL_Expression_Plus
+ * DSL_Expression_Or.DSL_Expression_Or_1_1 returns DSL_Expression_Plus
+ * DSL_Expression_And returns DSL_Expression_Plus
+ * DSL_Expression_And.DSL_Expression_And_1_1 returns DSL_Expression_Plus
+ * DSL_Expression_DiffEqual returns DSL_Expression_Plus
+ * DSL_Expression_DiffEqual.DSL_Expression_Diff_1_0_1 returns DSL_Expression_Plus
+ * DSL_Expression_DiffEqual.DSL_Expression_Equal_1_1_1 returns DSL_Expression_Plus
+ * DSL_Expression_Compare returns DSL_Expression_Plus
+ * DSL_Expression_Compare.DSL_Expression_Larger_1_0_1 returns DSL_Expression_Plus
+ * DSL_Expression_Compare.DSL_Expression_Larger_Equal_1_1_1 returns DSL_Expression_Plus
+ * DSL_Expression_Compare.DSL_Expression_Smaller_1_2_1 returns DSL_Expression_Plus
+ * DSL_Expression_Compare.DSL_Expression_Smaller_Equal_1_3_1 returns DSL_Expression_Plus
+ * DSL_Expression_PlusMinus returns DSL_Expression_Plus
+ * DSL_Expression_PlusMinus.DSL_Expression_Plus_1_0_1 returns DSL_Expression_Plus
+ * DSL_Expression_PlusMinus.DSL_Expression_Minus_1_1_1 returns DSL_Expression_Plus
+ * DSL_Expression_MultiplicationDivision returns DSL_Expression_Plus
+ * DSL_Expression_MultiplicationDivision.DSL_Expression_Multiplication_1_0_1 returns DSL_Expression_Plus
+ * DSL_Expression_MultiplicationDivision.DSL_Expression_Division_1_1_1 returns DSL_Expression_Plus
+ * DSL_Expression_MultiplicationDivision.DSL_Expression_Modulo_1_2_1 returns DSL_Expression_Plus
+ * DSL_Expression_Unary returns DSL_Expression_Plus
+ *
+ * Constraint:
+ * (left=DSL_Expression_PlusMinus_DSL_Expression_Plus_1_0_1 right=DSL_Expression_MultiplicationDivision)
+ */
+ protected void sequence_DSL_Expression_PlusMinus(ISerializationContext context, DSL_Expression_Plus semanticObject) {
+ if (errorAcceptor != null) {
+ if (transientValues.isValueTransient(semanticObject, SensinactPackage.Literals.DSL_EXPRESSION_PLUS__LEFT) == ValueTransient.YES)
+ errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SensinactPackage.Literals.DSL_EXPRESSION_PLUS__LEFT));
+ if (transientValues.isValueTransient(semanticObject, SensinactPackage.Literals.DSL_EXPRESSION_PLUS__RIGHT) == ValueTransient.YES)
+ errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SensinactPackage.Literals.DSL_EXPRESSION_PLUS__RIGHT));
+ }
+ SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+ feeder.accept(grammarAccess.getDSL_Expression_PlusMinusAccess().getDSL_Expression_PlusLeftAction_1_0_1(), semanticObject.getLeft());
+ feeder.accept(grammarAccess.getDSL_Expression_PlusMinusAccess().getRightDSL_Expression_MultiplicationDivisionParserRuleCall_1_0_2_0(), semanticObject.getRight());
+ feeder.finish();
+ }
+
+
+ /**
+ * Contexts:
+ * DSL_Expression_Or returns DSL_Expression_Negate
+ * DSL_Expression_Or.DSL_Expression_Or_1_1 returns DSL_Expression_Negate
+ * DSL_Expression_And returns DSL_Expression_Negate
+ * DSL_Expression_And.DSL_Expression_And_1_1 returns DSL_Expression_Negate
+ * DSL_Expression_DiffEqual returns DSL_Expression_Negate
+ * DSL_Expression_DiffEqual.DSL_Expression_Diff_1_0_1 returns DSL_Expression_Negate
+ * DSL_Expression_DiffEqual.DSL_Expression_Equal_1_1_1 returns DSL_Expression_Negate
+ * DSL_Expression_Compare returns DSL_Expression_Negate
+ * DSL_Expression_Compare.DSL_Expression_Larger_1_0_1 returns DSL_Expression_Negate
+ * DSL_Expression_Compare.DSL_Expression_Larger_Equal_1_1_1 returns DSL_Expression_Negate
+ * DSL_Expression_Compare.DSL_Expression_Smaller_1_2_1 returns DSL_Expression_Negate
+ * DSL_Expression_Compare.DSL_Expression_Smaller_Equal_1_3_1 returns DSL_Expression_Negate
+ * DSL_Expression_PlusMinus returns DSL_Expression_Negate
+ * DSL_Expression_PlusMinus.DSL_Expression_Plus_1_0_1 returns DSL_Expression_Negate
+ * DSL_Expression_PlusMinus.DSL_Expression_Minus_1_1_1 returns DSL_Expression_Negate
+ * DSL_Expression_MultiplicationDivision returns DSL_Expression_Negate
+ * DSL_Expression_MultiplicationDivision.DSL_Expression_Multiplication_1_0_1 returns DSL_Expression_Negate
+ * DSL_Expression_MultiplicationDivision.DSL_Expression_Division_1_1_1 returns DSL_Expression_Negate
+ * DSL_Expression_MultiplicationDivision.DSL_Expression_Modulo_1_2_1 returns DSL_Expression_Negate
+ * DSL_Expression_Unary returns DSL_Expression_Negate
+ *
+ * Constraint:
+ * exp=DSL_Expression_Unary
+ */
+ protected void sequence_DSL_Expression_Unary(ISerializationContext context, DSL_Expression_Negate semanticObject) {
+ if (errorAcceptor != null) {
+ if (transientValues.isValueTransient(semanticObject, SensinactPackage.Literals.DSL_EXPRESSION_NEGATE__EXP) == ValueTransient.YES)
+ errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SensinactPackage.Literals.DSL_EXPRESSION_NEGATE__EXP));
+ }
+ SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+ feeder.accept(grammarAccess.getDSL_Expression_UnaryAccess().getExpDSL_Expression_UnaryParserRuleCall_5_2_0(), semanticObject.getExp());
+ feeder.finish();
+ }
+
+
+ /**
+ * Contexts:
+ * DSL_Expression_Or returns DSL_Object_Boolean
+ * DSL_Expression_Or.DSL_Expression_Or_1_1 returns DSL_Object_Boolean
+ * DSL_Expression_And returns DSL_Object_Boolean
+ * DSL_Expression_And.DSL_Expression_And_1_1 returns DSL_Object_Boolean
+ * DSL_Expression_DiffEqual returns DSL_Object_Boolean
+ * DSL_Expression_DiffEqual.DSL_Expression_Diff_1_0_1 returns DSL_Object_Boolean
+ * DSL_Expression_DiffEqual.DSL_Expression_Equal_1_1_1 returns DSL_Object_Boolean
+ * DSL_Expression_Compare returns DSL_Object_Boolean
+ * DSL_Expression_Compare.DSL_Expression_Larger_1_0_1 returns DSL_Object_Boolean
+ * DSL_Expression_Compare.DSL_Expression_Larger_Equal_1_1_1 returns DSL_Object_Boolean
+ * DSL_Expression_Compare.DSL_Expression_Smaller_1_2_1 returns DSL_Object_Boolean
+ * DSL_Expression_Compare.DSL_Expression_Smaller_Equal_1_3_1 returns DSL_Object_Boolean
+ * DSL_Expression_PlusMinus returns DSL_Object_Boolean
+ * DSL_Expression_PlusMinus.DSL_Expression_Plus_1_0_1 returns DSL_Object_Boolean
+ * DSL_Expression_PlusMinus.DSL_Expression_Minus_1_1_1 returns DSL_Object_Boolean
+ * DSL_Expression_MultiplicationDivision returns DSL_Object_Boolean
+ * DSL_Expression_MultiplicationDivision.DSL_Expression_Multiplication_1_0_1 returns DSL_Object_Boolean
+ * DSL_Expression_MultiplicationDivision.DSL_Expression_Division_1_1_1 returns DSL_Object_Boolean
+ * DSL_Expression_MultiplicationDivision.DSL_Expression_Modulo_1_2_1 returns DSL_Object_Boolean
+ * DSL_Expression_Unary returns DSL_Object_Boolean
+ *
+ * Constraint:
+ * value=BOOLEAN
+ */
+ protected void sequence_DSL_Expression_Unary(ISerializationContext context, DSL_Object_Boolean semanticObject) {
+ if (errorAcceptor != null) {
+ if (transientValues.isValueTransient(semanticObject, SensinactPackage.Literals.DSL_OBJECT_BOOLEAN__VALUE) == ValueTransient.YES)
+ errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SensinactPackage.Literals.DSL_OBJECT_BOOLEAN__VALUE));
+ }
+ SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+ feeder.accept(grammarAccess.getDSL_Expression_UnaryAccess().getValueBOOLEANTerminalRuleCall_2_1_0(), semanticObject.isValue());
+ feeder.finish();
+ }
+
+
+ /**
+ * Contexts:
+ * DSL_Expression_Or returns DSL_Object_Number
+ * DSL_Expression_Or.DSL_Expression_Or_1_1 returns DSL_Object_Number
+ * DSL_Expression_And returns DSL_Object_Number
+ * DSL_Expression_And.DSL_Expression_And_1_1 returns DSL_Object_Number
+ * DSL_Expression_DiffEqual returns DSL_Object_Number
+ * DSL_Expression_DiffEqual.DSL_Expression_Diff_1_0_1 returns DSL_Object_Number
+ * DSL_Expression_DiffEqual.DSL_Expression_Equal_1_1_1 returns DSL_Object_Number
+ * DSL_Expression_Compare returns DSL_Object_Number
+ * DSL_Expression_Compare.DSL_Expression_Larger_1_0_1 returns DSL_Object_Number
+ * DSL_Expression_Compare.DSL_Expression_Larger_Equal_1_1_1 returns DSL_Object_Number
+ * DSL_Expression_Compare.DSL_Expression_Smaller_1_2_1 returns DSL_Object_Number
+ * DSL_Expression_Compare.DSL_Expression_Smaller_Equal_1_3_1 returns DSL_Object_Number
+ * DSL_Expression_PlusMinus returns DSL_Object_Number
+ * DSL_Expression_PlusMinus.DSL_Expression_Plus_1_0_1 returns DSL_Object_Number
+ * DSL_Expression_PlusMinus.DSL_Expression_Minus_1_1_1 returns DSL_Object_Number
+ * DSL_Expression_MultiplicationDivision returns DSL_Object_Number
+ * DSL_Expression_MultiplicationDivision.DSL_Expression_Multiplication_1_0_1 returns DSL_Object_Number
+ * DSL_Expression_MultiplicationDivision.DSL_Expression_Division_1_1_1 returns DSL_Object_Number
+ * DSL_Expression_MultiplicationDivision.DSL_Expression_Modulo_1_2_1 returns DSL_Object_Number
+ * DSL_Expression_Unary returns DSL_Object_Number
+ *
+ * Constraint:
+ * value=NUMBER
+ */
+ protected void sequence_DSL_Expression_Unary(ISerializationContext context, DSL_Object_Number semanticObject) {
+ if (errorAcceptor != null) {
+ if (transientValues.isValueTransient(semanticObject, SensinactPackage.Literals.DSL_OBJECT_NUMBER__VALUE) == ValueTransient.YES)
+ errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SensinactPackage.Literals.DSL_OBJECT_NUMBER__VALUE));
+ }
+ SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+ feeder.accept(grammarAccess.getDSL_Expression_UnaryAccess().getValueNUMBERParserRuleCall_0_1_0(), semanticObject.getValue());
+ feeder.finish();
+ }
+
+
+ /**
+ * Contexts:
+ * DSL_Expression_Or returns DSL_Object_Ref
+ * DSL_Expression_Or.DSL_Expression_Or_1_1 returns DSL_Object_Ref
+ * DSL_Expression_And returns DSL_Object_Ref
+ * DSL_Expression_And.DSL_Expression_And_1_1 returns DSL_Object_Ref
+ * DSL_Expression_DiffEqual returns DSL_Object_Ref
+ * DSL_Expression_DiffEqual.DSL_Expression_Diff_1_0_1 returns DSL_Object_Ref
+ * DSL_Expression_DiffEqual.DSL_Expression_Equal_1_1_1 returns DSL_Object_Ref
+ * DSL_Expression_Compare returns DSL_Object_Ref
+ * DSL_Expression_Compare.DSL_Expression_Larger_1_0_1 returns DSL_Object_Ref
+ * DSL_Expression_Compare.DSL_Expression_Larger_Equal_1_1_1 returns DSL_Object_Ref
+ * DSL_Expression_Compare.DSL_Expression_Smaller_1_2_1 returns DSL_Object_Ref
+ * DSL_Expression_Compare.DSL_Expression_Smaller_Equal_1_3_1 returns DSL_Object_Ref
+ * DSL_Expression_PlusMinus returns DSL_Object_Ref
+ * DSL_Expression_PlusMinus.DSL_Expression_Plus_1_0_1 returns DSL_Object_Ref
+ * DSL_Expression_PlusMinus.DSL_Expression_Minus_1_1_1 returns DSL_Object_Ref
+ * DSL_Expression_MultiplicationDivision returns DSL_Object_Ref
+ * DSL_Expression_MultiplicationDivision.DSL_Expression_Multiplication_1_0_1 returns DSL_Object_Ref
+ * DSL_Expression_MultiplicationDivision.DSL_Expression_Division_1_1_1 returns DSL_Object_Ref
+ * DSL_Expression_MultiplicationDivision.DSL_Expression_Modulo_1_2_1 returns DSL_Object_Ref
+ * DSL_Expression_Unary returns DSL_Object_Ref
+ *
+ * Constraint:
+ * value=[DSL_REF|ID]
+ */
+ protected void sequence_DSL_Expression_Unary(ISerializationContext context, DSL_Object_Ref semanticObject) {
+ if (errorAcceptor != null) {
+ if (transientValues.isValueTransient(semanticObject, SensinactPackage.Literals.DSL_OBJECT_REF__VALUE) == ValueTransient.YES)
+ errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SensinactPackage.Literals.DSL_OBJECT_REF__VALUE));
+ }
+ SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+ feeder.accept(grammarAccess.getDSL_Expression_UnaryAccess().getValueDSL_REFIDTerminalRuleCall_3_1_0_1(), semanticObject.getValue());
+ feeder.finish();
+ }
+
+
+ /**
+ * Contexts:
+ * DSL_Expression_Or returns DSL_Object_String
+ * DSL_Expression_Or.DSL_Expression_Or_1_1 returns DSL_Object_String
+ * DSL_Expression_And returns DSL_Object_String
+ * DSL_Expression_And.DSL_Expression_And_1_1 returns DSL_Object_String
+ * DSL_Expression_DiffEqual returns DSL_Object_String
+ * DSL_Expression_DiffEqual.DSL_Expression_Diff_1_0_1 returns DSL_Object_String
+ * DSL_Expression_DiffEqual.DSL_Expression_Equal_1_1_1 returns DSL_Object_String
+ * DSL_Expression_Compare returns DSL_Object_String
+ * DSL_Expression_Compare.DSL_Expression_Larger_1_0_1 returns DSL_Object_String
+ * DSL_Expression_Compare.DSL_Expression_Larger_Equal_1_1_1 returns DSL_Object_String
+ * DSL_Expression_Compare.DSL_Expression_Smaller_1_2_1 returns DSL_Object_String
+ * DSL_Expression_Compare.DSL_Expression_Smaller_Equal_1_3_1 returns DSL_Object_String
+ * DSL_Expression_PlusMinus returns DSL_Object_String
+ * DSL_Expression_PlusMinus.DSL_Expression_Plus_1_0_1 returns DSL_Object_String
+ * DSL_Expression_PlusMinus.DSL_Expression_Minus_1_1_1 returns DSL_Object_String
+ * DSL_Expression_MultiplicationDivision returns DSL_Object_String
+ * DSL_Expression_MultiplicationDivision.DSL_Expression_Multiplication_1_0_1 returns DSL_Object_String
+ * DSL_Expression_MultiplicationDivision.DSL_Expression_Division_1_1_1 returns DSL_Object_String
+ * DSL_Expression_MultiplicationDivision.DSL_Expression_Modulo_1_2_1 returns DSL_Object_String
+ * DSL_Expression_Unary returns DSL_Object_String
+ *
+ * Constraint:
+ * value=STRING
+ */
+ protected void sequence_DSL_Expression_Unary(ISerializationContext context, DSL_Object_String semanticObject) {
+ if (errorAcceptor != null) {
+ if (transientValues.isValueTransient(semanticObject, SensinactPackage.Literals.DSL_OBJECT_STRING__VALUE) == ValueTransient.YES)
+ errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SensinactPackage.Literals.DSL_OBJECT_STRING__VALUE));
+ }
+ SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+ feeder.accept(grammarAccess.getDSL_Expression_UnaryAccess().getValueSTRINGTerminalRuleCall_1_1_0(), semanticObject.getValue());
+ feeder.finish();
+ }
+
+
+ /**
+ * Contexts:
+ * DSL_IfDo returns DSL_IfDo
+ *
+ * Constraint:
+ * (condition=DSL_Expression_Or actions=DSL_ListActions)
+ */
+ protected void sequence_DSL_IfDo(ISerializationContext context, DSL_IfDo semanticObject) {
+ if (errorAcceptor != null) {
+ if (transientValues.isValueTransient(semanticObject, SensinactPackage.Literals.DSL_IF_DO__CONDITION) == ValueTransient.YES)
+ errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SensinactPackage.Literals.DSL_IF_DO__CONDITION));
+ if (transientValues.isValueTransient(semanticObject, SensinactPackage.Literals.DSL_IF_DO__ACTIONS) == ValueTransient.YES)
+ errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SensinactPackage.Literals.DSL_IF_DO__ACTIONS));
+ }
+ SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+ feeder.accept(grammarAccess.getDSL_IfDoAccess().getConditionDSL_Expression_OrParserRuleCall_1_0(), semanticObject.getCondition());
+ feeder.accept(grammarAccess.getDSL_IfDoAccess().getActionsDSL_ListActionsParserRuleCall_3_0(), semanticObject.getActions());
+ feeder.finish();
+ }
+
+
+ /**
+ * Contexts:
+ * DSL_ListActions returns DSL_ListActions
+ *
+ * Constraint:
+ * (actionList+=DSL_ResourceAction actionList+=DSL_ResourceAction*)
+ */
+ protected void sequence_DSL_ListActions(ISerializationContext context, DSL_ListActions semanticObject) {
+ genericSequencer.createSequence(context, semanticObject);
+ }
+
+
+ /**
+ * Contexts:
+ * DSL_ListParam returns DSL_ListParam
+ *
+ * Constraint:
+ * (param+=DSL_Expression_Or param+=DSL_Expression_Or*)
+ */
+ protected void sequence_DSL_ListParam(ISerializationContext context, DSL_ListParam semanticObject) {
+ genericSequencer.createSequence(context, semanticObject);
+ }
+
+
+ /**
+ * Contexts:
+ * DSL_On returns DSL_On
+ *
+ * Constraint:
+ * (triggers+=DSL_REF_CONDITION triggers+=DSL_REF_CONDITION*)
+ */
+ protected void sequence_DSL_On(ISerializationContext context, DSL_On semanticObject) {
+ genericSequencer.createSequence(context, semanticObject);
+ }
+
+
+ /**
+ * Contexts:
+ * DSL_REF_CONDITION returns DSL_REF_CONDITION
+ *
+ * Constraint:
+ * ref=[DSL_REF|ID]
+ */
+ protected void sequence_DSL_REF_CONDITION(ISerializationContext context, DSL_REF_CONDITION semanticObject) {
+ if (errorAcceptor != null) {
+ if (transientValues.isValueTransient(semanticObject, SensinactPackage.Literals.DSL_REF_CONDITION__REF) == ValueTransient.YES)
+ errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SensinactPackage.Literals.DSL_REF_CONDITION__REF));
+ }
+ SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+ feeder.accept(grammarAccess.getDSL_REF_CONDITIONAccess().getRefDSL_REFIDTerminalRuleCall_0_0_1(), semanticObject.getRef());
+ feeder.finish();
+ }
+
+
+ /**
+ * Contexts:
+ * DSL_ResourceAction returns DSL_ResourceAction
+ *
+ * Constraint:
+ * (variable=ID? ref=[DSL_REF|ID] (actiontype='act' | actiontype='set') listParam=DSL_ListParam?)
+ */
+ protected void sequence_DSL_ResourceAction(ISerializationContext context, DSL_ResourceAction semanticObject) {
+ genericSequencer.createSequence(context, semanticObject);
+ }
+
+
+ /**
+ * Contexts:
+ * DSL_Resource returns DSL_Resource
+ * DSL_REF returns DSL_Resource
+ *
+ * Constraint:
+ * (name=ID gatewayID=EXTENDED_ID deviceID=EXTENDED_ID serviceID=EXTENDED_ID resourceID=EXTENDED_ID)
+ */
+ protected void sequence_DSL_Resource(ISerializationContext context, DSL_Resource semanticObject) {
+ if (errorAcceptor != null) {
+ if (transientValues.isValueTransient(semanticObject, SensinactPackage.Literals.DSL_REF__NAME) == ValueTransient.YES)
+ errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SensinactPackage.Literals.DSL_REF__NAME));
+ if (transientValues.isValueTransient(semanticObject, SensinactPackage.Literals.DSL_RESOURCE__GATEWAY_ID) == ValueTransient.YES)
+ errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SensinactPackage.Literals.DSL_RESOURCE__GATEWAY_ID));
+ if (transientValues.isValueTransient(semanticObject, SensinactPackage.Literals.DSL_RESOURCE__DEVICE_ID) == ValueTransient.YES)
+ errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SensinactPackage.Literals.DSL_RESOURCE__DEVICE_ID));
+ if (transientValues.isValueTransient(semanticObject, SensinactPackage.Literals.DSL_RESOURCE__SERVICE_ID) == ValueTransient.YES)
+ errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SensinactPackage.Literals.DSL_RESOURCE__SERVICE_ID));
+ if (transientValues.isValueTransient(semanticObject, SensinactPackage.Literals.DSL_RESOURCE__RESOURCE_ID) == ValueTransient.YES)
+ errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SensinactPackage.Literals.DSL_RESOURCE__RESOURCE_ID));
+ }
+ SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+ feeder.accept(grammarAccess.getDSL_ResourceAccess().getNameIDTerminalRuleCall_1_0(), semanticObject.getName());
+ feeder.accept(grammarAccess.getDSL_ResourceAccess().getGatewayIDEXTENDED_IDParserRuleCall_4_0(), semanticObject.getGatewayID());
+ feeder.accept(grammarAccess.getDSL_ResourceAccess().getDeviceIDEXTENDED_IDParserRuleCall_6_0(), semanticObject.getDeviceID());
+ feeder.accept(grammarAccess.getDSL_ResourceAccess().getServiceIDEXTENDED_IDParserRuleCall_8_0(), semanticObject.getServiceID());
+ feeder.accept(grammarAccess.getDSL_ResourceAccess().getResourceIDEXTENDED_IDParserRuleCall_10_0(), semanticObject.getResourceID());
+ feeder.finish();
+ }
+
+
+ /**
+ * Contexts:
+ * DSL_SENSINACT returns DSL_SENSINACT
+ *
+ * Constraint:
+ * (resources+=DSL_Resource+ cep+=DSL_CEP_STATEMENT* on=DSL_On eca=DSL_ECA_STATEMENT)
+ */
+ protected void sequence_DSL_SENSINACT(ISerializationContext context, DSL_SENSINACT semanticObject) {
+ genericSequencer.createSequence(context, semanticObject);
+ }
+
+
+ /**
+ * Contexts:
+ * Sensinact returns Sensinact
+ *
+ * Constraint:
+ * eca=DSL_SENSINACT
+ */
+ protected void sequence_Sensinact(ISerializationContext context, Sensinact semanticObject) {
+ if (errorAcceptor != null) {
+ if (transientValues.isValueTransient(semanticObject, SensinactPackage.Literals.SENSINACT__ECA) == ValueTransient.YES)
+ errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SensinactPackage.Literals.SENSINACT__ECA));
+ }
+ SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+ feeder.accept(grammarAccess.getSensinactAccess().getEcaDSL_SENSINACTParserRuleCall_1_0(), semanticObject.getEca());
+ feeder.finish();
+ }
+
+
+}
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/serializer/SensinactSyntacticSequencer.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/serializer/SensinactSyntacticSequencer.java
new file mode 100644
index 0000000..a330172
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/serializer/SensinactSyntacticSequencer.java
@@ -0,0 +1,114 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/*
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.serializer;
+
+import com.google.inject.Inject;
+import java.util.List;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.sensinact.studio.language.services.SensinactGrammarAccess;
+import org.eclipse.xtext.IGrammarAccess;
+import org.eclipse.xtext.RuleCall;
+import org.eclipse.xtext.nodemodel.INode;
+import org.eclipse.xtext.serializer.analysis.GrammarAlias.AbstractElementAlias;
+import org.eclipse.xtext.serializer.analysis.GrammarAlias.TokenAlias;
+import org.eclipse.xtext.serializer.analysis.ISyntacticSequencerPDAProvider.ISynNavigable;
+import org.eclipse.xtext.serializer.analysis.ISyntacticSequencerPDAProvider.ISynTransition;
+import org.eclipse.xtext.serializer.sequencer.AbstractSyntacticSequencer;
+
+@SuppressWarnings("all")
+public class SensinactSyntacticSequencer extends AbstractSyntacticSequencer {
+
+ protected SensinactGrammarAccess grammarAccess;
+ protected AbstractElementAlias match_DSL_Expression_Unary_LeftParenthesisKeyword_4_0_a;
+ protected AbstractElementAlias match_DSL_Expression_Unary_LeftParenthesisKeyword_4_0_p;
+
+ @Inject
+ protected void init(IGrammarAccess access) {
+ grammarAccess = (SensinactGrammarAccess) access;
+ match_DSL_Expression_Unary_LeftParenthesisKeyword_4_0_a = new TokenAlias(true, true, grammarAccess.getDSL_Expression_UnaryAccess().getLeftParenthesisKeyword_4_0());
+ match_DSL_Expression_Unary_LeftParenthesisKeyword_4_0_p = new TokenAlias(true, false, grammarAccess.getDSL_Expression_UnaryAccess().getLeftParenthesisKeyword_4_0());
+ }
+
+ @Override
+ protected String getUnassignedRuleCallToken(EObject semanticObject, RuleCall ruleCall, INode node) {
+ return "";
+ }
+
+
+ @Override
+ protected void emitUnassignedTokens(EObject semanticObject, ISynTransition transition, INode fromNode, INode toNode) {
+ if (transition.getAmbiguousSyntaxes().isEmpty()) return;
+ List<INode> transitionNodes = collectNodes(fromNode, toNode);
+ for (AbstractElementAlias syntax : transition.getAmbiguousSyntaxes()) {
+ List<INode> syntaxNodes = getNodesFor(transitionNodes, syntax);
+ if (match_DSL_Expression_Unary_LeftParenthesisKeyword_4_0_a.equals(syntax))
+ emit_DSL_Expression_Unary_LeftParenthesisKeyword_4_0_a(semanticObject, getLastNavigableState(), syntaxNodes);
+ else if (match_DSL_Expression_Unary_LeftParenthesisKeyword_4_0_p.equals(syntax))
+ emit_DSL_Expression_Unary_LeftParenthesisKeyword_4_0_p(semanticObject, getLastNavigableState(), syntaxNodes);
+ else acceptNodes(getLastNavigableState(), syntaxNodes);
+ }
+ }
+
+ /**
+ * Ambiguous syntax:
+ * '('*
+ *
+ * This ambiguous syntax occurs at:
+ * (rule start) (ambiguity) 'not' exp=DSL_Expression_Unary
+ * (rule start) (ambiguity) value=BOOLEAN
+ * (rule start) (ambiguity) value=NUMBER
+ * (rule start) (ambiguity) value=STRING
+ * (rule start) (ambiguity) value=[DSL_REF|ID]
+ * (rule start) (ambiguity) {DSL_Expression_And.left=}
+ * (rule start) (ambiguity) {DSL_Expression_Diff.left=}
+ * (rule start) (ambiguity) {DSL_Expression_Division.left=}
+ * (rule start) (ambiguity) {DSL_Expression_Equal.left=}
+ * (rule start) (ambiguity) {DSL_Expression_Larger.left=}
+ * (rule start) (ambiguity) {DSL_Expression_Larger_Equal.left=}
+ * (rule start) (ambiguity) {DSL_Expression_Minus.left=}
+ * (rule start) (ambiguity) {DSL_Expression_Modulo.left=}
+ * (rule start) (ambiguity) {DSL_Expression_Multiplication.left=}
+ * (rule start) (ambiguity) {DSL_Expression_Or.left=}
+ * (rule start) (ambiguity) {DSL_Expression_Plus.left=}
+ * (rule start) (ambiguity) {DSL_Expression_Smaller.left=}
+ * (rule start) (ambiguity) {DSL_Expression_Smaller_Equal.left=}
+ */
+ protected void emit_DSL_Expression_Unary_LeftParenthesisKeyword_4_0_a(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+ acceptNodes(transition, nodes);
+ }
+
+ /**
+ * Ambiguous syntax:
+ * '('+
+ *
+ * This ambiguous syntax occurs at:
+ * (rule start) (ambiguity) {DSL_Expression_And.left=}
+ * (rule start) (ambiguity) {DSL_Expression_Diff.left=}
+ * (rule start) (ambiguity) {DSL_Expression_Division.left=}
+ * (rule start) (ambiguity) {DSL_Expression_Equal.left=}
+ * (rule start) (ambiguity) {DSL_Expression_Larger.left=}
+ * (rule start) (ambiguity) {DSL_Expression_Larger_Equal.left=}
+ * (rule start) (ambiguity) {DSL_Expression_Minus.left=}
+ * (rule start) (ambiguity) {DSL_Expression_Modulo.left=}
+ * (rule start) (ambiguity) {DSL_Expression_Multiplication.left=}
+ * (rule start) (ambiguity) {DSL_Expression_Or.left=}
+ * (rule start) (ambiguity) {DSL_Expression_Plus.left=}
+ * (rule start) (ambiguity) {DSL_Expression_Smaller.left=}
+ * (rule start) (ambiguity) {DSL_Expression_Smaller_Equal.left=}
+ */
+ protected void emit_DSL_Expression_Unary_LeftParenthesisKeyword_4_0_p(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+ acceptNodes(transition, nodes);
+ }
+
+}
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/services/SensinactGrammarAccess.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/services/SensinactGrammarAccess.java
new file mode 100644
index 0000000..991743b
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/services/SensinactGrammarAccess.java
@@ -0,0 +1,2266 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/*
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.services;
+
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.util.List;
+import org.eclipse.xtext.Action;
+import org.eclipse.xtext.Alternatives;
+import org.eclipse.xtext.Assignment;
+import org.eclipse.xtext.CrossReference;
+import org.eclipse.xtext.Grammar;
+import org.eclipse.xtext.GrammarUtil;
+import org.eclipse.xtext.Group;
+import org.eclipse.xtext.Keyword;
+import org.eclipse.xtext.ParserRule;
+import org.eclipse.xtext.RuleCall;
+import org.eclipse.xtext.TerminalRule;
+import org.eclipse.xtext.common.services.TerminalsGrammarAccess;
+import org.eclipse.xtext.service.AbstractElementFinder.AbstractGrammarElementFinder;
+import org.eclipse.xtext.service.GrammarProvider;
+
+@Singleton
+public class SensinactGrammarAccess extends AbstractGrammarElementFinder {
+
+ public class SensinactElements extends AbstractParserRuleElementFinder {
+ private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.sensinact.studio.language.Sensinact.Sensinact");
+ private final Group cGroup = (Group)rule.eContents().get(1);
+ private final Action cSensinactAction_0 = (Action)cGroup.eContents().get(0);
+ private final Assignment cEcaAssignment_1 = (Assignment)cGroup.eContents().get(1);
+ private final RuleCall cEcaDSL_SENSINACTParserRuleCall_1_0 = (RuleCall)cEcaAssignment_1.eContents().get(0);
+
+ //// ==============
+ //// Main structure
+ //// ==============
+ //Sensinact:
+ // {Sensinact} eca=DSL_SENSINACT;
+ @Override public ParserRule getRule() { return rule; }
+
+ //{Sensinact} eca=DSL_SENSINACT
+ public Group getGroup() { return cGroup; }
+
+ //{Sensinact}
+ public Action getSensinactAction_0() { return cSensinactAction_0; }
+
+ //eca=DSL_SENSINACT
+ public Assignment getEcaAssignment_1() { return cEcaAssignment_1; }
+
+ //DSL_SENSINACT
+ public RuleCall getEcaDSL_SENSINACTParserRuleCall_1_0() { return cEcaDSL_SENSINACTParserRuleCall_1_0; }
+ }
+ public class DSL_SENSINACTElements extends AbstractParserRuleElementFinder {
+ private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.sensinact.studio.language.Sensinact.DSL_SENSINACT");
+ private final Group cGroup = (Group)rule.eContents().get(1);
+ private final Assignment cResourcesAssignment_0 = (Assignment)cGroup.eContents().get(0);
+ private final RuleCall cResourcesDSL_ResourceParserRuleCall_0_0 = (RuleCall)cResourcesAssignment_0.eContents().get(0);
+ private final Assignment cCepAssignment_1 = (Assignment)cGroup.eContents().get(1);
+ private final RuleCall cCepDSL_CEP_STATEMENTParserRuleCall_1_0 = (RuleCall)cCepAssignment_1.eContents().get(0);
+ private final Assignment cOnAssignment_2 = (Assignment)cGroup.eContents().get(2);
+ private final RuleCall cOnDSL_OnParserRuleCall_2_0 = (RuleCall)cOnAssignment_2.eContents().get(0);
+ private final Assignment cEcaAssignment_3 = (Assignment)cGroup.eContents().get(3);
+ private final RuleCall cEcaDSL_ECA_STATEMENTParserRuleCall_3_0 = (RuleCall)cEcaAssignment_3.eContents().get(0);
+
+ //DSL_SENSINACT:
+ // resources+=DSL_Resource+ cep+=DSL_CEP_STATEMENT* on=DSL_On eca=DSL_ECA_STATEMENT;
+ @Override public ParserRule getRule() { return rule; }
+
+ //resources+=DSL_Resource+ cep+=DSL_CEP_STATEMENT* on=DSL_On eca=DSL_ECA_STATEMENT
+ public Group getGroup() { return cGroup; }
+
+ //resources+=DSL_Resource+
+ public Assignment getResourcesAssignment_0() { return cResourcesAssignment_0; }
+
+ //DSL_Resource
+ public RuleCall getResourcesDSL_ResourceParserRuleCall_0_0() { return cResourcesDSL_ResourceParserRuleCall_0_0; }
+
+ //cep+=DSL_CEP_STATEMENT*
+ public Assignment getCepAssignment_1() { return cCepAssignment_1; }
+
+ //DSL_CEP_STATEMENT
+ public RuleCall getCepDSL_CEP_STATEMENTParserRuleCall_1_0() { return cCepDSL_CEP_STATEMENTParserRuleCall_1_0; }
+
+ //on=DSL_On
+ public Assignment getOnAssignment_2() { return cOnAssignment_2; }
+
+ //DSL_On
+ public RuleCall getOnDSL_OnParserRuleCall_2_0() { return cOnDSL_OnParserRuleCall_2_0; }
+
+ //eca=DSL_ECA_STATEMENT
+ public Assignment getEcaAssignment_3() { return cEcaAssignment_3; }
+
+ //DSL_ECA_STATEMENT
+ public RuleCall getEcaDSL_ECA_STATEMENTParserRuleCall_3_0() { return cEcaDSL_ECA_STATEMENTParserRuleCall_3_0; }
+ }
+ public class DSL_ResourceElements extends AbstractParserRuleElementFinder {
+ private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.sensinact.studio.language.Sensinact.DSL_Resource");
+ private final Group cGroup = (Group)rule.eContents().get(1);
+ private final Keyword cResourceKeyword_0 = (Keyword)cGroup.eContents().get(0);
+ private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
+ private final RuleCall cNameIDTerminalRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
+ private final Keyword cEqualsSignKeyword_2 = (Keyword)cGroup.eContents().get(2);
+ private final Keyword cLeftSquareBracketKeyword_3 = (Keyword)cGroup.eContents().get(3);
+ private final Assignment cGatewayIDAssignment_4 = (Assignment)cGroup.eContents().get(4);
+ private final RuleCall cGatewayIDEXTENDED_IDParserRuleCall_4_0 = (RuleCall)cGatewayIDAssignment_4.eContents().get(0);
+ private final Keyword cSolidusKeyword_5 = (Keyword)cGroup.eContents().get(5);
+ private final Assignment cDeviceIDAssignment_6 = (Assignment)cGroup.eContents().get(6);
+ private final RuleCall cDeviceIDEXTENDED_IDParserRuleCall_6_0 = (RuleCall)cDeviceIDAssignment_6.eContents().get(0);
+ private final Keyword cSolidusKeyword_7 = (Keyword)cGroup.eContents().get(7);
+ private final Assignment cServiceIDAssignment_8 = (Assignment)cGroup.eContents().get(8);
+ private final RuleCall cServiceIDEXTENDED_IDParserRuleCall_8_0 = (RuleCall)cServiceIDAssignment_8.eContents().get(0);
+ private final Keyword cSolidusKeyword_9 = (Keyword)cGroup.eContents().get(9);
+ private final Assignment cResourceIDAssignment_10 = (Assignment)cGroup.eContents().get(10);
+ private final RuleCall cResourceIDEXTENDED_IDParserRuleCall_10_0 = (RuleCall)cResourceIDAssignment_10.eContents().get(0);
+ private final Keyword cRightSquareBracketKeyword_11 = (Keyword)cGroup.eContents().get(11);
+
+ //DSL_Resource:
+ // 'resource' name=ID '=' '[' gatewayID=EXTENDED_ID '/' deviceID=EXTENDED_ID '/' serviceID=EXTENDED_ID '/'
+ // resourceID=EXTENDED_ID ']';
+ @Override public ParserRule getRule() { return rule; }
+
+ //'resource' name=ID '=' '[' gatewayID=EXTENDED_ID '/' deviceID=EXTENDED_ID '/' serviceID=EXTENDED_ID '/'
+ //resourceID=EXTENDED_ID ']'
+ public Group getGroup() { return cGroup; }
+
+ //'resource'
+ public Keyword getResourceKeyword_0() { return cResourceKeyword_0; }
+
+ //name=ID
+ public Assignment getNameAssignment_1() { return cNameAssignment_1; }
+
+ //ID
+ public RuleCall getNameIDTerminalRuleCall_1_0() { return cNameIDTerminalRuleCall_1_0; }
+
+ //'='
+ public Keyword getEqualsSignKeyword_2() { return cEqualsSignKeyword_2; }
+
+ //'['
+ public Keyword getLeftSquareBracketKeyword_3() { return cLeftSquareBracketKeyword_3; }
+
+ //gatewayID=EXTENDED_ID
+ public Assignment getGatewayIDAssignment_4() { return cGatewayIDAssignment_4; }
+
+ //EXTENDED_ID
+ public RuleCall getGatewayIDEXTENDED_IDParserRuleCall_4_0() { return cGatewayIDEXTENDED_IDParserRuleCall_4_0; }
+
+ //'/'
+ public Keyword getSolidusKeyword_5() { return cSolidusKeyword_5; }
+
+ //deviceID=EXTENDED_ID
+ public Assignment getDeviceIDAssignment_6() { return cDeviceIDAssignment_6; }
+
+ //EXTENDED_ID
+ public RuleCall getDeviceIDEXTENDED_IDParserRuleCall_6_0() { return cDeviceIDEXTENDED_IDParserRuleCall_6_0; }
+
+ //'/'
+ public Keyword getSolidusKeyword_7() { return cSolidusKeyword_7; }
+
+ //serviceID=EXTENDED_ID
+ public Assignment getServiceIDAssignment_8() { return cServiceIDAssignment_8; }
+
+ //EXTENDED_ID
+ public RuleCall getServiceIDEXTENDED_IDParserRuleCall_8_0() { return cServiceIDEXTENDED_IDParserRuleCall_8_0; }
+
+ //'/'
+ public Keyword getSolidusKeyword_9() { return cSolidusKeyword_9; }
+
+ //resourceID=EXTENDED_ID
+ public Assignment getResourceIDAssignment_10() { return cResourceIDAssignment_10; }
+
+ //EXTENDED_ID
+ public RuleCall getResourceIDEXTENDED_IDParserRuleCall_10_0() { return cResourceIDEXTENDED_IDParserRuleCall_10_0; }
+
+ //']'
+ public Keyword getRightSquareBracketKeyword_11() { return cRightSquareBracketKeyword_11; }
+ }
+ public class DSL_OnElements extends AbstractParserRuleElementFinder {
+ private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.sensinact.studio.language.Sensinact.DSL_On");
+ private final Group cGroup = (Group)rule.eContents().get(1);
+ private final Keyword cOnKeyword_0 = (Keyword)cGroup.eContents().get(0);
+ private final Assignment cTriggersAssignment_1 = (Assignment)cGroup.eContents().get(1);
+ private final RuleCall cTriggersDSL_REF_CONDITIONParserRuleCall_1_0 = (RuleCall)cTriggersAssignment_1.eContents().get(0);
+ private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
+ private final Keyword cCommaKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
+ private final Assignment cTriggersAssignment_2_1 = (Assignment)cGroup_2.eContents().get(1);
+ private final RuleCall cTriggersDSL_REF_CONDITIONParserRuleCall_2_1_0 = (RuleCall)cTriggersAssignment_2_1.eContents().get(0);
+
+ //DSL_On:
+ // 'on' triggers+=DSL_REF_CONDITION (',' triggers+=DSL_REF_CONDITION)*;
+ @Override public ParserRule getRule() { return rule; }
+
+ //'on' triggers+=DSL_REF_CONDITION (',' triggers+=DSL_REF_CONDITION)*
+ public Group getGroup() { return cGroup; }
+
+ //'on'
+ public Keyword getOnKeyword_0() { return cOnKeyword_0; }
+
+ //triggers+=DSL_REF_CONDITION
+ public Assignment getTriggersAssignment_1() { return cTriggersAssignment_1; }
+
+ //DSL_REF_CONDITION
+ public RuleCall getTriggersDSL_REF_CONDITIONParserRuleCall_1_0() { return cTriggersDSL_REF_CONDITIONParserRuleCall_1_0; }
+
+ //(',' triggers+=DSL_REF_CONDITION)*
+ public Group getGroup_2() { return cGroup_2; }
+
+ //','
+ public Keyword getCommaKeyword_2_0() { return cCommaKeyword_2_0; }
+
+ //triggers+=DSL_REF_CONDITION
+ public Assignment getTriggersAssignment_2_1() { return cTriggersAssignment_2_1; }
+
+ //DSL_REF_CONDITION
+ public RuleCall getTriggersDSL_REF_CONDITIONParserRuleCall_2_1_0() { return cTriggersDSL_REF_CONDITIONParserRuleCall_2_1_0; }
+ }
+ public class DSL_ECA_STATEMENTElements extends AbstractParserRuleElementFinder {
+ private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.sensinact.studio.language.Sensinact.DSL_ECA_STATEMENT");
+ private final Group cGroup = (Group)rule.eContents().get(1);
+ private final Assignment cIfdoAssignment_0 = (Assignment)cGroup.eContents().get(0);
+ private final RuleCall cIfdoDSL_IfDoParserRuleCall_0_0 = (RuleCall)cIfdoAssignment_0.eContents().get(0);
+ private final Assignment cElseIfdoAssignment_1 = (Assignment)cGroup.eContents().get(1);
+ private final RuleCall cElseIfdoDSL_ElseIfDoParserRuleCall_1_0 = (RuleCall)cElseIfdoAssignment_1.eContents().get(0);
+ private final Assignment cElsedoAssignment_2 = (Assignment)cGroup.eContents().get(2);
+ private final RuleCall cElsedoDSL_ElseDoParserRuleCall_2_0 = (RuleCall)cElsedoAssignment_2.eContents().get(0);
+ private final Keyword cEndIfKeyword_3 = (Keyword)cGroup.eContents().get(3);
+
+ //DSL_ECA_STATEMENT:
+ // ifdo=DSL_IfDo elseIfdo+=DSL_ElseIfDo* elsedo=DSL_ElseDo? 'end if';
+ @Override public ParserRule getRule() { return rule; }
+
+ //ifdo=DSL_IfDo elseIfdo+=DSL_ElseIfDo* elsedo=DSL_ElseDo? 'end if'
+ public Group getGroup() { return cGroup; }
+
+ //ifdo=DSL_IfDo
+ public Assignment getIfdoAssignment_0() { return cIfdoAssignment_0; }
+
+ //DSL_IfDo
+ public RuleCall getIfdoDSL_IfDoParserRuleCall_0_0() { return cIfdoDSL_IfDoParserRuleCall_0_0; }
+
+ //elseIfdo+=DSL_ElseIfDo*
+ public Assignment getElseIfdoAssignment_1() { return cElseIfdoAssignment_1; }
+
+ //DSL_ElseIfDo
+ public RuleCall getElseIfdoDSL_ElseIfDoParserRuleCall_1_0() { return cElseIfdoDSL_ElseIfDoParserRuleCall_1_0; }
+
+ //elsedo=DSL_ElseDo?
+ public Assignment getElsedoAssignment_2() { return cElsedoAssignment_2; }
+
+ //DSL_ElseDo
+ public RuleCall getElsedoDSL_ElseDoParserRuleCall_2_0() { return cElsedoDSL_ElseDoParserRuleCall_2_0; }
+
+ //'end if'
+ public Keyword getEndIfKeyword_3() { return cEndIfKeyword_3; }
+ }
+ public class DSL_IfDoElements extends AbstractParserRuleElementFinder {
+ private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.sensinact.studio.language.Sensinact.DSL_IfDo");
+ private final Group cGroup = (Group)rule.eContents().get(1);
+ private final Keyword cIfKeyword_0 = (Keyword)cGroup.eContents().get(0);
+ private final Assignment cConditionAssignment_1 = (Assignment)cGroup.eContents().get(1);
+ private final RuleCall cConditionDSL_Expression_OrParserRuleCall_1_0 = (RuleCall)cConditionAssignment_1.eContents().get(0);
+ private final Keyword cDoKeyword_2 = (Keyword)cGroup.eContents().get(2);
+ private final Assignment cActionsAssignment_3 = (Assignment)cGroup.eContents().get(3);
+ private final RuleCall cActionsDSL_ListActionsParserRuleCall_3_0 = (RuleCall)cActionsAssignment_3.eContents().get(0);
+
+ //DSL_IfDo:
+ // 'if' condition=DSL_Expression_Or 'do' actions=DSL_ListActions;
+ @Override public ParserRule getRule() { return rule; }
+
+ //'if' condition=DSL_Expression_Or 'do' actions=DSL_ListActions
+ public Group getGroup() { return cGroup; }
+
+ //'if'
+ public Keyword getIfKeyword_0() { return cIfKeyword_0; }
+
+ //condition=DSL_Expression_Or
+ public Assignment getConditionAssignment_1() { return cConditionAssignment_1; }
+
+ //DSL_Expression_Or
+ public RuleCall getConditionDSL_Expression_OrParserRuleCall_1_0() { return cConditionDSL_Expression_OrParserRuleCall_1_0; }
+
+ //'do'
+ public Keyword getDoKeyword_2() { return cDoKeyword_2; }
+
+ //actions=DSL_ListActions
+ public Assignment getActionsAssignment_3() { return cActionsAssignment_3; }
+
+ //DSL_ListActions
+ public RuleCall getActionsDSL_ListActionsParserRuleCall_3_0() { return cActionsDSL_ListActionsParserRuleCall_3_0; }
+ }
+ public class DSL_ElseIfDoElements extends AbstractParserRuleElementFinder {
+ private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.sensinact.studio.language.Sensinact.DSL_ElseIfDo");
+ private final Group cGroup = (Group)rule.eContents().get(1);
+ private final Keyword cElseIfKeyword_0 = (Keyword)cGroup.eContents().get(0);
+ private final Assignment cConditionAssignment_1 = (Assignment)cGroup.eContents().get(1);
+ private final RuleCall cConditionDSL_Expression_OrParserRuleCall_1_0 = (RuleCall)cConditionAssignment_1.eContents().get(0);
+ private final Keyword cDoKeyword_2 = (Keyword)cGroup.eContents().get(2);
+ private final Assignment cActionsAssignment_3 = (Assignment)cGroup.eContents().get(3);
+ private final RuleCall cActionsDSL_ListActionsParserRuleCall_3_0 = (RuleCall)cActionsAssignment_3.eContents().get(0);
+
+ //DSL_ElseIfDo:
+ // 'else if' condition=DSL_Expression_Or 'do' actions=DSL_ListActions;
+ @Override public ParserRule getRule() { return rule; }
+
+ //'else if' condition=DSL_Expression_Or 'do' actions=DSL_ListActions
+ public Group getGroup() { return cGroup; }
+
+ //'else if'
+ public Keyword getElseIfKeyword_0() { return cElseIfKeyword_0; }
+
+ //condition=DSL_Expression_Or
+ public Assignment getConditionAssignment_1() { return cConditionAssignment_1; }
+
+ //DSL_Expression_Or
+ public RuleCall getConditionDSL_Expression_OrParserRuleCall_1_0() { return cConditionDSL_Expression_OrParserRuleCall_1_0; }
+
+ //'do'
+ public Keyword getDoKeyword_2() { return cDoKeyword_2; }
+
+ //actions=DSL_ListActions
+ public Assignment getActionsAssignment_3() { return cActionsAssignment_3; }
+
+ //DSL_ListActions
+ public RuleCall getActionsDSL_ListActionsParserRuleCall_3_0() { return cActionsDSL_ListActionsParserRuleCall_3_0; }
+ }
+ public class DSL_ElseDoElements extends AbstractParserRuleElementFinder {
+ private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.sensinact.studio.language.Sensinact.DSL_ElseDo");
+ private final Group cGroup = (Group)rule.eContents().get(1);
+ private final Keyword cElseDoKeyword_0 = (Keyword)cGroup.eContents().get(0);
+ private final Assignment cActionsAssignment_1 = (Assignment)cGroup.eContents().get(1);
+ private final RuleCall cActionsDSL_ListActionsParserRuleCall_1_0 = (RuleCall)cActionsAssignment_1.eContents().get(0);
+
+ //DSL_ElseDo:
+ // 'else do' actions=DSL_ListActions;
+ @Override public ParserRule getRule() { return rule; }
+
+ //'else do' actions=DSL_ListActions
+ public Group getGroup() { return cGroup; }
+
+ //'else do'
+ public Keyword getElseDoKeyword_0() { return cElseDoKeyword_0; }
+
+ //actions=DSL_ListActions
+ public Assignment getActionsAssignment_1() { return cActionsAssignment_1; }
+
+ //DSL_ListActions
+ public RuleCall getActionsDSL_ListActionsParserRuleCall_1_0() { return cActionsDSL_ListActionsParserRuleCall_1_0; }
+ }
+ public class NUMBERElements extends AbstractParserRuleElementFinder {
+ private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.sensinact.studio.language.Sensinact.NUMBER");
+ private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+ private final RuleCall cINTTerminalRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
+ private final Group cGroup_1 = (Group)cAlternatives.eContents().get(1);
+ private final RuleCall cINTTerminalRuleCall_1_0 = (RuleCall)cGroup_1.eContents().get(0);
+ private final Keyword cFullStopKeyword_1_1 = (Keyword)cGroup_1.eContents().get(1);
+ private final RuleCall cINTTerminalRuleCall_1_2 = (RuleCall)cGroup_1.eContents().get(2);
+
+ //NUMBER ecore::EBigDecimal:
+ // INT | INT '.' INT
+ @Override public ParserRule getRule() { return rule; }
+
+ //INT | INT '.' INT
+ public Alternatives getAlternatives() { return cAlternatives; }
+
+ //INT
+ public RuleCall getINTTerminalRuleCall_0() { return cINTTerminalRuleCall_0; }
+
+ //INT '.' INT
+ public Group getGroup_1() { return cGroup_1; }
+
+ //INT
+ public RuleCall getINTTerminalRuleCall_1_0() { return cINTTerminalRuleCall_1_0; }
+
+ //'.'
+ public Keyword getFullStopKeyword_1_1() { return cFullStopKeyword_1_1; }
+
+ //INT
+ public RuleCall getINTTerminalRuleCall_1_2() { return cINTTerminalRuleCall_1_2; }
+ }
+ public class EXTENDED_IDElements extends AbstractParserRuleElementFinder {
+ private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.sensinact.studio.language.Sensinact.EXTENDED_ID");
+ private final Group cGroup = (Group)rule.eContents().get(1);
+ private final RuleCall cIDTerminalRuleCall_0 = (RuleCall)cGroup.eContents().get(0);
+ private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
+ private final Keyword cFullStopKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
+ private final RuleCall cIDTerminalRuleCall_1_1 = (RuleCall)cGroup_1.eContents().get(1);
+
+ //EXTENDED_ID:
+ // ID ('.' ID)*;
+ @Override public ParserRule getRule() { return rule; }
+
+ //ID ('.' ID)*
+ public Group getGroup() { return cGroup; }
+
+ //ID
+ public RuleCall getIDTerminalRuleCall_0() { return cIDTerminalRuleCall_0; }
+
+ //('.' ID)*
+ public Group getGroup_1() { return cGroup_1; }
+
+ //'.'
+ public Keyword getFullStopKeyword_1_0() { return cFullStopKeyword_1_0; }
+
+ //ID
+ public RuleCall getIDTerminalRuleCall_1_1() { return cIDTerminalRuleCall_1_1; }
+ }
+ public class DSL_REFElements extends AbstractParserRuleElementFinder {
+ private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.sensinact.studio.language.Sensinact.DSL_REF");
+ private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+ private final RuleCall cDSL_CEP_STATEMENTParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
+ private final RuleCall cDSL_ResourceParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
+
+ //// ================
+ //// Basic structures
+ //// ================
+ //DSL_REF:
+ // DSL_CEP_STATEMENT | DSL_Resource;
+ @Override public ParserRule getRule() { return rule; }
+
+ //DSL_CEP_STATEMENT | DSL_Resource
+ public Alternatives getAlternatives() { return cAlternatives; }
+
+ //DSL_CEP_STATEMENT
+ public RuleCall getDSL_CEP_STATEMENTParserRuleCall_0() { return cDSL_CEP_STATEMENTParserRuleCall_0; }
+
+ //DSL_Resource
+ public RuleCall getDSL_ResourceParserRuleCall_1() { return cDSL_ResourceParserRuleCall_1; }
+ }
+ public class DSL_REF_CONDITIONElements extends AbstractParserRuleElementFinder {
+ private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.sensinact.studio.language.Sensinact.DSL_REF_CONDITION");
+ private final Group cGroup = (Group)rule.eContents().get(1);
+ private final Assignment cRefAssignment_0 = (Assignment)cGroup.eContents().get(0);
+ private final CrossReference cRefDSL_REFCrossReference_0_0 = (CrossReference)cRefAssignment_0.eContents().get(0);
+ private final RuleCall cRefDSL_REFIDTerminalRuleCall_0_0_1 = (RuleCall)cRefDSL_REFCrossReference_0_0.eContents().get(1);
+ private final Keyword cFullStopKeyword_1 = (Keyword)cGroup.eContents().get(1);
+ private final Keyword cSubscribeKeyword_2 = (Keyword)cGroup.eContents().get(2);
+ private final Keyword cLeftParenthesisKeyword_3 = (Keyword)cGroup.eContents().get(3);
+ private final Keyword cRightParenthesisKeyword_4 = (Keyword)cGroup.eContents().get(4);
+
+ //// =============
+ //// REF condition
+ //// =============
+ //DSL_REF_CONDITION:
+ // ref=[DSL_REF] '.' 'subscribe' '(' ')';
+ @Override public ParserRule getRule() { return rule; }
+
+ //ref=[DSL_REF] '.' 'subscribe' '(' ')'
+ public Group getGroup() { return cGroup; }
+
+ //ref=[DSL_REF]
+ public Assignment getRefAssignment_0() { return cRefAssignment_0; }
+
+ //[DSL_REF]
+ public CrossReference getRefDSL_REFCrossReference_0_0() { return cRefDSL_REFCrossReference_0_0; }
+
+ //ID
+ public RuleCall getRefDSL_REFIDTerminalRuleCall_0_0_1() { return cRefDSL_REFIDTerminalRuleCall_0_0_1; }
+
+ //'.'
+ public Keyword getFullStopKeyword_1() { return cFullStopKeyword_1; }
+
+ //'subscribe'
+ public Keyword getSubscribeKeyword_2() { return cSubscribeKeyword_2; }
+
+ //'('
+ public Keyword getLeftParenthesisKeyword_3() { return cLeftParenthesisKeyword_3; }
+
+ //')'
+ public Keyword getRightParenthesisKeyword_4() { return cRightParenthesisKeyword_4; }
+ }
+ public class DSL_CEP_STATEMENTElements extends AbstractParserRuleElementFinder {
+ private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.sensinact.studio.language.Sensinact.DSL_CEP_STATEMENT");
+ private final Group cGroup = (Group)rule.eContents().get(1);
+ private final Keyword cDefineKeyword_0 = (Keyword)cGroup.eContents().get(0);
+ private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
+ private final RuleCall cNameIDTerminalRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
+ private final Keyword cEqualsSignKeyword_2 = (Keyword)cGroup.eContents().get(2);
+ private final Assignment cOperationAssignment_3 = (Assignment)cGroup.eContents().get(3);
+ private final Alternatives cOperationAlternatives_3_0 = (Alternatives)cOperationAssignment_3.eContents().get(0);
+ private final RuleCall cOperationDSL_CEP_AFTERParserRuleCall_3_0_0 = (RuleCall)cOperationAlternatives_3_0.eContents().get(0);
+ private final RuleCall cOperationDSL_CEP_BEFOREParserRuleCall_3_0_1 = (RuleCall)cOperationAlternatives_3_0.eContents().get(1);
+ private final RuleCall cOperationDSL_CEP_COINCIDEParserRuleCall_3_0_2 = (RuleCall)cOperationAlternatives_3_0.eContents().get(2);
+ private final RuleCall cOperationDSL_CEP_MINParserRuleCall_3_0_3 = (RuleCall)cOperationAlternatives_3_0.eContents().get(3);
+ private final RuleCall cOperationDSL_CEP_MAXParserRuleCall_3_0_4 = (RuleCall)cOperationAlternatives_3_0.eContents().get(4);
+ private final RuleCall cOperationDSL_CEP_AVGParserRuleCall_3_0_5 = (RuleCall)cOperationAlternatives_3_0.eContents().get(5);
+ private final RuleCall cOperationDSL_CEP_SUMParserRuleCall_3_0_6 = (RuleCall)cOperationAlternatives_3_0.eContents().get(6);
+ private final RuleCall cOperationDSL_CEP_COUNTParserRuleCall_3_0_7 = (RuleCall)cOperationAlternatives_3_0.eContents().get(7);
+
+ //// ==========
+ //// CEP engine
+ //// ==========
+ //DSL_CEP_STATEMENT:
+ // 'define' name=ID '=' operation=(DSL_CEP_AFTER | DSL_CEP_BEFORE | DSL_CEP_COINCIDE | DSL_CEP_MIN | DSL_CEP_MAX |
+ // DSL_CEP_AVG | DSL_CEP_SUM | DSL_CEP_COUNT);
+ @Override public ParserRule getRule() { return rule; }
+
+ //'define' name=ID '=' operation=(DSL_CEP_AFTER | DSL_CEP_BEFORE | DSL_CEP_COINCIDE | DSL_CEP_MIN | DSL_CEP_MAX |
+ //DSL_CEP_AVG | DSL_CEP_SUM | DSL_CEP_COUNT)
+ public Group getGroup() { return cGroup; }
+
+ //'define'
+ public Keyword getDefineKeyword_0() { return cDefineKeyword_0; }
+
+ //name=ID
+ public Assignment getNameAssignment_1() { return cNameAssignment_1; }
+
+ //ID
+ public RuleCall getNameIDTerminalRuleCall_1_0() { return cNameIDTerminalRuleCall_1_0; }
+
+ //'='
+ public Keyword getEqualsSignKeyword_2() { return cEqualsSignKeyword_2; }
+
+ //operation=(DSL_CEP_AFTER | DSL_CEP_BEFORE | DSL_CEP_COINCIDE | DSL_CEP_MIN | DSL_CEP_MAX | DSL_CEP_AVG | DSL_CEP_SUM |
+ //DSL_CEP_COUNT)
+ public Assignment getOperationAssignment_3() { return cOperationAssignment_3; }
+
+ //(DSL_CEP_AFTER | DSL_CEP_BEFORE | DSL_CEP_COINCIDE | DSL_CEP_MIN | DSL_CEP_MAX | DSL_CEP_AVG | DSL_CEP_SUM |
+ //DSL_CEP_COUNT)
+ public Alternatives getOperationAlternatives_3_0() { return cOperationAlternatives_3_0; }
+
+ //DSL_CEP_AFTER
+ public RuleCall getOperationDSL_CEP_AFTERParserRuleCall_3_0_0() { return cOperationDSL_CEP_AFTERParserRuleCall_3_0_0; }
+
+ //DSL_CEP_BEFORE
+ public RuleCall getOperationDSL_CEP_BEFOREParserRuleCall_3_0_1() { return cOperationDSL_CEP_BEFOREParserRuleCall_3_0_1; }
+
+ //DSL_CEP_COINCIDE
+ public RuleCall getOperationDSL_CEP_COINCIDEParserRuleCall_3_0_2() { return cOperationDSL_CEP_COINCIDEParserRuleCall_3_0_2; }
+
+ //DSL_CEP_MIN
+ public RuleCall getOperationDSL_CEP_MINParserRuleCall_3_0_3() { return cOperationDSL_CEP_MINParserRuleCall_3_0_3; }
+
+ //DSL_CEP_MAX
+ public RuleCall getOperationDSL_CEP_MAXParserRuleCall_3_0_4() { return cOperationDSL_CEP_MAXParserRuleCall_3_0_4; }
+
+ //DSL_CEP_AVG
+ public RuleCall getOperationDSL_CEP_AVGParserRuleCall_3_0_5() { return cOperationDSL_CEP_AVGParserRuleCall_3_0_5; }
+
+ //DSL_CEP_SUM
+ public RuleCall getOperationDSL_CEP_SUMParserRuleCall_3_0_6() { return cOperationDSL_CEP_SUMParserRuleCall_3_0_6; }
+
+ //DSL_CEP_COUNT
+ public RuleCall getOperationDSL_CEP_COUNTParserRuleCall_3_0_7() { return cOperationDSL_CEP_COUNTParserRuleCall_3_0_7; }
+ }
+ public class DSL_CEP_AFTERElements extends AbstractParserRuleElementFinder {
+ private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.sensinact.studio.language.Sensinact.DSL_CEP_AFTER");
+ private final Group cGroup = (Group)rule.eContents().get(1);
+ private final Keyword cAfterKeyword_0 = (Keyword)cGroup.eContents().get(0);
+ private final Keyword cLeftParenthesisKeyword_1 = (Keyword)cGroup.eContents().get(1);
+ private final Assignment cRef1Assignment_2 = (Assignment)cGroup.eContents().get(2);
+ private final RuleCall cRef1DSL_REF_CONDITIONParserRuleCall_2_0 = (RuleCall)cRef1Assignment_2.eContents().get(0);
+ private final Keyword cCommaKeyword_3 = (Keyword)cGroup.eContents().get(3);
+ private final Assignment cRef2Assignment_4 = (Assignment)cGroup.eContents().get(4);
+ private final RuleCall cRef2DSL_REF_CONDITIONParserRuleCall_4_0 = (RuleCall)cRef2Assignment_4.eContents().get(0);
+ private final Keyword cCommaKeyword_5 = (Keyword)cGroup.eContents().get(5);
+ private final Group cGroup_6 = (Group)cGroup.eContents().get(6);
+ private final Assignment cStartAssignment_6_0 = (Assignment)cGroup_6.eContents().get(0);
+ private final RuleCall cStartDSL_CEP_DURATIONParserRuleCall_6_0_0 = (RuleCall)cStartAssignment_6_0.eContents().get(0);
+ private final Keyword cCommaKeyword_6_1 = (Keyword)cGroup_6.eContents().get(1);
+ private final Assignment cEndAssignment_7 = (Assignment)cGroup.eContents().get(7);
+ private final RuleCall cEndDSL_CEP_DURATIONParserRuleCall_7_0 = (RuleCall)cEndAssignment_7.eContents().get(0);
+ private final Keyword cRightParenthesisKeyword_8 = (Keyword)cGroup.eContents().get(8);
+
+ //DSL_CEP_AFTER:
+ // 'after' '(' ref1=DSL_REF_CONDITION ',' ref2=DSL_REF_CONDITION ',' (start=DSL_CEP_DURATION ',')? end=DSL_CEP_DURATION
+ // ')';
+ @Override public ParserRule getRule() { return rule; }
+
+ //'after' '(' ref1=DSL_REF_CONDITION ',' ref2=DSL_REF_CONDITION ',' (start=DSL_CEP_DURATION ',')? end=DSL_CEP_DURATION ')'
+ public Group getGroup() { return cGroup; }
+
+ //'after'
+ public Keyword getAfterKeyword_0() { return cAfterKeyword_0; }
+
+ //'('
+ public Keyword getLeftParenthesisKeyword_1() { return cLeftParenthesisKeyword_1; }
+
+ //ref1=DSL_REF_CONDITION
+ public Assignment getRef1Assignment_2() { return cRef1Assignment_2; }
+
+ //DSL_REF_CONDITION
+ public RuleCall getRef1DSL_REF_CONDITIONParserRuleCall_2_0() { return cRef1DSL_REF_CONDITIONParserRuleCall_2_0; }
+
+ //','
+ public Keyword getCommaKeyword_3() { return cCommaKeyword_3; }
+
+ //ref2=DSL_REF_CONDITION
+ public Assignment getRef2Assignment_4() { return cRef2Assignment_4; }
+
+ //DSL_REF_CONDITION
+ public RuleCall getRef2DSL_REF_CONDITIONParserRuleCall_4_0() { return cRef2DSL_REF_CONDITIONParserRuleCall_4_0; }
+
+ //','
+ public Keyword getCommaKeyword_5() { return cCommaKeyword_5; }
+
+ //(start=DSL_CEP_DURATION ',')?
+ public Group getGroup_6() { return cGroup_6; }
+
+ //start=DSL_CEP_DURATION
+ public Assignment getStartAssignment_6_0() { return cStartAssignment_6_0; }
+
+ //DSL_CEP_DURATION
+ public RuleCall getStartDSL_CEP_DURATIONParserRuleCall_6_0_0() { return cStartDSL_CEP_DURATIONParserRuleCall_6_0_0; }
+
+ //','
+ public Keyword getCommaKeyword_6_1() { return cCommaKeyword_6_1; }
+
+ //end=DSL_CEP_DURATION
+ public Assignment getEndAssignment_7() { return cEndAssignment_7; }
+
+ //DSL_CEP_DURATION
+ public RuleCall getEndDSL_CEP_DURATIONParserRuleCall_7_0() { return cEndDSL_CEP_DURATIONParserRuleCall_7_0; }
+
+ //')'
+ public Keyword getRightParenthesisKeyword_8() { return cRightParenthesisKeyword_8; }
+ }
+ public class DSL_CEP_BEFOREElements extends AbstractParserRuleElementFinder {
+ private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.sensinact.studio.language.Sensinact.DSL_CEP_BEFORE");
+ private final Group cGroup = (Group)rule.eContents().get(1);
+ private final Keyword cBeforeKeyword_0 = (Keyword)cGroup.eContents().get(0);
+ private final Keyword cLeftParenthesisKeyword_1 = (Keyword)cGroup.eContents().get(1);
+ private final Assignment cRef1Assignment_2 = (Assignment)cGroup.eContents().get(2);
+ private final RuleCall cRef1DSL_REF_CONDITIONParserRuleCall_2_0 = (RuleCall)cRef1Assignment_2.eContents().get(0);
+ private final Keyword cCommaKeyword_3 = (Keyword)cGroup.eContents().get(3);
+ private final Assignment cRef2Assignment_4 = (Assignment)cGroup.eContents().get(4);
+ private final RuleCall cRef2DSL_REF_CONDITIONParserRuleCall_4_0 = (RuleCall)cRef2Assignment_4.eContents().get(0);
+ private final Keyword cCommaKeyword_5 = (Keyword)cGroup.eContents().get(5);
+ private final Group cGroup_6 = (Group)cGroup.eContents().get(6);
+ private final Assignment cStartAssignment_6_0 = (Assignment)cGroup_6.eContents().get(0);
+ private final RuleCall cStartDSL_CEP_DURATIONParserRuleCall_6_0_0 = (RuleCall)cStartAssignment_6_0.eContents().get(0);
+ private final Keyword cCommaKeyword_6_1 = (Keyword)cGroup_6.eContents().get(1);
+ private final Assignment cEndAssignment_7 = (Assignment)cGroup.eContents().get(7);
+ private final RuleCall cEndDSL_CEP_DURATIONParserRuleCall_7_0 = (RuleCall)cEndAssignment_7.eContents().get(0);
+ private final Keyword cRightParenthesisKeyword_8 = (Keyword)cGroup.eContents().get(8);
+
+ //DSL_CEP_BEFORE:
+ // 'before' '(' ref1=DSL_REF_CONDITION ',' ref2=DSL_REF_CONDITION ',' (start=DSL_CEP_DURATION ',')? end=DSL_CEP_DURATION
+ // ')';
+ @Override public ParserRule getRule() { return rule; }
+
+ //'before' '(' ref1=DSL_REF_CONDITION ',' ref2=DSL_REF_CONDITION ',' (start=DSL_CEP_DURATION ',')? end=DSL_CEP_DURATION
+ //')'
+ public Group getGroup() { return cGroup; }
+
+ //'before'
+ public Keyword getBeforeKeyword_0() { return cBeforeKeyword_0; }
+
+ //'('
+ public Keyword getLeftParenthesisKeyword_1() { return cLeftParenthesisKeyword_1; }
+
+ //ref1=DSL_REF_CONDITION
+ public Assignment getRef1Assignment_2() { return cRef1Assignment_2; }
+
+ //DSL_REF_CONDITION
+ public RuleCall getRef1DSL_REF_CONDITIONParserRuleCall_2_0() { return cRef1DSL_REF_CONDITIONParserRuleCall_2_0; }
+
+ //','
+ public Keyword getCommaKeyword_3() { return cCommaKeyword_3; }
+
+ //ref2=DSL_REF_CONDITION
+ public Assignment getRef2Assignment_4() { return cRef2Assignment_4; }
+
+ //DSL_REF_CONDITION
+ public RuleCall getRef2DSL_REF_CONDITIONParserRuleCall_4_0() { return cRef2DSL_REF_CONDITIONParserRuleCall_4_0; }
+
+ //','
+ public Keyword getCommaKeyword_5() { return cCommaKeyword_5; }
+
+ //(start=DSL_CEP_DURATION ',')?
+ public Group getGroup_6() { return cGroup_6; }
+
+ //start=DSL_CEP_DURATION
+ public Assignment getStartAssignment_6_0() { return cStartAssignment_6_0; }
+
+ //DSL_CEP_DURATION
+ public RuleCall getStartDSL_CEP_DURATIONParserRuleCall_6_0_0() { return cStartDSL_CEP_DURATIONParserRuleCall_6_0_0; }
+
+ //','
+ public Keyword getCommaKeyword_6_1() { return cCommaKeyword_6_1; }
+
+ //end=DSL_CEP_DURATION
+ public Assignment getEndAssignment_7() { return cEndAssignment_7; }
+
+ //DSL_CEP_DURATION
+ public RuleCall getEndDSL_CEP_DURATIONParserRuleCall_7_0() { return cEndDSL_CEP_DURATIONParserRuleCall_7_0; }
+
+ //')'
+ public Keyword getRightParenthesisKeyword_8() { return cRightParenthesisKeyword_8; }
+ }
+ public class DSL_CEP_COINCIDEElements extends AbstractParserRuleElementFinder {
+ private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.sensinact.studio.language.Sensinact.DSL_CEP_COINCIDE");
+ private final Group cGroup = (Group)rule.eContents().get(1);
+ private final Keyword cCoincideKeyword_0 = (Keyword)cGroup.eContents().get(0);
+ private final Keyword cLeftParenthesisKeyword_1 = (Keyword)cGroup.eContents().get(1);
+ private final Assignment cRef1Assignment_2 = (Assignment)cGroup.eContents().get(2);
+ private final RuleCall cRef1DSL_REF_CONDITIONParserRuleCall_2_0 = (RuleCall)cRef1Assignment_2.eContents().get(0);
+ private final Keyword cCommaKeyword_3 = (Keyword)cGroup.eContents().get(3);
+ private final Assignment cRef2Assignment_4 = (Assignment)cGroup.eContents().get(4);
+ private final RuleCall cRef2DSL_REF_CONDITIONParserRuleCall_4_0 = (RuleCall)cRef2Assignment_4.eContents().get(0);
+ private final Keyword cCommaKeyword_5 = (Keyword)cGroup.eContents().get(5);
+ private final Assignment cWindowAssignment_6 = (Assignment)cGroup.eContents().get(6);
+ private final RuleCall cWindowDSL_CEP_DURATIONParserRuleCall_6_0 = (RuleCall)cWindowAssignment_6.eContents().get(0);
+ private final Keyword cRightParenthesisKeyword_7 = (Keyword)cGroup.eContents().get(7);
+
+ //DSL_CEP_COINCIDE:
+ // 'coincide' '(' ref1=DSL_REF_CONDITION ',' ref2=DSL_REF_CONDITION ',' window=DSL_CEP_DURATION ')';
+ @Override public ParserRule getRule() { return rule; }
+
+ //'coincide' '(' ref1=DSL_REF_CONDITION ',' ref2=DSL_REF_CONDITION ',' window=DSL_CEP_DURATION ')'
+ public Group getGroup() { return cGroup; }
+
+ //'coincide'
+ public Keyword getCoincideKeyword_0() { return cCoincideKeyword_0; }
+
+ //'('
+ public Keyword getLeftParenthesisKeyword_1() { return cLeftParenthesisKeyword_1; }
+
+ //ref1=DSL_REF_CONDITION
+ public Assignment getRef1Assignment_2() { return cRef1Assignment_2; }
+
+ //DSL_REF_CONDITION
+ public RuleCall getRef1DSL_REF_CONDITIONParserRuleCall_2_0() { return cRef1DSL_REF_CONDITIONParserRuleCall_2_0; }
+
+ //','
+ public Keyword getCommaKeyword_3() { return cCommaKeyword_3; }
+
+ //ref2=DSL_REF_CONDITION
+ public Assignment getRef2Assignment_4() { return cRef2Assignment_4; }
+
+ //DSL_REF_CONDITION
+ public RuleCall getRef2DSL_REF_CONDITIONParserRuleCall_4_0() { return cRef2DSL_REF_CONDITIONParserRuleCall_4_0; }
+
+ //','
+ public Keyword getCommaKeyword_5() { return cCommaKeyword_5; }
+
+ //window=DSL_CEP_DURATION
+ public Assignment getWindowAssignment_6() { return cWindowAssignment_6; }
+
+ //DSL_CEP_DURATION
+ public RuleCall getWindowDSL_CEP_DURATIONParserRuleCall_6_0() { return cWindowDSL_CEP_DURATIONParserRuleCall_6_0; }
+
+ //')'
+ public Keyword getRightParenthesisKeyword_7() { return cRightParenthesisKeyword_7; }
+ }
+ public class DSL_CEP_MINElements extends AbstractParserRuleElementFinder {
+ private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.sensinact.studio.language.Sensinact.DSL_CEP_MIN");
+ private final Group cGroup = (Group)rule.eContents().get(1);
+ private final Keyword cMinKeyword_0 = (Keyword)cGroup.eContents().get(0);
+ private final Keyword cLeftParenthesisKeyword_1 = (Keyword)cGroup.eContents().get(1);
+ private final Assignment cRefAssignment_2 = (Assignment)cGroup.eContents().get(2);
+ private final RuleCall cRefDSL_REF_CONDITIONParserRuleCall_2_0 = (RuleCall)cRefAssignment_2.eContents().get(0);
+ private final Keyword cCommaKeyword_3 = (Keyword)cGroup.eContents().get(3);
+ private final Assignment cWindowAssignment_4 = (Assignment)cGroup.eContents().get(4);
+ private final RuleCall cWindowDSL_CEP_DURATIONParserRuleCall_4_0 = (RuleCall)cWindowAssignment_4.eContents().get(0);
+ private final Keyword cRightParenthesisKeyword_5 = (Keyword)cGroup.eContents().get(5);
+
+ //DSL_CEP_MIN:
+ // 'min' '(' ref=DSL_REF_CONDITION ',' window=DSL_CEP_DURATION ')';
+ @Override public ParserRule getRule() { return rule; }
+
+ //'min' '(' ref=DSL_REF_CONDITION ',' window=DSL_CEP_DURATION ')'
+ public Group getGroup() { return cGroup; }
+
+ //'min'
+ public Keyword getMinKeyword_0() { return cMinKeyword_0; }
+
+ //'('
+ public Keyword getLeftParenthesisKeyword_1() { return cLeftParenthesisKeyword_1; }
+
+ //ref=DSL_REF_CONDITION
+ public Assignment getRefAssignment_2() { return cRefAssignment_2; }
+
+ //DSL_REF_CONDITION
+ public RuleCall getRefDSL_REF_CONDITIONParserRuleCall_2_0() { return cRefDSL_REF_CONDITIONParserRuleCall_2_0; }
+
+ //','
+ public Keyword getCommaKeyword_3() { return cCommaKeyword_3; }
+
+ //window=DSL_CEP_DURATION
+ public Assignment getWindowAssignment_4() { return cWindowAssignment_4; }
+
+ //DSL_CEP_DURATION
+ public RuleCall getWindowDSL_CEP_DURATIONParserRuleCall_4_0() { return cWindowDSL_CEP_DURATIONParserRuleCall_4_0; }
+
+ //')'
+ public Keyword getRightParenthesisKeyword_5() { return cRightParenthesisKeyword_5; }
+ }
+ public class DSL_CEP_MAXElements extends AbstractParserRuleElementFinder {
+ private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.sensinact.studio.language.Sensinact.DSL_CEP_MAX");
+ private final Group cGroup = (Group)rule.eContents().get(1);
+ private final Keyword cMaxKeyword_0 = (Keyword)cGroup.eContents().get(0);
+ private final Keyword cLeftParenthesisKeyword_1 = (Keyword)cGroup.eContents().get(1);
+ private final Assignment cRefAssignment_2 = (Assignment)cGroup.eContents().get(2);
+ private final RuleCall cRefDSL_REF_CONDITIONParserRuleCall_2_0 = (RuleCall)cRefAssignment_2.eContents().get(0);
+ private final Keyword cCommaKeyword_3 = (Keyword)cGroup.eContents().get(3);
+ private final Assignment cWindowAssignment_4 = (Assignment)cGroup.eContents().get(4);
+ private final RuleCall cWindowDSL_CEP_DURATIONParserRuleCall_4_0 = (RuleCall)cWindowAssignment_4.eContents().get(0);
+ private final Keyword cRightParenthesisKeyword_5 = (Keyword)cGroup.eContents().get(5);
+
+ //DSL_CEP_MAX:
+ // 'max' '(' ref=DSL_REF_CONDITION ',' window=DSL_CEP_DURATION ')';
+ @Override public ParserRule getRule() { return rule; }
+
+ //'max' '(' ref=DSL_REF_CONDITION ',' window=DSL_CEP_DURATION ')'
+ public Group getGroup() { return cGroup; }
+
+ //'max'
+ public Keyword getMaxKeyword_0() { return cMaxKeyword_0; }
+
+ //'('
+ public Keyword getLeftParenthesisKeyword_1() { return cLeftParenthesisKeyword_1; }
+
+ //ref=DSL_REF_CONDITION
+ public Assignment getRefAssignment_2() { return cRefAssignment_2; }
+
+ //DSL_REF_CONDITION
+ public RuleCall getRefDSL_REF_CONDITIONParserRuleCall_2_0() { return cRefDSL_REF_CONDITIONParserRuleCall_2_0; }
+
+ //','
+ public Keyword getCommaKeyword_3() { return cCommaKeyword_3; }
+
+ //window=DSL_CEP_DURATION
+ public Assignment getWindowAssignment_4() { return cWindowAssignment_4; }
+
+ //DSL_CEP_DURATION
+ public RuleCall getWindowDSL_CEP_DURATIONParserRuleCall_4_0() { return cWindowDSL_CEP_DURATIONParserRuleCall_4_0; }
+
+ //')'
+ public Keyword getRightParenthesisKeyword_5() { return cRightParenthesisKeyword_5; }
+ }
+ public class DSL_CEP_AVGElements extends AbstractParserRuleElementFinder {
+ private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.sensinact.studio.language.Sensinact.DSL_CEP_AVG");
+ private final Group cGroup = (Group)rule.eContents().get(1);
+ private final Keyword cAvgKeyword_0 = (Keyword)cGroup.eContents().get(0);
+ private final Keyword cLeftParenthesisKeyword_1 = (Keyword)cGroup.eContents().get(1);
+ private final Assignment cRefAssignment_2 = (Assignment)cGroup.eContents().get(2);
+ private final RuleCall cRefDSL_REF_CONDITIONParserRuleCall_2_0 = (RuleCall)cRefAssignment_2.eContents().get(0);
+ private final Keyword cCommaKeyword_3 = (Keyword)cGroup.eContents().get(3);
+ private final Assignment cWindowAssignment_4 = (Assignment)cGroup.eContents().get(4);
+ private final RuleCall cWindowDSL_CEP_DURATIONParserRuleCall_4_0 = (RuleCall)cWindowAssignment_4.eContents().get(0);
+ private final Keyword cRightParenthesisKeyword_5 = (Keyword)cGroup.eContents().get(5);
+
+ //DSL_CEP_AVG:
+ // 'avg' '(' ref=DSL_REF_CONDITION ',' window=DSL_CEP_DURATION ')';
+ @Override public ParserRule getRule() { return rule; }
+
+ //'avg' '(' ref=DSL_REF_CONDITION ',' window=DSL_CEP_DURATION ')'
+ public Group getGroup() { return cGroup; }
+
+ //'avg'
+ public Keyword getAvgKeyword_0() { return cAvgKeyword_0; }
+
+ //'('
+ public Keyword getLeftParenthesisKeyword_1() { return cLeftParenthesisKeyword_1; }
+
+ //ref=DSL_REF_CONDITION
+ public Assignment getRefAssignment_2() { return cRefAssignment_2; }
+
+ //DSL_REF_CONDITION
+ public RuleCall getRefDSL_REF_CONDITIONParserRuleCall_2_0() { return cRefDSL_REF_CONDITIONParserRuleCall_2_0; }
+
+ //','
+ public Keyword getCommaKeyword_3() { return cCommaKeyword_3; }
+
+ //window=DSL_CEP_DURATION
+ public Assignment getWindowAssignment_4() { return cWindowAssignment_4; }
+
+ //DSL_CEP_DURATION
+ public RuleCall getWindowDSL_CEP_DURATIONParserRuleCall_4_0() { return cWindowDSL_CEP_DURATIONParserRuleCall_4_0; }
+
+ //')'
+ public Keyword getRightParenthesisKeyword_5() { return cRightParenthesisKeyword_5; }
+ }
+ public class DSL_CEP_SUMElements extends AbstractParserRuleElementFinder {
+ private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.sensinact.studio.language.Sensinact.DSL_CEP_SUM");
+ private final Group cGroup = (Group)rule.eContents().get(1);
+ private final Keyword cSumKeyword_0 = (Keyword)cGroup.eContents().get(0);
+ private final Keyword cLeftParenthesisKeyword_1 = (Keyword)cGroup.eContents().get(1);
+ private final Assignment cRefAssignment_2 = (Assignment)cGroup.eContents().get(2);
+ private final RuleCall cRefDSL_REF_CONDITIONParserRuleCall_2_0 = (RuleCall)cRefAssignment_2.eContents().get(0);
+ private final Keyword cCommaKeyword_3 = (Keyword)cGroup.eContents().get(3);
+ private final Assignment cWindowAssignment_4 = (Assignment)cGroup.eContents().get(4);
+ private final RuleCall cWindowDSL_CEP_DURATIONParserRuleCall_4_0 = (RuleCall)cWindowAssignment_4.eContents().get(0);
+ private final Keyword cRightParenthesisKeyword_5 = (Keyword)cGroup.eContents().get(5);
+
+ //DSL_CEP_SUM:
+ // 'sum' '(' ref=DSL_REF_CONDITION ',' window=DSL_CEP_DURATION ')';
+ @Override public ParserRule getRule() { return rule; }
+
+ //'sum' '(' ref=DSL_REF_CONDITION ',' window=DSL_CEP_DURATION ')'
+ public Group getGroup() { return cGroup; }
+
+ //'sum'
+ public Keyword getSumKeyword_0() { return cSumKeyword_0; }
+
+ //'('
+ public Keyword getLeftParenthesisKeyword_1() { return cLeftParenthesisKeyword_1; }
+
+ //ref=DSL_REF_CONDITION
+ public Assignment getRefAssignment_2() { return cRefAssignment_2; }
+
+ //DSL_REF_CONDITION
+ public RuleCall getRefDSL_REF_CONDITIONParserRuleCall_2_0() { return cRefDSL_REF_CONDITIONParserRuleCall_2_0; }
+
+ //','
+ public Keyword getCommaKeyword_3() { return cCommaKeyword_3; }
+
+ //window=DSL_CEP_DURATION
+ public Assignment getWindowAssignment_4() { return cWindowAssignment_4; }
+
+ //DSL_CEP_DURATION
+ public RuleCall getWindowDSL_CEP_DURATIONParserRuleCall_4_0() { return cWindowDSL_CEP_DURATIONParserRuleCall_4_0; }
+
+ //')'
+ public Keyword getRightParenthesisKeyword_5() { return cRightParenthesisKeyword_5; }
+ }
+ public class DSL_CEP_COUNTElements extends AbstractParserRuleElementFinder {
+ private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.sensinact.studio.language.Sensinact.DSL_CEP_COUNT");
+ private final Group cGroup = (Group)rule.eContents().get(1);
+ private final Keyword cCountKeyword_0 = (Keyword)cGroup.eContents().get(0);
+ private final Keyword cLeftParenthesisKeyword_1 = (Keyword)cGroup.eContents().get(1);
+ private final Assignment cRefAssignment_2 = (Assignment)cGroup.eContents().get(2);
+ private final RuleCall cRefDSL_REF_CONDITIONParserRuleCall_2_0 = (RuleCall)cRefAssignment_2.eContents().get(0);
+ private final Keyword cCommaKeyword_3 = (Keyword)cGroup.eContents().get(3);
+ private final Assignment cWindowAssignment_4 = (Assignment)cGroup.eContents().get(4);
+ private final RuleCall cWindowDSL_CEP_DURATIONParserRuleCall_4_0 = (RuleCall)cWindowAssignment_4.eContents().get(0);
+ private final Keyword cRightParenthesisKeyword_5 = (Keyword)cGroup.eContents().get(5);
+
+ //DSL_CEP_COUNT:
+ // 'count' '(' ref=DSL_REF_CONDITION ',' window=DSL_CEP_DURATION ')';
+ @Override public ParserRule getRule() { return rule; }
+
+ //'count' '(' ref=DSL_REF_CONDITION ',' window=DSL_CEP_DURATION ')'
+ public Group getGroup() { return cGroup; }
+
+ //'count'
+ public Keyword getCountKeyword_0() { return cCountKeyword_0; }
+
+ //'('
+ public Keyword getLeftParenthesisKeyword_1() { return cLeftParenthesisKeyword_1; }
+
+ //ref=DSL_REF_CONDITION
+ public Assignment getRefAssignment_2() { return cRefAssignment_2; }
+
+ //DSL_REF_CONDITION
+ public RuleCall getRefDSL_REF_CONDITIONParserRuleCall_2_0() { return cRefDSL_REF_CONDITIONParserRuleCall_2_0; }
+
+ //','
+ public Keyword getCommaKeyword_3() { return cCommaKeyword_3; }
+
+ //window=DSL_CEP_DURATION
+ public Assignment getWindowAssignment_4() { return cWindowAssignment_4; }
+
+ //DSL_CEP_DURATION
+ public RuleCall getWindowDSL_CEP_DURATIONParserRuleCall_4_0() { return cWindowDSL_CEP_DURATIONParserRuleCall_4_0; }
+
+ //')'
+ public Keyword getRightParenthesisKeyword_5() { return cRightParenthesisKeyword_5; }
+ }
+ public class DSL_CEP_DURATIONElements extends AbstractParserRuleElementFinder {
+ private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.sensinact.studio.language.Sensinact.DSL_CEP_DURATION");
+ private final Assignment cUnitsAssignment = (Assignment)rule.eContents().get(1);
+ private final Alternatives cUnitsAlternatives_0 = (Alternatives)cUnitsAssignment.eContents().get(0);
+ private final RuleCall cUnitsDSL_CEP_DURATION_MINParserRuleCall_0_0 = (RuleCall)cUnitsAlternatives_0.eContents().get(0);
+ private final RuleCall cUnitsDSL_CEP_DURATION_SECParserRuleCall_0_1 = (RuleCall)cUnitsAlternatives_0.eContents().get(1);
+
+ //DSL_CEP_DURATION:
+ // units+=(DSL_CEP_DURATION_MIN | DSL_CEP_DURATION_SEC)+;
+ @Override public ParserRule getRule() { return rule; }
+
+ //units+=(DSL_CEP_DURATION_MIN | DSL_CEP_DURATION_SEC)+
+ public Assignment getUnitsAssignment() { return cUnitsAssignment; }
+
+ //(DSL_CEP_DURATION_MIN | DSL_CEP_DURATION_SEC)
+ public Alternatives getUnitsAlternatives_0() { return cUnitsAlternatives_0; }
+
+ //DSL_CEP_DURATION_MIN
+ public RuleCall getUnitsDSL_CEP_DURATION_MINParserRuleCall_0_0() { return cUnitsDSL_CEP_DURATION_MINParserRuleCall_0_0; }
+
+ //DSL_CEP_DURATION_SEC
+ public RuleCall getUnitsDSL_CEP_DURATION_SECParserRuleCall_0_1() { return cUnitsDSL_CEP_DURATION_SECParserRuleCall_0_1; }
+ }
+ public class DSL_CEP_DURATION_MINElements extends AbstractParserRuleElementFinder {
+ private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.sensinact.studio.language.Sensinact.DSL_CEP_DURATION_MIN");
+ private final Group cGroup = (Group)rule.eContents().get(1);
+ private final Assignment cMinAssignment_0 = (Assignment)cGroup.eContents().get(0);
+ private final RuleCall cMinNUMBERParserRuleCall_0_0 = (RuleCall)cMinAssignment_0.eContents().get(0);
+ private final Keyword cMinKeyword_1 = (Keyword)cGroup.eContents().get(1);
+
+ //DSL_CEP_DURATION_MIN:
+ // min=NUMBER 'min';
+ @Override public ParserRule getRule() { return rule; }
+
+ //min=NUMBER 'min'
+ public Group getGroup() { return cGroup; }
+
+ //min=NUMBER
+ public Assignment getMinAssignment_0() { return cMinAssignment_0; }
+
+ //NUMBER
+ public RuleCall getMinNUMBERParserRuleCall_0_0() { return cMinNUMBERParserRuleCall_0_0; }
+
+ //'min'
+ public Keyword getMinKeyword_1() { return cMinKeyword_1; }
+ }
+ public class DSL_CEP_DURATION_SECElements extends AbstractParserRuleElementFinder {
+ private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.sensinact.studio.language.Sensinact.DSL_CEP_DURATION_SEC");
+ private final Group cGroup = (Group)rule.eContents().get(1);
+ private final Assignment cSecAssignment_0 = (Assignment)cGroup.eContents().get(0);
+ private final RuleCall cSecNUMBERParserRuleCall_0_0 = (RuleCall)cSecAssignment_0.eContents().get(0);
+ private final Keyword cSecKeyword_1 = (Keyword)cGroup.eContents().get(1);
+
+ //DSL_CEP_DURATION_SEC:
+ // sec=NUMBER 'sec';
+ @Override public ParserRule getRule() { return rule; }
+
+ //sec=NUMBER 'sec'
+ public Group getGroup() { return cGroup; }
+
+ //sec=NUMBER
+ public Assignment getSecAssignment_0() { return cSecAssignment_0; }
+
+ //NUMBER
+ public RuleCall getSecNUMBERParserRuleCall_0_0() { return cSecNUMBERParserRuleCall_0_0; }
+
+ //'sec'
+ public Keyword getSecKeyword_1() { return cSecKeyword_1; }
+ }
+ public class DSL_ListActionsElements extends AbstractParserRuleElementFinder {
+ private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.sensinact.studio.language.Sensinact.DSL_ListActions");
+ private final Group cGroup = (Group)rule.eContents().get(1);
+ private final Assignment cActionListAssignment_0 = (Assignment)cGroup.eContents().get(0);
+ private final RuleCall cActionListDSL_ResourceActionParserRuleCall_0_0 = (RuleCall)cActionListAssignment_0.eContents().get(0);
+ private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
+ private final Keyword cCommaKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
+ private final Assignment cActionListAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
+ private final RuleCall cActionListDSL_ResourceActionParserRuleCall_1_1_0 = (RuleCall)cActionListAssignment_1_1.eContents().get(0);
+
+ //// ============================
+ //// ECA engine : DSL_ListActions
+ //// ============================
+ //DSL_ListActions:
+ // actionList+=DSL_ResourceAction (',' actionList+=DSL_ResourceAction)*;
+ @Override public ParserRule getRule() { return rule; }
+
+ //actionList+=DSL_ResourceAction (',' actionList+=DSL_ResourceAction)*
+ public Group getGroup() { return cGroup; }
+
+ //actionList+=DSL_ResourceAction
+ public Assignment getActionListAssignment_0() { return cActionListAssignment_0; }
+
+ //DSL_ResourceAction
+ public RuleCall getActionListDSL_ResourceActionParserRuleCall_0_0() { return cActionListDSL_ResourceActionParserRuleCall_0_0; }
+
+ //(',' actionList+=DSL_ResourceAction)*
+ public Group getGroup_1() { return cGroup_1; }
+
+ //','
+ public Keyword getCommaKeyword_1_0() { return cCommaKeyword_1_0; }
+
+ //actionList+=DSL_ResourceAction
+ public Assignment getActionListAssignment_1_1() { return cActionListAssignment_1_1; }
+
+ //DSL_ResourceAction
+ public RuleCall getActionListDSL_ResourceActionParserRuleCall_1_1_0() { return cActionListDSL_ResourceActionParserRuleCall_1_1_0; }
+ }
+ public class DSL_ResourceActionElements extends AbstractParserRuleElementFinder {
+ private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.sensinact.studio.language.Sensinact.DSL_ResourceAction");
+ private final Group cGroup = (Group)rule.eContents().get(1);
+ private final Group cGroup_0 = (Group)cGroup.eContents().get(0);
+ private final Assignment cVariableAssignment_0_0 = (Assignment)cGroup_0.eContents().get(0);
+ private final RuleCall cVariableIDTerminalRuleCall_0_0_0 = (RuleCall)cVariableAssignment_0_0.eContents().get(0);
+ private final Keyword cEqualsSignKeyword_0_1 = (Keyword)cGroup_0.eContents().get(1);
+ private final Assignment cRefAssignment_1 = (Assignment)cGroup.eContents().get(1);
+ private final CrossReference cRefDSL_REFCrossReference_1_0 = (CrossReference)cRefAssignment_1.eContents().get(0);
+ private final RuleCall cRefDSL_REFIDTerminalRuleCall_1_0_1 = (RuleCall)cRefDSL_REFCrossReference_1_0.eContents().get(1);
+ private final Keyword cFullStopKeyword_2 = (Keyword)cGroup.eContents().get(2);
+ private final Assignment cActiontypeAssignment_3 = (Assignment)cGroup.eContents().get(3);
+ private final Alternatives cActiontypeAlternatives_3_0 = (Alternatives)cActiontypeAssignment_3.eContents().get(0);
+ private final Keyword cActiontypeActKeyword_3_0_0 = (Keyword)cActiontypeAlternatives_3_0.eContents().get(0);
+ private final Keyword cActiontypeSetKeyword_3_0_1 = (Keyword)cActiontypeAlternatives_3_0.eContents().get(1);
+ private final Keyword cLeftParenthesisKeyword_4 = (Keyword)cGroup.eContents().get(4);
+ private final Assignment cListParamAssignment_5 = (Assignment)cGroup.eContents().get(5);
+ private final RuleCall cListParamDSL_ListParamParserRuleCall_5_0 = (RuleCall)cListParamAssignment_5.eContents().get(0);
+ private final Keyword cRightParenthesisKeyword_6 = (Keyword)cGroup.eContents().get(6);
+
+ //DSL_ResourceAction:
+ // (variable=ID '=')? ref=[DSL_REF] '.' actiontype=('act' | 'set') '(' listParam=DSL_ListParam? ')';
+ @Override public ParserRule getRule() { return rule; }
+
+ //(variable=ID '=')? ref=[DSL_REF] '.' actiontype=('act' | 'set') '(' listParam=DSL_ListParam? ')'
+ public Group getGroup() { return cGroup; }
+
+ //(variable=ID '=')?
+ public Group getGroup_0() { return cGroup_0; }
+
+ //variable=ID
+ public Assignment getVariableAssignment_0_0() { return cVariableAssignment_0_0; }
+
+ //ID
+ public RuleCall getVariableIDTerminalRuleCall_0_0_0() { return cVariableIDTerminalRuleCall_0_0_0; }
+
+ //'='
+ public Keyword getEqualsSignKeyword_0_1() { return cEqualsSignKeyword_0_1; }
+
+ //ref=[DSL_REF]
+ public Assignment getRefAssignment_1() { return cRefAssignment_1; }
+
+ //[DSL_REF]
+ public CrossReference getRefDSL_REFCrossReference_1_0() { return cRefDSL_REFCrossReference_1_0; }
+
+ //ID
+ public RuleCall getRefDSL_REFIDTerminalRuleCall_1_0_1() { return cRefDSL_REFIDTerminalRuleCall_1_0_1; }
+
+ //'.'
+ public Keyword getFullStopKeyword_2() { return cFullStopKeyword_2; }
+
+ //actiontype=('act' | 'set')
+ public Assignment getActiontypeAssignment_3() { return cActiontypeAssignment_3; }
+
+ //('act' | 'set')
+ public Alternatives getActiontypeAlternatives_3_0() { return cActiontypeAlternatives_3_0; }
+
+ //'act'
+ public Keyword getActiontypeActKeyword_3_0_0() { return cActiontypeActKeyword_3_0_0; }
+
+ //'set'
+ public Keyword getActiontypeSetKeyword_3_0_1() { return cActiontypeSetKeyword_3_0_1; }
+
+ //'('
+ public Keyword getLeftParenthesisKeyword_4() { return cLeftParenthesisKeyword_4; }
+
+ //listParam=DSL_ListParam?
+ public Assignment getListParamAssignment_5() { return cListParamAssignment_5; }
+
+ //DSL_ListParam
+ public RuleCall getListParamDSL_ListParamParserRuleCall_5_0() { return cListParamDSL_ListParamParserRuleCall_5_0; }
+
+ //')'
+ public Keyword getRightParenthesisKeyword_6() { return cRightParenthesisKeyword_6; }
+ }
+ public class DSL_ListParamElements extends AbstractParserRuleElementFinder {
+ private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.sensinact.studio.language.Sensinact.DSL_ListParam");
+ private final Group cGroup = (Group)rule.eContents().get(1);
+ private final Assignment cParamAssignment_0 = (Assignment)cGroup.eContents().get(0);
+ private final RuleCall cParamDSL_Expression_OrParserRuleCall_0_0 = (RuleCall)cParamAssignment_0.eContents().get(0);
+ private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
+ private final Keyword cCommaKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
+ private final Assignment cParamAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
+ private final RuleCall cParamDSL_Expression_OrParserRuleCall_1_1_0 = (RuleCall)cParamAssignment_1_1.eContents().get(0);
+
+ //DSL_ListParam:
+ // param+=DSL_Expression_Or (',' param+=DSL_Expression_Or)*;
+ @Override public ParserRule getRule() { return rule; }
+
+ //param+=DSL_Expression_Or (',' param+=DSL_Expression_Or)*
+ public Group getGroup() { return cGroup; }
+
+ //param+=DSL_Expression_Or
+ public Assignment getParamAssignment_0() { return cParamAssignment_0; }
+
+ //DSL_Expression_Or
+ public RuleCall getParamDSL_Expression_OrParserRuleCall_0_0() { return cParamDSL_Expression_OrParserRuleCall_0_0; }
+
+ //(',' param+=DSL_Expression_Or)*
+ public Group getGroup_1() { return cGroup_1; }
+
+ //','
+ public Keyword getCommaKeyword_1_0() { return cCommaKeyword_1_0; }
+
+ //param+=DSL_Expression_Or
+ public Assignment getParamAssignment_1_1() { return cParamAssignment_1_1; }
+
+ //DSL_Expression_Or
+ public RuleCall getParamDSL_Expression_OrParserRuleCall_1_1_0() { return cParamDSL_Expression_OrParserRuleCall_1_1_0; }
+ }
+ public class DSL_Expression_OrElements extends AbstractParserRuleElementFinder {
+ private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.sensinact.studio.language.Sensinact.DSL_Expression_Or");
+ private final Group cGroup = (Group)rule.eContents().get(1);
+ private final RuleCall cDSL_Expression_AndParserRuleCall_0 = (RuleCall)cGroup.eContents().get(0);
+ private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
+ private final Keyword cOrKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
+ private final Action cDSL_Expression_OrLeftAction_1_1 = (Action)cGroup_1.eContents().get(1);
+ private final Assignment cRightAssignment_1_2 = (Assignment)cGroup_1.eContents().get(2);
+ private final RuleCall cRightDSL_Expression_AndParserRuleCall_1_2_0 = (RuleCall)cRightAssignment_1_2.eContents().get(0);
+
+ //// ===========
+ //// Expressions
+ //// ===========
+ ////
+ //// 7 () functions : not, concatenate
+ //// 6 * / %
+ //// 5 + -
+ //// 4 < > <= >=
+ //// 3 == !=
+ //// 2 and
+ //// 1 or
+ ////
+ //// Or: left associative, priority 1
+ //DSL_Expression_Or DSL_Expression:
+ // DSL_Expression_And ('or' {DSL_Expression_Or.left=current} right=DSL_Expression_And)*
+ @Override public ParserRule getRule() { return rule; }
+
+ //DSL_Expression_And ('or' {DSL_Expression_Or.left=current} right=DSL_Expression_And)*
+ public Group getGroup() { return cGroup; }
+
+ //DSL_Expression_And
+ public RuleCall getDSL_Expression_AndParserRuleCall_0() { return cDSL_Expression_AndParserRuleCall_0; }
+
+ //('or' {DSL_Expression_Or.left=current} right=DSL_Expression_And)*
+ public Group getGroup_1() { return cGroup_1; }
+
+ //'or'
+ public Keyword getOrKeyword_1_0() { return cOrKeyword_1_0; }
+
+ //{DSL_Expression_Or.left=current}
+ public Action getDSL_Expression_OrLeftAction_1_1() { return cDSL_Expression_OrLeftAction_1_1; }
+
+ //right=DSL_Expression_And
+ public Assignment getRightAssignment_1_2() { return cRightAssignment_1_2; }
+
+ //DSL_Expression_And
+ public RuleCall getRightDSL_Expression_AndParserRuleCall_1_2_0() { return cRightDSL_Expression_AndParserRuleCall_1_2_0; }
+ }
+ public class DSL_Expression_AndElements extends AbstractParserRuleElementFinder {
+ private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.sensinact.studio.language.Sensinact.DSL_Expression_And");
+ private final Group cGroup = (Group)rule.eContents().get(1);
+ private final RuleCall cDSL_Expression_DiffEqualParserRuleCall_0 = (RuleCall)cGroup.eContents().get(0);
+ private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
+ private final Keyword cAndKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
+ private final Action cDSL_Expression_AndLeftAction_1_1 = (Action)cGroup_1.eContents().get(1);
+ private final Assignment cRightAssignment_1_2 = (Assignment)cGroup_1.eContents().get(2);
+ private final RuleCall cRightDSL_Expression_DiffEqualParserRuleCall_1_2_0 = (RuleCall)cRightAssignment_1_2.eContents().get(0);
+
+ //// And: left associative, priority 2
+ //DSL_Expression_And DSL_Expression:
+ // DSL_Expression_DiffEqual ('and' {DSL_Expression_And.left=current} right=DSL_Expression_DiffEqual)*
+ @Override public ParserRule getRule() { return rule; }
+
+ //DSL_Expression_DiffEqual ('and' {DSL_Expression_And.left=current} right=DSL_Expression_DiffEqual)*
+ public Group getGroup() { return cGroup; }
+
+ //DSL_Expression_DiffEqual
+ public RuleCall getDSL_Expression_DiffEqualParserRuleCall_0() { return cDSL_Expression_DiffEqualParserRuleCall_0; }
+
+ //('and' {DSL_Expression_And.left=current} right=DSL_Expression_DiffEqual)*
+ public Group getGroup_1() { return cGroup_1; }
+
+ //'and'
+ public Keyword getAndKeyword_1_0() { return cAndKeyword_1_0; }
+
+ //{DSL_Expression_And.left=current}
+ public Action getDSL_Expression_AndLeftAction_1_1() { return cDSL_Expression_AndLeftAction_1_1; }
+
+ //right=DSL_Expression_DiffEqual
+ public Assignment getRightAssignment_1_2() { return cRightAssignment_1_2; }
+
+ //DSL_Expression_DiffEqual
+ public RuleCall getRightDSL_Expression_DiffEqualParserRuleCall_1_2_0() { return cRightDSL_Expression_DiffEqualParserRuleCall_1_2_0; }
+ }
+ public class DSL_Expression_DiffEqualElements extends AbstractParserRuleElementFinder {
+ private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.sensinact.studio.language.Sensinact.DSL_Expression_DiffEqual");
+ private final Group cGroup = (Group)rule.eContents().get(1);
+ private final RuleCall cDSL_Expression_CompareParserRuleCall_0 = (RuleCall)cGroup.eContents().get(0);
+ private final Alternatives cAlternatives_1 = (Alternatives)cGroup.eContents().get(1);
+ private final Group cGroup_1_0 = (Group)cAlternatives_1.eContents().get(0);
+ private final Keyword cExclamationMarkEqualsSignKeyword_1_0_0 = (Keyword)cGroup_1_0.eContents().get(0);
+ private final Action cDSL_Expression_DiffLeftAction_1_0_1 = (Action)cGroup_1_0.eContents().get(1);
+ private final Assignment cRightAssignment_1_0_2 = (Assignment)cGroup_1_0.eContents().get(2);
+ private final RuleCall cRightDSL_Expression_CompareParserRuleCall_1_0_2_0 = (RuleCall)cRightAssignment_1_0_2.eContents().get(0);
+ private final Group cGroup_1_1 = (Group)cAlternatives_1.eContents().get(1);
+ private final Keyword cEqualsSignEqualsSignKeyword_1_1_0 = (Keyword)cGroup_1_1.eContents().get(0);
+ private final Action cDSL_Expression_EqualLeftAction_1_1_1 = (Action)cGroup_1_1.eContents().get(1);
+ private final Assignment cRightAssignment_1_1_2 = (Assignment)cGroup_1_1.eContents().get(2);
+ private final RuleCall cRightDSL_Expression_CompareParserRuleCall_1_1_2_0 = (RuleCall)cRightAssignment_1_1_2.eContents().get(0);
+
+ //// different/equal: left associative, priority 3
+ //DSL_Expression_DiffEqual DSL_Expression:
+ // DSL_Expression_Compare ('!=' {DSL_Expression_Diff.left=current} right=DSL_Expression_Compare | '=='
+ // {DSL_Expression_Equal.left=current} right=DSL_Expression_Compare)*
+ @Override public ParserRule getRule() { return rule; }
+
+ //DSL_Expression_Compare ('!=' {DSL_Expression_Diff.left=current} right=DSL_Expression_Compare | '=='
+ //{DSL_Expression_Equal.left=current} right=DSL_Expression_Compare)*
+ public Group getGroup() { return cGroup; }
+
+ //DSL_Expression_Compare
+ public RuleCall getDSL_Expression_CompareParserRuleCall_0() { return cDSL_Expression_CompareParserRuleCall_0; }
+
+ //('!=' {DSL_Expression_Diff.left=current} right=DSL_Expression_Compare | '==' {DSL_Expression_Equal.left=current}
+ //right=DSL_Expression_Compare)*
+ public Alternatives getAlternatives_1() { return cAlternatives_1; }
+
+ //'!=' {DSL_Expression_Diff.left=current} right=DSL_Expression_Compare
+ public Group getGroup_1_0() { return cGroup_1_0; }
+
+ //'!='
+ public Keyword getExclamationMarkEqualsSignKeyword_1_0_0() { return cExclamationMarkEqualsSignKeyword_1_0_0; }
+
+ //{DSL_Expression_Diff.left=current}
+ public Action getDSL_Expression_DiffLeftAction_1_0_1() { return cDSL_Expression_DiffLeftAction_1_0_1; }
+
+ //right=DSL_Expression_Compare
+ public Assignment getRightAssignment_1_0_2() { return cRightAssignment_1_0_2; }
+
+ //DSL_Expression_Compare
+ public RuleCall getRightDSL_Expression_CompareParserRuleCall_1_0_2_0() { return cRightDSL_Expression_CompareParserRuleCall_1_0_2_0; }
+
+ //'==' {DSL_Expression_Equal.left=current} right=DSL_Expression_Compare
+ public Group getGroup_1_1() { return cGroup_1_1; }
+
+ //'=='
+ public Keyword getEqualsSignEqualsSignKeyword_1_1_0() { return cEqualsSignEqualsSignKeyword_1_1_0; }
+
+ //{DSL_Expression_Equal.left=current}
+ public Action getDSL_Expression_EqualLeftAction_1_1_1() { return cDSL_Expression_EqualLeftAction_1_1_1; }
+
+ //right=DSL_Expression_Compare
+ public Assignment getRightAssignment_1_1_2() { return cRightAssignment_1_1_2; }
+
+ //DSL_Expression_Compare
+ public RuleCall getRightDSL_Expression_CompareParserRuleCall_1_1_2_0() { return cRightDSL_Expression_CompareParserRuleCall_1_1_2_0; }
+ }
+ public class DSL_Expression_CompareElements extends AbstractParserRuleElementFinder {
+ private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.sensinact.studio.language.Sensinact.DSL_Expression_Compare");
+ private final Group cGroup = (Group)rule.eContents().get(1);
+ private final RuleCall cDSL_Expression_PlusMinusParserRuleCall_0 = (RuleCall)cGroup.eContents().get(0);
+ private final Alternatives cAlternatives_1 = (Alternatives)cGroup.eContents().get(1);
+ private final Group cGroup_1_0 = (Group)cAlternatives_1.eContents().get(0);
+ private final Keyword cGreaterThanSignKeyword_1_0_0 = (Keyword)cGroup_1_0.eContents().get(0);
+ private final Action cDSL_Expression_LargerLeftAction_1_0_1 = (Action)cGroup_1_0.eContents().get(1);
+ private final Assignment cRightAssignment_1_0_2 = (Assignment)cGroup_1_0.eContents().get(2);
+ private final RuleCall cRightDSL_Expression_PlusMinusParserRuleCall_1_0_2_0 = (RuleCall)cRightAssignment_1_0_2.eContents().get(0);
+ private final Group cGroup_1_1 = (Group)cAlternatives_1.eContents().get(1);
+ private final Keyword cGreaterThanSignEqualsSignKeyword_1_1_0 = (Keyword)cGroup_1_1.eContents().get(0);
+ private final Action cDSL_Expression_Larger_EqualLeftAction_1_1_1 = (Action)cGroup_1_1.eContents().get(1);
+ private final Assignment cRightAssignment_1_1_2 = (Assignment)cGroup_1_1.eContents().get(2);
+ private final RuleCall cRightDSL_Expression_PlusMinusParserRuleCall_1_1_2_0 = (RuleCall)cRightAssignment_1_1_2.eContents().get(0);
+ private final Group cGroup_1_2 = (Group)cAlternatives_1.eContents().get(2);
+ private final Keyword cLessThanSignKeyword_1_2_0 = (Keyword)cGroup_1_2.eContents().get(0);
+ private final Action cDSL_Expression_SmallerLeftAction_1_2_1 = (Action)cGroup_1_2.eContents().get(1);
+ private final Assignment cRightAssignment_1_2_2 = (Assignment)cGroup_1_2.eContents().get(2);
+ private final RuleCall cRightDSL_Expression_PlusMinusParserRuleCall_1_2_2_0 = (RuleCall)cRightAssignment_1_2_2.eContents().get(0);
+ private final Group cGroup_1_3 = (Group)cAlternatives_1.eContents().get(3);
+ private final Keyword cLessThanSignEqualsSignKeyword_1_3_0 = (Keyword)cGroup_1_3.eContents().get(0);
+ private final Action cDSL_Expression_Smaller_EqualLeftAction_1_3_1 = (Action)cGroup_1_3.eContents().get(1);
+ private final Assignment cRightAssignment_1_3_2 = (Assignment)cGroup_1_3.eContents().get(2);
+ private final RuleCall cRightDSL_Expression_PlusMinusParserRuleCall_1_3_2_0 = (RuleCall)cRightAssignment_1_3_2.eContents().get(0);
+
+ //// Comparisons: left associative, priority 4
+ //DSL_Expression_Compare DSL_Expression:
+ // DSL_Expression_PlusMinus ('>' {DSL_Expression_Larger.left=current} right=DSL_Expression_PlusMinus | '>='
+ // {DSL_Expression_Larger_Equal.left=current} right=DSL_Expression_PlusMinus | '<' {DSL_Expression_Smaller.left=current}
+ // right=DSL_Expression_PlusMinus | '<=' {DSL_Expression_Smaller_Equal.left=current} right=DSL_Expression_PlusMinus)*
+ @Override public ParserRule getRule() { return rule; }
+
+ //DSL_Expression_PlusMinus ('>' {DSL_Expression_Larger.left=current} right=DSL_Expression_PlusMinus | '>='
+ //{DSL_Expression_Larger_Equal.left=current} right=DSL_Expression_PlusMinus | '<' {DSL_Expression_Smaller.left=current}
+ //right=DSL_Expression_PlusMinus | '<=' {DSL_Expression_Smaller_Equal.left=current} right=DSL_Expression_PlusMinus)*
+ public Group getGroup() { return cGroup; }
+
+ //DSL_Expression_PlusMinus
+ public RuleCall getDSL_Expression_PlusMinusParserRuleCall_0() { return cDSL_Expression_PlusMinusParserRuleCall_0; }
+
+ //('>' {DSL_Expression_Larger.left=current} right=DSL_Expression_PlusMinus | '>='
+ //{DSL_Expression_Larger_Equal.left=current} right=DSL_Expression_PlusMinus | '<' {DSL_Expression_Smaller.left=current}
+ //right=DSL_Expression_PlusMinus | '<=' {DSL_Expression_Smaller_Equal.left=current} right=DSL_Expression_PlusMinus)*
+ public Alternatives getAlternatives_1() { return cAlternatives_1; }
+
+ //'>' {DSL_Expression_Larger.left=current} right=DSL_Expression_PlusMinus
+ public Group getGroup_1_0() { return cGroup_1_0; }
+
+ //'>'
+ public Keyword getGreaterThanSignKeyword_1_0_0() { return cGreaterThanSignKeyword_1_0_0; }
+
+ //{DSL_Expression_Larger.left=current}
+ public Action getDSL_Expression_LargerLeftAction_1_0_1() { return cDSL_Expression_LargerLeftAction_1_0_1; }
+
+ //right=DSL_Expression_PlusMinus
+ public Assignment getRightAssignment_1_0_2() { return cRightAssignment_1_0_2; }
+
+ //DSL_Expression_PlusMinus
+ public RuleCall getRightDSL_Expression_PlusMinusParserRuleCall_1_0_2_0() { return cRightDSL_Expression_PlusMinusParserRuleCall_1_0_2_0; }
+
+ //'>=' {DSL_Expression_Larger_Equal.left=current} right=DSL_Expression_PlusMinus
+ public Group getGroup_1_1() { return cGroup_1_1; }
+
+ //'>='
+ public Keyword getGreaterThanSignEqualsSignKeyword_1_1_0() { return cGreaterThanSignEqualsSignKeyword_1_1_0; }
+
+ //{DSL_Expression_Larger_Equal.left=current}
+ public Action getDSL_Expression_Larger_EqualLeftAction_1_1_1() { return cDSL_Expression_Larger_EqualLeftAction_1_1_1; }
+
+ //right=DSL_Expression_PlusMinus
+ public Assignment getRightAssignment_1_1_2() { return cRightAssignment_1_1_2; }
+
+ //DSL_Expression_PlusMinus
+ public RuleCall getRightDSL_Expression_PlusMinusParserRuleCall_1_1_2_0() { return cRightDSL_Expression_PlusMinusParserRuleCall_1_1_2_0; }
+
+ //'<' {DSL_Expression_Smaller.left=current} right=DSL_Expression_PlusMinus
+ public Group getGroup_1_2() { return cGroup_1_2; }
+
+ //'<'
+ public Keyword getLessThanSignKeyword_1_2_0() { return cLessThanSignKeyword_1_2_0; }
+
+ //{DSL_Expression_Smaller.left=current}
+ public Action getDSL_Expression_SmallerLeftAction_1_2_1() { return cDSL_Expression_SmallerLeftAction_1_2_1; }
+
+ //right=DSL_Expression_PlusMinus
+ public Assignment getRightAssignment_1_2_2() { return cRightAssignment_1_2_2; }
+
+ //DSL_Expression_PlusMinus
+ public RuleCall getRightDSL_Expression_PlusMinusParserRuleCall_1_2_2_0() { return cRightDSL_Expression_PlusMinusParserRuleCall_1_2_2_0; }
+
+ //'<=' {DSL_Expression_Smaller_Equal.left=current} right=DSL_Expression_PlusMinus
+ public Group getGroup_1_3() { return cGroup_1_3; }
+
+ //'<='
+ public Keyword getLessThanSignEqualsSignKeyword_1_3_0() { return cLessThanSignEqualsSignKeyword_1_3_0; }
+
+ //{DSL_Expression_Smaller_Equal.left=current}
+ public Action getDSL_Expression_Smaller_EqualLeftAction_1_3_1() { return cDSL_Expression_Smaller_EqualLeftAction_1_3_1; }
+
+ //right=DSL_Expression_PlusMinus
+ public Assignment getRightAssignment_1_3_2() { return cRightAssignment_1_3_2; }
+
+ //DSL_Expression_PlusMinus
+ public RuleCall getRightDSL_Expression_PlusMinusParserRuleCall_1_3_2_0() { return cRightDSL_Expression_PlusMinusParserRuleCall_1_3_2_0; }
+ }
+ public class DSL_Expression_PlusMinusElements extends AbstractParserRuleElementFinder {
+ private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.sensinact.studio.language.Sensinact.DSL_Expression_PlusMinus");
+ private final Group cGroup = (Group)rule.eContents().get(1);
+ private final RuleCall cDSL_Expression_MultiplicationDivisionParserRuleCall_0 = (RuleCall)cGroup.eContents().get(0);
+ private final Alternatives cAlternatives_1 = (Alternatives)cGroup.eContents().get(1);
+ private final Group cGroup_1_0 = (Group)cAlternatives_1.eContents().get(0);
+ private final Keyword cPlusSignKeyword_1_0_0 = (Keyword)cGroup_1_0.eContents().get(0);
+ private final Action cDSL_Expression_PlusLeftAction_1_0_1 = (Action)cGroup_1_0.eContents().get(1);
+ private final Assignment cRightAssignment_1_0_2 = (Assignment)cGroup_1_0.eContents().get(2);
+ private final RuleCall cRightDSL_Expression_MultiplicationDivisionParserRuleCall_1_0_2_0 = (RuleCall)cRightAssignment_1_0_2.eContents().get(0);
+ private final Group cGroup_1_1 = (Group)cAlternatives_1.eContents().get(1);
+ private final Keyword cHyphenMinusKeyword_1_1_0 = (Keyword)cGroup_1_1.eContents().get(0);
+ private final Action cDSL_Expression_MinusLeftAction_1_1_1 = (Action)cGroup_1_1.eContents().get(1);
+ private final Assignment cRightAssignment_1_1_2 = (Assignment)cGroup_1_1.eContents().get(2);
+ private final RuleCall cRightDSL_Expression_MultiplicationDivisionParserRuleCall_1_1_2_0 = (RuleCall)cRightAssignment_1_1_2.eContents().get(0);
+
+ //// addition/subtraction: left associative, priority 5
+ //DSL_Expression_PlusMinus DSL_Expression:
+ // DSL_Expression_MultiplicationDivision ('+' {DSL_Expression_Plus.left=current}
+ // right=DSL_Expression_MultiplicationDivision | '-' {DSL_Expression_Minus.left=current}
+ // right=DSL_Expression_MultiplicationDivision)*
+ @Override public ParserRule getRule() { return rule; }
+
+ //DSL_Expression_MultiplicationDivision ('+' {DSL_Expression_Plus.left=current}
+ //right=DSL_Expression_MultiplicationDivision | '-' {DSL_Expression_Minus.left=current}
+ //right=DSL_Expression_MultiplicationDivision)*
+ public Group getGroup() { return cGroup; }
+
+ //DSL_Expression_MultiplicationDivision
+ public RuleCall getDSL_Expression_MultiplicationDivisionParserRuleCall_0() { return cDSL_Expression_MultiplicationDivisionParserRuleCall_0; }
+
+ //('+' {DSL_Expression_Plus.left=current} right=DSL_Expression_MultiplicationDivision | '-'
+ //{DSL_Expression_Minus.left=current} right=DSL_Expression_MultiplicationDivision)*
+ public Alternatives getAlternatives_1() { return cAlternatives_1; }
+
+ //'+' {DSL_Expression_Plus.left=current} right=DSL_Expression_MultiplicationDivision
+ public Group getGroup_1_0() { return cGroup_1_0; }
+
+ //'+'
+ public Keyword getPlusSignKeyword_1_0_0() { return cPlusSignKeyword_1_0_0; }
+
+ //{DSL_Expression_Plus.left=current}
+ public Action getDSL_Expression_PlusLeftAction_1_0_1() { return cDSL_Expression_PlusLeftAction_1_0_1; }
+
+ //right=DSL_Expression_MultiplicationDivision
+ public Assignment getRightAssignment_1_0_2() { return cRightAssignment_1_0_2; }
+
+ //DSL_Expression_MultiplicationDivision
+ public RuleCall getRightDSL_Expression_MultiplicationDivisionParserRuleCall_1_0_2_0() { return cRightDSL_Expression_MultiplicationDivisionParserRuleCall_1_0_2_0; }
+
+ //'-' {DSL_Expression_Minus.left=current} right=DSL_Expression_MultiplicationDivision
+ public Group getGroup_1_1() { return cGroup_1_1; }
+
+ //'-'
+ public Keyword getHyphenMinusKeyword_1_1_0() { return cHyphenMinusKeyword_1_1_0; }
+
+ //{DSL_Expression_Minus.left=current}
+ public Action getDSL_Expression_MinusLeftAction_1_1_1() { return cDSL_Expression_MinusLeftAction_1_1_1; }
+
+ //right=DSL_Expression_MultiplicationDivision
+ public Assignment getRightAssignment_1_1_2() { return cRightAssignment_1_1_2; }
+
+ //DSL_Expression_MultiplicationDivision
+ public RuleCall getRightDSL_Expression_MultiplicationDivisionParserRuleCall_1_1_2_0() { return cRightDSL_Expression_MultiplicationDivisionParserRuleCall_1_1_2_0; }
+ }
+ public class DSL_Expression_MultiplicationDivisionElements extends AbstractParserRuleElementFinder {
+ private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.sensinact.studio.language.Sensinact.DSL_Expression_MultiplicationDivision");
+ private final Group cGroup = (Group)rule.eContents().get(1);
+ private final RuleCall cDSL_Expression_UnaryParserRuleCall_0 = (RuleCall)cGroup.eContents().get(0);
+ private final Alternatives cAlternatives_1 = (Alternatives)cGroup.eContents().get(1);
+ private final Group cGroup_1_0 = (Group)cAlternatives_1.eContents().get(0);
+ private final Keyword cAsteriskKeyword_1_0_0 = (Keyword)cGroup_1_0.eContents().get(0);
+ private final Action cDSL_Expression_MultiplicationLeftAction_1_0_1 = (Action)cGroup_1_0.eContents().get(1);
+ private final Assignment cRightAssignment_1_0_2 = (Assignment)cGroup_1_0.eContents().get(2);
+ private final RuleCall cRightDSL_Expression_UnaryParserRuleCall_1_0_2_0 = (RuleCall)cRightAssignment_1_0_2.eContents().get(0);
+ private final Group cGroup_1_1 = (Group)cAlternatives_1.eContents().get(1);
+ private final Keyword cSolidusKeyword_1_1_0 = (Keyword)cGroup_1_1.eContents().get(0);
+ private final Action cDSL_Expression_DivisionLeftAction_1_1_1 = (Action)cGroup_1_1.eContents().get(1);
+ private final Assignment cRightAssignment_1_1_2 = (Assignment)cGroup_1_1.eContents().get(2);
+ private final RuleCall cRightDSL_Expression_UnaryParserRuleCall_1_1_2_0 = (RuleCall)cRightAssignment_1_1_2.eContents().get(0);
+ private final Group cGroup_1_2 = (Group)cAlternatives_1.eContents().get(2);
+ private final Keyword cPercentSignKeyword_1_2_0 = (Keyword)cGroup_1_2.eContents().get(0);
+ private final Action cDSL_Expression_ModuloLeftAction_1_2_1 = (Action)cGroup_1_2.eContents().get(1);
+ private final Assignment cRightAssignment_1_2_2 = (Assignment)cGroup_1_2.eContents().get(2);
+ private final RuleCall cRightDSL_Expression_UnaryParserRuleCall_1_2_2_0 = (RuleCall)cRightAssignment_1_2_2.eContents().get(0);
+
+ //// multiplication/division, left associative, priority 6
+ //DSL_Expression_MultiplicationDivision DSL_Expression:
+ // DSL_Expression_Unary ('*' {DSL_Expression_Multiplication.left=current} right=DSL_Expression_Unary | '/'
+ // {DSL_Expression_Division.left=current} right=DSL_Expression_Unary | '%' {DSL_Expression_Modulo.left=current}
+ // right=DSL_Expression_Unary)*
+ @Override public ParserRule getRule() { return rule; }
+
+ //DSL_Expression_Unary ('*' {DSL_Expression_Multiplication.left=current} right=DSL_Expression_Unary | '/'
+ //{DSL_Expression_Division.left=current} right=DSL_Expression_Unary | '%' {DSL_Expression_Modulo.left=current}
+ //right=DSL_Expression_Unary)*
+ public Group getGroup() { return cGroup; }
+
+ //DSL_Expression_Unary
+ public RuleCall getDSL_Expression_UnaryParserRuleCall_0() { return cDSL_Expression_UnaryParserRuleCall_0; }
+
+ //('*' {DSL_Expression_Multiplication.left=current} right=DSL_Expression_Unary | '/'
+ //{DSL_Expression_Division.left=current} right=DSL_Expression_Unary | '%' {DSL_Expression_Modulo.left=current}
+ //right=DSL_Expression_Unary)*
+ public Alternatives getAlternatives_1() { return cAlternatives_1; }
+
+ //'*' {DSL_Expression_Multiplication.left=current} right=DSL_Expression_Unary
+ public Group getGroup_1_0() { return cGroup_1_0; }
+
+ //'*'
+ public Keyword getAsteriskKeyword_1_0_0() { return cAsteriskKeyword_1_0_0; }
+
+ //{DSL_Expression_Multiplication.left=current}
+ public Action getDSL_Expression_MultiplicationLeftAction_1_0_1() { return cDSL_Expression_MultiplicationLeftAction_1_0_1; }
+
+ //right=DSL_Expression_Unary
+ public Assignment getRightAssignment_1_0_2() { return cRightAssignment_1_0_2; }
+
+ //DSL_Expression_Unary
+ public RuleCall getRightDSL_Expression_UnaryParserRuleCall_1_0_2_0() { return cRightDSL_Expression_UnaryParserRuleCall_1_0_2_0; }
+
+ //'/' {DSL_Expression_Division.left=current} right=DSL_Expression_Unary
+ public Group getGroup_1_1() { return cGroup_1_1; }
+
+ //'/'
+ public Keyword getSolidusKeyword_1_1_0() { return cSolidusKeyword_1_1_0; }
+
+ //{DSL_Expression_Division.left=current}
+ public Action getDSL_Expression_DivisionLeftAction_1_1_1() { return cDSL_Expression_DivisionLeftAction_1_1_1; }
+
+ //right=DSL_Expression_Unary
+ public Assignment getRightAssignment_1_1_2() { return cRightAssignment_1_1_2; }
+
+ //DSL_Expression_Unary
+ public RuleCall getRightDSL_Expression_UnaryParserRuleCall_1_1_2_0() { return cRightDSL_Expression_UnaryParserRuleCall_1_1_2_0; }
+
+ //'%' {DSL_Expression_Modulo.left=current} right=DSL_Expression_Unary
+ public Group getGroup_1_2() { return cGroup_1_2; }
+
+ //'%'
+ public Keyword getPercentSignKeyword_1_2_0() { return cPercentSignKeyword_1_2_0; }
+
+ //{DSL_Expression_Modulo.left=current}
+ public Action getDSL_Expression_ModuloLeftAction_1_2_1() { return cDSL_Expression_ModuloLeftAction_1_2_1; }
+
+ //right=DSL_Expression_Unary
+ public Assignment getRightAssignment_1_2_2() { return cRightAssignment_1_2_2; }
+
+ //DSL_Expression_Unary
+ public RuleCall getRightDSL_Expression_UnaryParserRuleCall_1_2_2_0() { return cRightDSL_Expression_UnaryParserRuleCall_1_2_2_0; }
+ }
+ public class DSL_Expression_UnaryElements extends AbstractParserRuleElementFinder {
+ private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.sensinact.studio.language.Sensinact.DSL_Expression_Unary");
+ private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+ private final Group cGroup_0 = (Group)cAlternatives.eContents().get(0);
+ private final Action cDSL_Object_NumberAction_0_0 = (Action)cGroup_0.eContents().get(0);
+ private final Assignment cValueAssignment_0_1 = (Assignment)cGroup_0.eContents().get(1);
+ private final RuleCall cValueNUMBERParserRuleCall_0_1_0 = (RuleCall)cValueAssignment_0_1.eContents().get(0);
+ private final Group cGroup_1 = (Group)cAlternatives.eContents().get(1);
+ private final Action cDSL_Object_StringAction_1_0 = (Action)cGroup_1.eContents().get(0);
+ private final Assignment cValueAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
+ private final RuleCall cValueSTRINGTerminalRuleCall_1_1_0 = (RuleCall)cValueAssignment_1_1.eContents().get(0);
+ private final Group cGroup_2 = (Group)cAlternatives.eContents().get(2);
+ private final Action cDSL_Object_BooleanAction_2_0 = (Action)cGroup_2.eContents().get(0);
+ private final Assignment cValueAssignment_2_1 = (Assignment)cGroup_2.eContents().get(1);
+ private final RuleCall cValueBOOLEANTerminalRuleCall_2_1_0 = (RuleCall)cValueAssignment_2_1.eContents().get(0);
+ private final Group cGroup_3 = (Group)cAlternatives.eContents().get(3);
+ private final Action cDSL_Object_RefAction_3_0 = (Action)cGroup_3.eContents().get(0);
+ private final Assignment cValueAssignment_3_1 = (Assignment)cGroup_3.eContents().get(1);
+ private final CrossReference cValueDSL_REFCrossReference_3_1_0 = (CrossReference)cValueAssignment_3_1.eContents().get(0);
+ private final RuleCall cValueDSL_REFIDTerminalRuleCall_3_1_0_1 = (RuleCall)cValueDSL_REFCrossReference_3_1_0.eContents().get(1);
+ private final Keyword cGetKeyword_3_2 = (Keyword)cGroup_3.eContents().get(2);
+ private final Group cGroup_4 = (Group)cAlternatives.eContents().get(4);
+ private final Keyword cLeftParenthesisKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
+ private final RuleCall cDSL_Expression_OrParserRuleCall_4_1 = (RuleCall)cGroup_4.eContents().get(1);
+ private final Keyword cRightParenthesisKeyword_4_2 = (Keyword)cGroup_4.eContents().get(2);
+ private final Group cGroup_5 = (Group)cAlternatives.eContents().get(5);
+ private final Keyword cNotKeyword_5_0 = (Keyword)cGroup_5.eContents().get(0);
+ private final Action cDSL_Expression_NegateAction_5_1 = (Action)cGroup_5.eContents().get(1);
+ private final Assignment cExpAssignment_5_2 = (Assignment)cGroup_5.eContents().get(2);
+ private final RuleCall cExpDSL_Expression_UnaryParserRuleCall_5_2_0 = (RuleCall)cExpAssignment_5_2.eContents().get(0);
+
+ //// Unary operators: right associative, priority 7
+ //DSL_Expression_Unary DSL_Expression:
+ // {DSL_Object_Number} value=NUMBER | {DSL_Object_String} value=STRING | {DSL_Object_Boolean} value=BOOLEAN |
+ // {DSL_Object_Ref} value=[DSL_REF] '.get()' |
+ // '(' DSL_Expression_Or ')' |
+ // 'not' {DSL_Expression_Negate} exp=DSL_Expression_Unary
+ @Override public ParserRule getRule() { return rule; }
+
+ //{DSL_Object_Number} value=NUMBER | {DSL_Object_String} value=STRING | {DSL_Object_Boolean} value=BOOLEAN |
+ //{DSL_Object_Ref} value=[DSL_REF] '.get()' | '(' DSL_Expression_Or ')' | 'not' {DSL_Expression_Negate}
+ //exp=DSL_Expression_Unary
+ public Alternatives getAlternatives() { return cAlternatives; }
+
+ //{DSL_Object_Number} value=NUMBER
+ public Group getGroup_0() { return cGroup_0; }
+
+ //{DSL_Object_Number}
+ public Action getDSL_Object_NumberAction_0_0() { return cDSL_Object_NumberAction_0_0; }
+
+ //value=NUMBER
+ public Assignment getValueAssignment_0_1() { return cValueAssignment_0_1; }
+
+ //NUMBER
+ public RuleCall getValueNUMBERParserRuleCall_0_1_0() { return cValueNUMBERParserRuleCall_0_1_0; }
+
+ //{DSL_Object_String} value=STRING
+ public Group getGroup_1() { return cGroup_1; }
+
+ //{DSL_Object_String}
+ public Action getDSL_Object_StringAction_1_0() { return cDSL_Object_StringAction_1_0; }
+
+ //value=STRING
+ public Assignment getValueAssignment_1_1() { return cValueAssignment_1_1; }
+
+ //STRING
+ public RuleCall getValueSTRINGTerminalRuleCall_1_1_0() { return cValueSTRINGTerminalRuleCall_1_1_0; }
+
+ //{DSL_Object_Boolean} value=BOOLEAN
+ public Group getGroup_2() { return cGroup_2; }
+
+ //{DSL_Object_Boolean}
+ public Action getDSL_Object_BooleanAction_2_0() { return cDSL_Object_BooleanAction_2_0; }
+
+ //value=BOOLEAN
+ public Assignment getValueAssignment_2_1() { return cValueAssignment_2_1; }
+
+ //BOOLEAN
+ public RuleCall getValueBOOLEANTerminalRuleCall_2_1_0() { return cValueBOOLEANTerminalRuleCall_2_1_0; }
+
+ //{DSL_Object_Ref} value=[DSL_REF] '.get()'
+ public Group getGroup_3() { return cGroup_3; }
+
+ //{DSL_Object_Ref}
+ public Action getDSL_Object_RefAction_3_0() { return cDSL_Object_RefAction_3_0; }
+
+ //value=[DSL_REF]
+ public Assignment getValueAssignment_3_1() { return cValueAssignment_3_1; }
+
+ //[DSL_REF]
+ public CrossReference getValueDSL_REFCrossReference_3_1_0() { return cValueDSL_REFCrossReference_3_1_0; }
+
+ //ID
+ public RuleCall getValueDSL_REFIDTerminalRuleCall_3_1_0_1() { return cValueDSL_REFIDTerminalRuleCall_3_1_0_1; }
+
+ //'.get()'
+ public Keyword getGetKeyword_3_2() { return cGetKeyword_3_2; }
+
+ //'(' DSL_Expression_Or ')'
+ public Group getGroup_4() { return cGroup_4; }
+
+ //'('
+ public Keyword getLeftParenthesisKeyword_4_0() { return cLeftParenthesisKeyword_4_0; }
+
+ //DSL_Expression_Or
+ public RuleCall getDSL_Expression_OrParserRuleCall_4_1() { return cDSL_Expression_OrParserRuleCall_4_1; }
+
+ //')'
+ public Keyword getRightParenthesisKeyword_4_2() { return cRightParenthesisKeyword_4_2; }
+
+ //'not' {DSL_Expression_Negate} exp=DSL_Expression_Unary
+ public Group getGroup_5() { return cGroup_5; }
+
+ //'not'
+ public Keyword getNotKeyword_5_0() { return cNotKeyword_5_0; }
+
+ //{DSL_Expression_Negate}
+ public Action getDSL_Expression_NegateAction_5_1() { return cDSL_Expression_NegateAction_5_1; }
+
+ //exp=DSL_Expression_Unary
+ public Assignment getExpAssignment_5_2() { return cExpAssignment_5_2; }
+
+ //DSL_Expression_Unary
+ public RuleCall getExpDSL_Expression_UnaryParserRuleCall_5_2_0() { return cExpDSL_Expression_UnaryParserRuleCall_5_2_0; }
+ }
+
+
+ private final SensinactElements pSensinact;
+ private final DSL_SENSINACTElements pDSL_SENSINACT;
+ private final DSL_ResourceElements pDSL_Resource;
+ private final DSL_OnElements pDSL_On;
+ private final DSL_ECA_STATEMENTElements pDSL_ECA_STATEMENT;
+ private final DSL_IfDoElements pDSL_IfDo;
+ private final DSL_ElseIfDoElements pDSL_ElseIfDo;
+ private final DSL_ElseDoElements pDSL_ElseDo;
+ private final TerminalRule tBOOLEAN;
+ private final TerminalRule tINT;
+ private final NUMBERElements pNUMBER;
+ private final TerminalRule tID;
+ private final EXTENDED_IDElements pEXTENDED_ID;
+ private final DSL_REFElements pDSL_REF;
+ private final DSL_REF_CONDITIONElements pDSL_REF_CONDITION;
+ private final DSL_CEP_STATEMENTElements pDSL_CEP_STATEMENT;
+ private final DSL_CEP_AFTERElements pDSL_CEP_AFTER;
+ private final DSL_CEP_BEFOREElements pDSL_CEP_BEFORE;
+ private final DSL_CEP_COINCIDEElements pDSL_CEP_COINCIDE;
+ private final DSL_CEP_MINElements pDSL_CEP_MIN;
+ private final DSL_CEP_MAXElements pDSL_CEP_MAX;
+ private final DSL_CEP_AVGElements pDSL_CEP_AVG;
+ private final DSL_CEP_SUMElements pDSL_CEP_SUM;
+ private final DSL_CEP_COUNTElements pDSL_CEP_COUNT;
+ private final DSL_CEP_DURATIONElements pDSL_CEP_DURATION;
+ private final DSL_CEP_DURATION_MINElements pDSL_CEP_DURATION_MIN;
+ private final DSL_CEP_DURATION_SECElements pDSL_CEP_DURATION_SEC;
+ private final DSL_ListActionsElements pDSL_ListActions;
+ private final DSL_ResourceActionElements pDSL_ResourceAction;
+ private final DSL_ListParamElements pDSL_ListParam;
+ private final DSL_Expression_OrElements pDSL_Expression_Or;
+ private final DSL_Expression_AndElements pDSL_Expression_And;
+ private final DSL_Expression_DiffEqualElements pDSL_Expression_DiffEqual;
+ private final DSL_Expression_CompareElements pDSL_Expression_Compare;
+ private final DSL_Expression_PlusMinusElements pDSL_Expression_PlusMinus;
+ private final DSL_Expression_MultiplicationDivisionElements pDSL_Expression_MultiplicationDivision;
+ private final DSL_Expression_UnaryElements pDSL_Expression_Unary;
+
+ private final Grammar grammar;
+
+ private final TerminalsGrammarAccess gaTerminals;
+
+ @Inject
+ public SensinactGrammarAccess(GrammarProvider grammarProvider,
+ TerminalsGrammarAccess gaTerminals) {
+ this.grammar = internalFindGrammar(grammarProvider);
+ this.gaTerminals = gaTerminals;
+ this.pSensinact = new SensinactElements();
+ this.pDSL_SENSINACT = new DSL_SENSINACTElements();
+ this.pDSL_Resource = new DSL_ResourceElements();
+ this.pDSL_On = new DSL_OnElements();
+ this.pDSL_ECA_STATEMENT = new DSL_ECA_STATEMENTElements();
+ this.pDSL_IfDo = new DSL_IfDoElements();
+ this.pDSL_ElseIfDo = new DSL_ElseIfDoElements();
+ this.pDSL_ElseDo = new DSL_ElseDoElements();
+ this.tBOOLEAN = (TerminalRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.sensinact.studio.language.Sensinact.BOOLEAN");
+ this.tINT = (TerminalRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.sensinact.studio.language.Sensinact.INT");
+ this.pNUMBER = new NUMBERElements();
+ this.tID = (TerminalRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.sensinact.studio.language.Sensinact.ID");
+ this.pEXTENDED_ID = new EXTENDED_IDElements();
+ this.pDSL_REF = new DSL_REFElements();
+ this.pDSL_REF_CONDITION = new DSL_REF_CONDITIONElements();
+ this.pDSL_CEP_STATEMENT = new DSL_CEP_STATEMENTElements();
+ this.pDSL_CEP_AFTER = new DSL_CEP_AFTERElements();
+ this.pDSL_CEP_BEFORE = new DSL_CEP_BEFOREElements();
+ this.pDSL_CEP_COINCIDE = new DSL_CEP_COINCIDEElements();
+ this.pDSL_CEP_MIN = new DSL_CEP_MINElements();
+ this.pDSL_CEP_MAX = new DSL_CEP_MAXElements();
+ this.pDSL_CEP_AVG = new DSL_CEP_AVGElements();
+ this.pDSL_CEP_SUM = new DSL_CEP_SUMElements();
+ this.pDSL_CEP_COUNT = new DSL_CEP_COUNTElements();
+ this.pDSL_CEP_DURATION = new DSL_CEP_DURATIONElements();
+ this.pDSL_CEP_DURATION_MIN = new DSL_CEP_DURATION_MINElements();
+ this.pDSL_CEP_DURATION_SEC = new DSL_CEP_DURATION_SECElements();
+ this.pDSL_ListActions = new DSL_ListActionsElements();
+ this.pDSL_ResourceAction = new DSL_ResourceActionElements();
+ this.pDSL_ListParam = new DSL_ListParamElements();
+ this.pDSL_Expression_Or = new DSL_Expression_OrElements();
+ this.pDSL_Expression_And = new DSL_Expression_AndElements();
+ this.pDSL_Expression_DiffEqual = new DSL_Expression_DiffEqualElements();
+ this.pDSL_Expression_Compare = new DSL_Expression_CompareElements();
+ this.pDSL_Expression_PlusMinus = new DSL_Expression_PlusMinusElements();
+ this.pDSL_Expression_MultiplicationDivision = new DSL_Expression_MultiplicationDivisionElements();
+ this.pDSL_Expression_Unary = new DSL_Expression_UnaryElements();
+ }
+
+ protected Grammar internalFindGrammar(GrammarProvider grammarProvider) {
+ Grammar grammar = grammarProvider.getGrammar(this);
+ while (grammar != null) {
+ if ("org.eclipse.sensinact.studio.language.Sensinact".equals(grammar.getName())) {
+ return grammar;
+ }
+ List<Grammar> grammars = grammar.getUsedGrammars();
+ if (!grammars.isEmpty()) {
+ grammar = grammars.iterator().next();
+ } else {
+ return null;
+ }
+ }
+ return grammar;
+ }
+
+ @Override
+ public Grammar getGrammar() {
+ return grammar;
+ }
+
+
+ public TerminalsGrammarAccess getTerminalsGrammarAccess() {
+ return gaTerminals;
+ }
+
+
+ //// ==============
+ //// Main structure
+ //// ==============
+ //Sensinact:
+ // {Sensinact} eca=DSL_SENSINACT;
+ public SensinactElements getSensinactAccess() {
+ return pSensinact;
+ }
+
+ public ParserRule getSensinactRule() {
+ return getSensinactAccess().getRule();
+ }
+
+ //DSL_SENSINACT:
+ // resources+=DSL_Resource+ cep+=DSL_CEP_STATEMENT* on=DSL_On eca=DSL_ECA_STATEMENT;
+ public DSL_SENSINACTElements getDSL_SENSINACTAccess() {
+ return pDSL_SENSINACT;
+ }
+
+ public ParserRule getDSL_SENSINACTRule() {
+ return getDSL_SENSINACTAccess().getRule();
+ }
+
+ //DSL_Resource:
+ // 'resource' name=ID '=' '[' gatewayID=EXTENDED_ID '/' deviceID=EXTENDED_ID '/' serviceID=EXTENDED_ID '/'
+ // resourceID=EXTENDED_ID ']';
+ public DSL_ResourceElements getDSL_ResourceAccess() {
+ return pDSL_Resource;
+ }
+
+ public ParserRule getDSL_ResourceRule() {
+ return getDSL_ResourceAccess().getRule();
+ }
+
+ //DSL_On:
+ // 'on' triggers+=DSL_REF_CONDITION (',' triggers+=DSL_REF_CONDITION)*;
+ public DSL_OnElements getDSL_OnAccess() {
+ return pDSL_On;
+ }
+
+ public ParserRule getDSL_OnRule() {
+ return getDSL_OnAccess().getRule();
+ }
+
+ //DSL_ECA_STATEMENT:
+ // ifdo=DSL_IfDo elseIfdo+=DSL_ElseIfDo* elsedo=DSL_ElseDo? 'end if';
+ public DSL_ECA_STATEMENTElements getDSL_ECA_STATEMENTAccess() {
+ return pDSL_ECA_STATEMENT;
+ }
+
+ public ParserRule getDSL_ECA_STATEMENTRule() {
+ return getDSL_ECA_STATEMENTAccess().getRule();
+ }
+
+ //DSL_IfDo:
+ // 'if' condition=DSL_Expression_Or 'do' actions=DSL_ListActions;
+ public DSL_IfDoElements getDSL_IfDoAccess() {
+ return pDSL_IfDo;
+ }
+
+ public ParserRule getDSL_IfDoRule() {
+ return getDSL_IfDoAccess().getRule();
+ }
+
+ //DSL_ElseIfDo:
+ // 'else if' condition=DSL_Expression_Or 'do' actions=DSL_ListActions;
+ public DSL_ElseIfDoElements getDSL_ElseIfDoAccess() {
+ return pDSL_ElseIfDo;
+ }
+
+ public ParserRule getDSL_ElseIfDoRule() {
+ return getDSL_ElseIfDoAccess().getRule();
+ }
+
+ //DSL_ElseDo:
+ // 'else do' actions=DSL_ListActions;
+ public DSL_ElseDoElements getDSL_ElseDoAccess() {
+ return pDSL_ElseDo;
+ }
+
+ public ParserRule getDSL_ElseDoRule() {
+ return getDSL_ElseDoAccess().getRule();
+ }
+
+ //terminal BOOLEAN returns ecore::EBoolean:
+ // 'true' | 'false';
+ public TerminalRule getBOOLEANRule() {
+ return tBOOLEAN;
+ }
+
+ //terminal INT returns ecore::EInt:
+ // '0'..'9'+;
+ public TerminalRule getINTRule() {
+ return tINT;
+ }
+
+ //NUMBER ecore::EBigDecimal:
+ // INT | INT '.' INT
+ public NUMBERElements getNUMBERAccess() {
+ return pNUMBER;
+ }
+
+ public ParserRule getNUMBERRule() {
+ return getNUMBERAccess().getRule();
+ }
+
+ //terminal ID:
+ // 'a'..'z' | 'A'..'Z' | '_' | '0'..'9' | ':' | '-'+;
+ public TerminalRule getIDRule() {
+ return tID;
+ }
+
+ //EXTENDED_ID:
+ // ID ('.' ID)*;
+ public EXTENDED_IDElements getEXTENDED_IDAccess() {
+ return pEXTENDED_ID;
+ }
+
+ public ParserRule getEXTENDED_IDRule() {
+ return getEXTENDED_IDAccess().getRule();
+ }
+
+ //// ================
+ //// Basic structures
+ //// ================
+ //DSL_REF:
+ // DSL_CEP_STATEMENT | DSL_Resource;
+ public DSL_REFElements getDSL_REFAccess() {
+ return pDSL_REF;
+ }
+
+ public ParserRule getDSL_REFRule() {
+ return getDSL_REFAccess().getRule();
+ }
+
+ //// =============
+ //// REF condition
+ //// =============
+ //DSL_REF_CONDITION:
+ // ref=[DSL_REF] '.' 'subscribe' '(' ')';
+ public DSL_REF_CONDITIONElements getDSL_REF_CONDITIONAccess() {
+ return pDSL_REF_CONDITION;
+ }
+
+ public ParserRule getDSL_REF_CONDITIONRule() {
+ return getDSL_REF_CONDITIONAccess().getRule();
+ }
+
+ //// ==========
+ //// CEP engine
+ //// ==========
+ //DSL_CEP_STATEMENT:
+ // 'define' name=ID '=' operation=(DSL_CEP_AFTER | DSL_CEP_BEFORE | DSL_CEP_COINCIDE | DSL_CEP_MIN | DSL_CEP_MAX |
+ // DSL_CEP_AVG | DSL_CEP_SUM | DSL_CEP_COUNT);
+ public DSL_CEP_STATEMENTElements getDSL_CEP_STATEMENTAccess() {
+ return pDSL_CEP_STATEMENT;
+ }
+
+ public ParserRule getDSL_CEP_STATEMENTRule() {
+ return getDSL_CEP_STATEMENTAccess().getRule();
+ }
+
+ //DSL_CEP_AFTER:
+ // 'after' '(' ref1=DSL_REF_CONDITION ',' ref2=DSL_REF_CONDITION ',' (start=DSL_CEP_DURATION ',')? end=DSL_CEP_DURATION
+ // ')';
+ public DSL_CEP_AFTERElements getDSL_CEP_AFTERAccess() {
+ return pDSL_CEP_AFTER;
+ }
+
+ public ParserRule getDSL_CEP_AFTERRule() {
+ return getDSL_CEP_AFTERAccess().getRule();
+ }
+
+ //DSL_CEP_BEFORE:
+ // 'before' '(' ref1=DSL_REF_CONDITION ',' ref2=DSL_REF_CONDITION ',' (start=DSL_CEP_DURATION ',')? end=DSL_CEP_DURATION
+ // ')';
+ public DSL_CEP_BEFOREElements getDSL_CEP_BEFOREAccess() {
+ return pDSL_CEP_BEFORE;
+ }
+
+ public ParserRule getDSL_CEP_BEFORERule() {
+ return getDSL_CEP_BEFOREAccess().getRule();
+ }
+
+ //DSL_CEP_COINCIDE:
+ // 'coincide' '(' ref1=DSL_REF_CONDITION ',' ref2=DSL_REF_CONDITION ',' window=DSL_CEP_DURATION ')';
+ public DSL_CEP_COINCIDEElements getDSL_CEP_COINCIDEAccess() {
+ return pDSL_CEP_COINCIDE;
+ }
+
+ public ParserRule getDSL_CEP_COINCIDERule() {
+ return getDSL_CEP_COINCIDEAccess().getRule();
+ }
+
+ //DSL_CEP_MIN:
+ // 'min' '(' ref=DSL_REF_CONDITION ',' window=DSL_CEP_DURATION ')';
+ public DSL_CEP_MINElements getDSL_CEP_MINAccess() {
+ return pDSL_CEP_MIN;
+ }
+
+ public ParserRule getDSL_CEP_MINRule() {
+ return getDSL_CEP_MINAccess().getRule();
+ }
+
+ //DSL_CEP_MAX:
+ // 'max' '(' ref=DSL_REF_CONDITION ',' window=DSL_CEP_DURATION ')';
+ public DSL_CEP_MAXElements getDSL_CEP_MAXAccess() {
+ return pDSL_CEP_MAX;
+ }
+
+ public ParserRule getDSL_CEP_MAXRule() {
+ return getDSL_CEP_MAXAccess().getRule();
+ }
+
+ //DSL_CEP_AVG:
+ // 'avg' '(' ref=DSL_REF_CONDITION ',' window=DSL_CEP_DURATION ')';
+ public DSL_CEP_AVGElements getDSL_CEP_AVGAccess() {
+ return pDSL_CEP_AVG;
+ }
+
+ public ParserRule getDSL_CEP_AVGRule() {
+ return getDSL_CEP_AVGAccess().getRule();
+ }
+
+ //DSL_CEP_SUM:
+ // 'sum' '(' ref=DSL_REF_CONDITION ',' window=DSL_CEP_DURATION ')';
+ public DSL_CEP_SUMElements getDSL_CEP_SUMAccess() {
+ return pDSL_CEP_SUM;
+ }
+
+ public ParserRule getDSL_CEP_SUMRule() {
+ return getDSL_CEP_SUMAccess().getRule();
+ }
+
+ //DSL_CEP_COUNT:
+ // 'count' '(' ref=DSL_REF_CONDITION ',' window=DSL_CEP_DURATION ')';
+ public DSL_CEP_COUNTElements getDSL_CEP_COUNTAccess() {
+ return pDSL_CEP_COUNT;
+ }
+
+ public ParserRule getDSL_CEP_COUNTRule() {
+ return getDSL_CEP_COUNTAccess().getRule();
+ }
+
+ //DSL_CEP_DURATION:
+ // units+=(DSL_CEP_DURATION_MIN | DSL_CEP_DURATION_SEC)+;
+ public DSL_CEP_DURATIONElements getDSL_CEP_DURATIONAccess() {
+ return pDSL_CEP_DURATION;
+ }
+
+ public ParserRule getDSL_CEP_DURATIONRule() {
+ return getDSL_CEP_DURATIONAccess().getRule();
+ }
+
+ //DSL_CEP_DURATION_MIN:
+ // min=NUMBER 'min';
+ public DSL_CEP_DURATION_MINElements getDSL_CEP_DURATION_MINAccess() {
+ return pDSL_CEP_DURATION_MIN;
+ }
+
+ public ParserRule getDSL_CEP_DURATION_MINRule() {
+ return getDSL_CEP_DURATION_MINAccess().getRule();
+ }
+
+ //DSL_CEP_DURATION_SEC:
+ // sec=NUMBER 'sec';
+ public DSL_CEP_DURATION_SECElements getDSL_CEP_DURATION_SECAccess() {
+ return pDSL_CEP_DURATION_SEC;
+ }
+
+ public ParserRule getDSL_CEP_DURATION_SECRule() {
+ return getDSL_CEP_DURATION_SECAccess().getRule();
+ }
+
+ //// ============================
+ //// ECA engine : DSL_ListActions
+ //// ============================
+ //DSL_ListActions:
+ // actionList+=DSL_ResourceAction (',' actionList+=DSL_ResourceAction)*;
+ public DSL_ListActionsElements getDSL_ListActionsAccess() {
+ return pDSL_ListActions;
+ }
+
+ public ParserRule getDSL_ListActionsRule() {
+ return getDSL_ListActionsAccess().getRule();
+ }
+
+ //DSL_ResourceAction:
+ // (variable=ID '=')? ref=[DSL_REF] '.' actiontype=('act' | 'set') '(' listParam=DSL_ListParam? ')';
+ public DSL_ResourceActionElements getDSL_ResourceActionAccess() {
+ return pDSL_ResourceAction;
+ }
+
+ public ParserRule getDSL_ResourceActionRule() {
+ return getDSL_ResourceActionAccess().getRule();
+ }
+
+ //DSL_ListParam:
+ // param+=DSL_Expression_Or (',' param+=DSL_Expression_Or)*;
+ public DSL_ListParamElements getDSL_ListParamAccess() {
+ return pDSL_ListParam;
+ }
+
+ public ParserRule getDSL_ListParamRule() {
+ return getDSL_ListParamAccess().getRule();
+ }
+
+ //// ===========
+ //// Expressions
+ //// ===========
+ ////
+ //// 7 () functions : not, concatenate
+ //// 6 * / %
+ //// 5 + -
+ //// 4 < > <= >=
+ //// 3 == !=
+ //// 2 and
+ //// 1 or
+ ////
+ //// Or: left associative, priority 1
+ //DSL_Expression_Or DSL_Expression:
+ // DSL_Expression_And ('or' {DSL_Expression_Or.left=current} right=DSL_Expression_And)*
+ public DSL_Expression_OrElements getDSL_Expression_OrAccess() {
+ return pDSL_Expression_Or;
+ }
+
+ public ParserRule getDSL_Expression_OrRule() {
+ return getDSL_Expression_OrAccess().getRule();
+ }
+
+ //// And: left associative, priority 2
+ //DSL_Expression_And DSL_Expression:
+ // DSL_Expression_DiffEqual ('and' {DSL_Expression_And.left=current} right=DSL_Expression_DiffEqual)*
+ public DSL_Expression_AndElements getDSL_Expression_AndAccess() {
+ return pDSL_Expression_And;
+ }
+
+ public ParserRule getDSL_Expression_AndRule() {
+ return getDSL_Expression_AndAccess().getRule();
+ }
+
+ //// different/equal: left associative, priority 3
+ //DSL_Expression_DiffEqual DSL_Expression:
+ // DSL_Expression_Compare ('!=' {DSL_Expression_Diff.left=current} right=DSL_Expression_Compare | '=='
+ // {DSL_Expression_Equal.left=current} right=DSL_Expression_Compare)*
+ public DSL_Expression_DiffEqualElements getDSL_Expression_DiffEqualAccess() {
+ return pDSL_Expression_DiffEqual;
+ }
+
+ public ParserRule getDSL_Expression_DiffEqualRule() {
+ return getDSL_Expression_DiffEqualAccess().getRule();
+ }
+
+ //// Comparisons: left associative, priority 4
+ //DSL_Expression_Compare DSL_Expression:
+ // DSL_Expression_PlusMinus ('>' {DSL_Expression_Larger.left=current} right=DSL_Expression_PlusMinus | '>='
+ // {DSL_Expression_Larger_Equal.left=current} right=DSL_Expression_PlusMinus | '<' {DSL_Expression_Smaller.left=current}
+ // right=DSL_Expression_PlusMinus | '<=' {DSL_Expression_Smaller_Equal.left=current} right=DSL_Expression_PlusMinus)*
+ public DSL_Expression_CompareElements getDSL_Expression_CompareAccess() {
+ return pDSL_Expression_Compare;
+ }
+
+ public ParserRule getDSL_Expression_CompareRule() {
+ return getDSL_Expression_CompareAccess().getRule();
+ }
+
+ //// addition/subtraction: left associative, priority 5
+ //DSL_Expression_PlusMinus DSL_Expression:
+ // DSL_Expression_MultiplicationDivision ('+' {DSL_Expression_Plus.left=current}
+ // right=DSL_Expression_MultiplicationDivision | '-' {DSL_Expression_Minus.left=current}
+ // right=DSL_Expression_MultiplicationDivision)*
+ public DSL_Expression_PlusMinusElements getDSL_Expression_PlusMinusAccess() {
+ return pDSL_Expression_PlusMinus;
+ }
+
+ public ParserRule getDSL_Expression_PlusMinusRule() {
+ return getDSL_Expression_PlusMinusAccess().getRule();
+ }
+
+ //// multiplication/division, left associative, priority 6
+ //DSL_Expression_MultiplicationDivision DSL_Expression:
+ // DSL_Expression_Unary ('*' {DSL_Expression_Multiplication.left=current} right=DSL_Expression_Unary | '/'
+ // {DSL_Expression_Division.left=current} right=DSL_Expression_Unary | '%' {DSL_Expression_Modulo.left=current}
+ // right=DSL_Expression_Unary)*
+ public DSL_Expression_MultiplicationDivisionElements getDSL_Expression_MultiplicationDivisionAccess() {
+ return pDSL_Expression_MultiplicationDivision;
+ }
+
+ public ParserRule getDSL_Expression_MultiplicationDivisionRule() {
+ return getDSL_Expression_MultiplicationDivisionAccess().getRule();
+ }
+
+ //// Unary operators: right associative, priority 7
+ //DSL_Expression_Unary DSL_Expression:
+ // {DSL_Object_Number} value=NUMBER | {DSL_Object_String} value=STRING | {DSL_Object_Boolean} value=BOOLEAN |
+ // {DSL_Object_Ref} value=[DSL_REF] '.get()' |
+ // '(' DSL_Expression_Or ')' |
+ // 'not' {DSL_Expression_Negate} exp=DSL_Expression_Unary
+ public DSL_Expression_UnaryElements getDSL_Expression_UnaryAccess() {
+ return pDSL_Expression_Unary;
+ }
+
+ public ParserRule getDSL_Expression_UnaryRule() {
+ return getDSL_Expression_UnaryAccess().getRule();
+ }
+
+ //terminal STRING:
+ // '"' ('\\' . | !('\\' | '"'))* '"' |
+ // "'" ('\\' . | !('\\' | "'"))* "'";
+ public TerminalRule getSTRINGRule() {
+ return gaTerminals.getSTRINGRule();
+ }
+
+ //terminal ML_COMMENT:
+ // '/ *'->'* /';
+ public TerminalRule getML_COMMENTRule() {
+ return gaTerminals.getML_COMMENTRule();
+ }
+
+ //terminal SL_COMMENT:
+ // '//' !('\n' | '\r')* ('\r'? '\n')?;
+ public TerminalRule getSL_COMMENTRule() {
+ return gaTerminals.getSL_COMMENTRule();
+ }
+
+ //terminal WS:
+ // ' ' | '\t' | '\r' | '\n'+;
+ public TerminalRule getWSRule() {
+ return gaTerminals.getWSRule();
+ }
+
+ //terminal ANY_OTHER:
+ // .;
+ public TerminalRule getANY_OTHERRule() {
+ return gaTerminals.getANY_OTHERRule();
+ }
+}
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/validation/AbstractSensinactValidator.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/validation/AbstractSensinactValidator.java
new file mode 100644
index 0000000..2eaf485
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src-gen/org/eclipse/sensinact/studio/language/validation/AbstractSensinactValidator.java
@@ -0,0 +1,30 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/*
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.validation;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.xtext.validation.AbstractDeclarativeValidator;
+
+public abstract class AbstractSensinactValidator extends AbstractDeclarativeValidator {
+
+ @Override
+ protected List<EPackage> getEPackages() {
+ List<EPackage> result = new ArrayList<EPackage>();
+ result.add(org.eclipse.sensinact.studio.language.sensinact.SensinactPackage.eINSTANCE);
+ return result;
+ }
+
+}
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src/org/eclipse/sensinact/studio/language/GenerateSensinact.mwe2 b/xtext/org.eclipse.sensinact.studio.language.sensinact/src/org/eclipse/sensinact/studio/language/GenerateSensinact.mwe2
new file mode 100644
index 0000000..4bfc8f9
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src/org/eclipse/sensinact/studio/language/GenerateSensinact.mwe2
@@ -0,0 +1,43 @@
+module org.eclipse.sensinact.studio.language.GenerateSensinact
+
+import org.eclipse.xtext.xtext.generator.*
+import org.eclipse.xtext.xtext.generator.model.project.*
+
+var rootPath = ".."
+
+Workflow {
+
+ component = XtextGenerator {
+ configuration = {
+ project = StandardProjectConfig {
+ baseName = "org.eclipse.sensinact.studio.language.sensinact"
+ rootPath = rootPath
+ runtimeTest = {
+ enabled = true
+ }
+ eclipsePlugin = {
+ enabled = true
+ }
+ eclipsePluginTest = {
+ enabled = true
+ }
+ createEclipseMetaData = true
+ }
+ code = {
+ encoding = "UTF-8"
+ fileHeader = "/*\n * generated by Xtext \${version}\n */"
+ }
+ }
+ language = StandardLanguage {
+ name = "org.eclipse.sensinact.studio.language.Sensinact"
+ fileExtensions = "sna"
+
+ serializer = {
+ generateStub = false
+ }
+ validator = {
+ // composedCheck = "org.eclipse.xtext.validation.NamesAreUniqueValidator"
+ }
+ }
+ }
+}
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src/org/eclipse/sensinact/studio/language/Sensinact.xtext b/xtext/org.eclipse.sensinact.studio.language.sensinact/src/org/eclipse/sensinact/studio/language/Sensinact.xtext
new file mode 100644
index 0000000..17e2e2b
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src/org/eclipse/sensinact/studio/language/Sensinact.xtext
@@ -0,0 +1,217 @@
+grammar org.eclipse.sensinact.studio.language.Sensinact with org.eclipse.xtext.common.Terminals
+
+generate sensinact "http://www.eclipse.org/sensinact/studio/language/Sensinact"
+
+import "http://www.eclipse.org/emf/2002/Ecore" as ecore
+
+
+// ==============
+// Main structure
+// ==============
+
+Sensinact:
+ {Sensinact}
+ (eca=DSL_SENSINACT)
+;
+
+DSL_SENSINACT:
+ (resources+=DSL_Resource)+ (cep+=DSL_CEP_STATEMENT)* on=DSL_On eca=DSL_ECA_STATEMENT
+;
+
+DSL_Resource:
+ 'resource' name=ID '=' '[' gatewayID=EXTENDED_ID '/' deviceID=EXTENDED_ID '/' serviceID=EXTENDED_ID '/' resourceID=EXTENDED_ID ']'
+;
+
+DSL_On:
+ 'on' triggers+=DSL_REF_CONDITION (',' triggers+=DSL_REF_CONDITION)*
+;
+
+DSL_ECA_STATEMENT:
+ ifdo=DSL_IfDo (elseIfdo+=DSL_ElseIfDo)* elsedo=DSL_ElseDo? 'end if'
+;
+
+DSL_IfDo:
+ 'if' condition=DSL_Expression_Or 'do' actions=DSL_ListActions
+;
+
+DSL_ElseIfDo:
+ 'else if' condition=DSL_Expression_Or 'do' actions=DSL_ListActions
+;
+
+DSL_ElseDo:
+ 'else do' actions=DSL_ListActions
+;
+
+
+// ============
+// Basic values
+// ============
+
+terminal BOOLEAN returns ecore::EBoolean: 'true' | 'false';
+
+// IMPORTANT : we are mixing terminal and non terminal rules
+// * terminal rules are parsed in a FIRST & stupid step (but fast) way by the "lexer"
+// * DataTypes rules are parsed in a SECOND step by the "parser"
+//
+// INFO : remember that terminal rules are executed one after the other, IN THE ORDER OF WRITING
+
+terminal INT returns ecore::EInt: ('0'..'9')+;
+NUMBER returns ecore::EBigDecimal: INT | INT '.' INT;
+
+terminal ID : ('a'..'z'|'A'..'Z'|'_'|'0'..'9'|':'|'-')+;
+EXTENDED_ID : ID ('.' ID)*;
+
+// ================
+// Basic structures
+// ================
+
+DSL_REF:
+ DSL_CEP_STATEMENT | DSL_Resource
+;
+
+
+// =============
+// REF condition
+// =============
+
+DSL_REF_CONDITION:
+ ref=[DSL_REF] '.' 'subscribe' '(' ')'
+;
+
+
+// ==========
+// CEP engine
+// ==========
+
+DSL_CEP_STATEMENT:
+ 'define' name=ID '=' operation=(DSL_CEP_AFTER | DSL_CEP_BEFORE | DSL_CEP_COINCIDE | DSL_CEP_MIN | DSL_CEP_MAX | DSL_CEP_AVG | DSL_CEP_SUM | DSL_CEP_COUNT)
+;
+
+DSL_CEP_AFTER:
+ 'after' '(' ref1=DSL_REF_CONDITION ',' ref2=DSL_REF_CONDITION ',' (start=DSL_CEP_DURATION ',')? end=DSL_CEP_DURATION ')'
+;
+
+DSL_CEP_BEFORE:
+ 'before' '(' ref1=DSL_REF_CONDITION ',' ref2=DSL_REF_CONDITION ',' (start=DSL_CEP_DURATION ',')? end=DSL_CEP_DURATION ')'
+;
+
+DSL_CEP_COINCIDE:
+ 'coincide' '(' ref1=DSL_REF_CONDITION ',' ref2=DSL_REF_CONDITION ',' window=DSL_CEP_DURATION ')'
+;
+
+DSL_CEP_MIN:
+ 'min' '(' ref=DSL_REF_CONDITION ',' window=DSL_CEP_DURATION ')'
+;
+
+DSL_CEP_MAX:
+ 'max' '(' ref=DSL_REF_CONDITION ',' window=DSL_CEP_DURATION ')'
+;
+
+DSL_CEP_AVG:
+ 'avg' '(' ref=DSL_REF_CONDITION ',' window=DSL_CEP_DURATION ')'
+;
+
+DSL_CEP_SUM:
+ 'sum' '(' ref=DSL_REF_CONDITION ',' window=DSL_CEP_DURATION ')'
+;
+
+DSL_CEP_COUNT:
+ 'count' '(' ref=DSL_REF_CONDITION ',' window=DSL_CEP_DURATION ')'
+;
+
+DSL_CEP_DURATION:
+ (units+=(DSL_CEP_DURATION_MIN | DSL_CEP_DURATION_SEC))+
+;
+
+DSL_CEP_DURATION_MIN:
+ min=NUMBER 'min'
+;
+
+DSL_CEP_DURATION_SEC:
+ sec=NUMBER 'sec'
+;
+
+
+// ============================
+// ECA engine : DSL_ListActions
+// ============================
+
+DSL_ListActions:
+ actionList+=DSL_ResourceAction (',' actionList+=DSL_ResourceAction)*
+;
+
+DSL_ResourceAction:
+ (variable=ID '=')? ref=[DSL_REF] '.' actiontype=('act'|'set') '(' listParam=DSL_ListParam? ')'
+;
+
+DSL_ListParam:
+ param+=DSL_Expression_Or (',' param+=DSL_Expression_Or )*
+;
+
+// ===========
+// Expressions
+// ===========
+
+//
+// 7 () functions : not, concatenate
+// 6 * / %
+// 5 + -
+// 4 < > <= >=
+// 3 == !=
+// 2 and
+// 1 or
+//
+
+
+// Or: left associative, priority 1
+DSL_Expression_Or returns DSL_Expression:
+ DSL_Expression_And ('or' {DSL_Expression_Or.left=current} right=DSL_Expression_And)*;
+
+// And: left associative, priority 2
+DSL_Expression_And returns DSL_Expression:
+ DSL_Expression_DiffEqual ('and' {DSL_Expression_And.left=current} right=DSL_Expression_DiffEqual)*;
+
+// different/equal: left associative, priority 3
+DSL_Expression_DiffEqual returns DSL_Expression:
+ DSL_Expression_Compare (
+ ('!=' {DSL_Expression_Diff.left=current} right=DSL_Expression_Compare) |
+ ('==' {DSL_Expression_Equal.left=current} right=DSL_Expression_Compare)
+ )*
+;
+
+// Comparisons: left associative, priority 4
+DSL_Expression_Compare returns DSL_Expression:
+ DSL_Expression_PlusMinus (
+ ('>' {DSL_Expression_Larger.left=current} right=DSL_Expression_PlusMinus) |
+ ('>=' {DSL_Expression_Larger_Equal.left=current} right=DSL_Expression_PlusMinus) |
+ ('<' {DSL_Expression_Smaller.left=current} right=DSL_Expression_PlusMinus) |
+ ('<=' {DSL_Expression_Smaller_Equal.left=current} right=DSL_Expression_PlusMinus)
+ )*
+;
+
+// addition/subtraction: left associative, priority 5
+DSL_Expression_PlusMinus returns DSL_Expression:
+ DSL_Expression_MultiplicationDivision (
+ ('+' {DSL_Expression_Plus.left=current} right=DSL_Expression_MultiplicationDivision) |
+ ('-' {DSL_Expression_Minus.left=current} right=DSL_Expression_MultiplicationDivision)
+ )*
+;
+
+// multiplication/division, left associative, priority 6
+DSL_Expression_MultiplicationDivision returns DSL_Expression:
+ DSL_Expression_Unary (
+ ('*' {DSL_Expression_Multiplication.left=current} right=DSL_Expression_Unary) |
+ ('/' {DSL_Expression_Division.left=current} right=DSL_Expression_Unary) |
+ ('%' {DSL_Expression_Modulo.left=current} right=DSL_Expression_Unary)
+ )*
+;
+
+// Unary operators: right associative, priority 7
+DSL_Expression_Unary returns DSL_Expression:
+ {DSL_Object_Number} value=NUMBER |
+ {DSL_Object_String} value=STRING |
+ {DSL_Object_Boolean} value=BOOLEAN |
+ {DSL_Object_Ref} value=[DSL_REF] '.get()' |
+ '(' DSL_Expression_Or ')'|
+ 'not' {DSL_Expression_Negate} exp=DSL_Expression_Unary
+;
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src/org/eclipse/sensinact/studio/language/SensinactRuntimeModule.xtend b/xtext/org.eclipse.sensinact.studio.language.sensinact/src/org/eclipse/sensinact/studio/language/SensinactRuntimeModule.xtend
new file mode 100644
index 0000000..91ba221
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src/org/eclipse/sensinact/studio/language/SensinactRuntimeModule.xtend
@@ -0,0 +1,21 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/*
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language
+
+
+/**
+ * Use this class to register components to be used at runtime / without the Equinox extension registry.
+ */
+class SensinactRuntimeModule extends AbstractSensinactRuntimeModule {
+}
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src/org/eclipse/sensinact/studio/language/SensinactStandaloneSetup.xtend b/xtext/org.eclipse.sensinact.studio.language.sensinact/src/org/eclipse/sensinact/studio/language/SensinactStandaloneSetup.xtend
new file mode 100644
index 0000000..100f3d3
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src/org/eclipse/sensinact/studio/language/SensinactStandaloneSetup.xtend
@@ -0,0 +1,25 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/*
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language
+
+
+/**
+ * Initialization support for running Xtext languages without Equinox extension registry.
+ */
+class SensinactStandaloneSetup extends SensinactStandaloneSetupGenerated {
+
+ def static void doSetup() {
+ new SensinactStandaloneSetup().createInjectorAndDoEMFRegistration()
+ }
+}
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src/org/eclipse/sensinact/studio/language/generator/SensinactGenerator.xtend b/xtext/org.eclipse.sensinact.studio.language.sensinact/src/org/eclipse/sensinact/studio/language/generator/SensinactGenerator.xtend
new file mode 100644
index 0000000..8a72bf2
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src/org/eclipse/sensinact/studio/language/generator/SensinactGenerator.xtend
@@ -0,0 +1,35 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/*
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.generator
+
+import org.eclipse.emf.ecore.resource.Resource
+import org.eclipse.xtext.generator.AbstractGenerator
+import org.eclipse.xtext.generator.IFileSystemAccess2
+import org.eclipse.xtext.generator.IGeneratorContext
+
+/**
+ * Generates code from your model files on save.
+ *
+ * See https://www.eclipse.org/Xtext/documentation/303_runtime_concepts.html#code-generation
+ */
+class SensinactGenerator extends AbstractGenerator {
+
+ override void doGenerate(Resource resource, IFileSystemAccess2 fsa, IGeneratorContext context) {
+// fsa.generateFile('greetings.txt', 'People to greet: ' +
+// resource.allContents
+// .filter(typeof(Greeting))
+// .map[name]
+// .join(', '))
+ }
+}
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src/org/eclipse/sensinact/studio/language/scoping/SensinactScopeProvider.xtend b/xtext/org.eclipse.sensinact.studio.language.sensinact/src/org/eclipse/sensinact/studio/language/scoping/SensinactScopeProvider.xtend
new file mode 100644
index 0000000..67f54b3
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src/org/eclipse/sensinact/studio/language/scoping/SensinactScopeProvider.xtend
@@ -0,0 +1,48 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/*
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.scoping
+
+import org.eclipse.emf.ecore.EObject
+import org.eclipse.emf.ecore.EReference
+import org.eclipse.xtext.scoping.impl.FilteringScope
+import org.eclipse.xtext.resource.IEObjectDescription
+import com.google.common.base.Predicate
+import org.eclipse.sensinact.studio.language.sensinact.DSL_SENSINACT
+
+/**
+ * Filer elements to "stay" in the current file.
+ *
+ * See https://www.eclipse.org/Xtext/documentation/303_runtime_concepts.html#scoping
+ * on how and when to use it.
+ */
+class SensinactScopeProvider extends AbstractSensinactScopeProvider {
+
+ override getScope(EObject context, EReference reference) {
+ return new FilteringScope(super.getScope(context, reference), new Predicate<IEObjectDescription>() {
+ override apply(IEObjectDescription input) {
+ var curECA = getEca(input.EObjectOrProxy);
+ var contextEca = getEca(context);
+ return curECA == contextEca;
+ }
+ });
+ }
+
+ def DSL_SENSINACT getEca(EObject object) {
+ if (object == null)
+ return null;
+ if (object instanceof DSL_SENSINACT)
+ return object as DSL_SENSINACT;
+ return getEca(object.eContainer);
+ }
+}
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/src/org/eclipse/sensinact/studio/language/validation/SensinactValidator.xtend b/xtext/org.eclipse.sensinact.studio.language.sensinact/src/org/eclipse/sensinact/studio/language/validation/SensinactValidator.xtend
new file mode 100644
index 0000000..39c8118
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/src/org/eclipse/sensinact/studio/language/validation/SensinactValidator.xtend
@@ -0,0 +1,196 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+/*
+ * generated by Xtext 2.9.1
+ */
+package org.eclipse.sensinact.studio.language.validation
+
+import org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_AFTER
+import org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_BEFORE
+import org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_DURATION
+import org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_DURATION_MIN
+import org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_DURATION_SEC
+import org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_STATEMENT
+import org.eclipse.sensinact.studio.language.sensinact.DSL_ListParam
+import org.eclipse.sensinact.studio.language.sensinact.DSL_REF
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Resource
+import org.eclipse.sensinact.studio.language.sensinact.DSL_ResourceAction
+import org.eclipse.sensinact.studio.language.sensinact.DSL_SENSINACT
+import org.eclipse.sensinact.studio.language.sensinact.SensinactPackage
+import org.eclipse.sensinact.studio.model.manager.modelupdater.ModelEditor
+import org.eclipse.sensinact.studio.resource.AccessMethodType
+import java.math.BigDecimal
+import org.eclipse.emf.ecore.EStructuralFeature
+import org.eclipse.xtext.validation.Check
+import org.eclipse.sensinact.studio.model.resource.utils.ResourceDescriptor
+import org.eclipse.sensinact.studio.language.sensinact.impl.DSL_REFImpl
+
+/**
+ * This class contains custom validation rules.
+ *
+ * See https://www.eclipse.org/Xtext/documentation/303_runtime_concepts.html#validation
+ */
+class SensinactValidator extends AbstractSensinactValidator {
+
+ def isConnected() {
+ return ModelEditor.getInstance().getGatewaysId.length != 0;
+ }
+
+ @Check
+ def checkGatewayIsConnected(DSL_SENSINACT eca) {
+ if (!isConnected())
+ warning("Please connect the studio to your gateway", SensinactPackage.Literals.DSL_SENSINACT__RESOURCES);
+ }
+
+ @Check
+ def void refNameIsUnique(DSL_REF ref) {
+ var nameOccurences = 0;
+ var name = ref.getName();
+
+ var superEntity = (ref.eContainer() as DSL_SENSINACT);
+ if (superEntity != null) {
+ for (other : superEntity.resources) {
+ if (name.equals(other.getName())) {
+ nameOccurences++;
+ }
+ }
+ for (other : superEntity.cep) {
+ if (name.equals(other.getName())) {
+ nameOccurences++;
+ }
+ }
+
+ if (nameOccurences > 1) {
+ error("Reference names names have to be unique", SensinactPackage.Literals.DSL_REF__NAME, ref.getName());
+ }
+ }
+ }
+
+ @Check
+ def checkResourceExists(DSL_Resource dslResource) {
+ if (isConnected()) {
+ var gatewayID = dslResource.gatewayID;
+ var deviceID = dslResource.deviceID;
+ var serviceID = dslResource.serviceID;
+ var resourceID = dslResource.resourceID;
+
+ if (! ModelEditor.getInstance().existsGateway(gatewayID)) {
+ warning("The gateway " + gatewayID + " does not exist",
+ SensinactPackage.Literals.DSL_RESOURCE__GATEWAY_ID, 'INVALID_NAME');
+ } else if (! ModelEditor.getInstance().existsDevice(gatewayID, deviceID)) {
+ warning("The device " + deviceID + " does not exist in gateway " + gatewayID,
+ SensinactPackage.Literals.DSL_RESOURCE__DEVICE_ID, 'INVALID_NAME');
+ } else if (! ModelEditor.getInstance().existsService(gatewayID, deviceID, serviceID)) {
+ warning("The service " + serviceID + " does not exist in gateway " + gatewayID,
+ SensinactPackage.Literals.DSL_RESOURCE__SERVICE_ID, 'INVALID_NAME');
+ } else if (! ModelEditor.getInstance().existsResource(gatewayID, deviceID, serviceID, resourceID)) {
+ warning("The resource " + resourceID + " does not exist in gateway " + gatewayID,
+ SensinactPackage.Literals.DSL_RESOURCE__RESOURCE_ID, 'INVALID_NAME');
+ }
+ }
+ }
+
+ @Check
+ def checkActionAccessMethod(DSL_ResourceAction resourceAction) {
+ if (isConnected()) {
+ var ref = resourceAction.ref;
+ var AccessMethodType actionType = AccessMethodType.getByName(resourceAction.actiontype);
+ var nbParams = getNbParams(resourceAction.listParam);
+ checkParameters(ref, actionType, nbParams, SensinactPackage.Literals.DSL_RESOURCE_ACTION__ACTIONTYPE);
+ }
+ }
+
+ def getNbParams(DSL_ListParam params) {
+ if (params == null)
+ return 0;
+ if (params.param == null)
+ return 0;
+ return params.param.size;
+ }
+
+ def checkParameters(DSL_REF ref, AccessMethodType actionType, int nbParams, EStructuralFeature feature) {
+ if (ref instanceof DSL_Resource) {
+
+ var dslResource = ref as DSL_Resource;
+
+ var gatewayID = dslResource.gatewayID;
+ var deviceID = dslResource.deviceID;
+ var serviceID = dslResource.serviceID;
+ var resourceID = dslResource.resourceID;
+
+ var descriptor = new ResourceDescriptor(gatewayID, deviceID, serviceID, resourceID);
+
+
+ // finding method
+ if (descriptor != null && actionType != null) {
+ var method = ModelEditor.getInstance().getAccessMethodWithTypeNbParams(descriptor, actionType, nbParams);
+
+ if (method == null) {
+ var String msg = null;
+ if (nbParams == 0) {
+ msg = "This action type without parameters is not available for this resource";
+ } else if (nbParams == 1) {
+ msg = "This action type with one parameter is not available for this resource";
+ } else if (nbParams == 0) {
+ msg = "This action type with " + nbParams + " parameters is not available for this resource";
+ }
+ error(msg, feature);
+ }
+ }
+
+ } else if (ref instanceof DSL_CEP_STATEMENT) {
+ // no check
+ } else if (ref.class.equals(typeof(DSL_REFImpl))) {
+ // exact same class (no subclassing)
+ } else {
+ throw new RuntimeException("Should never happen");
+ }
+ }
+
+ @Check
+ def checkCepAfter(DSL_CEP_AFTER operation) {
+ var start = timestamp(operation.start);
+ var end = timestamp(operation.end);
+
+ if (start.compareTo(end) >= 0) {
+ var msg = "end must be after start";
+ error(msg, SensinactPackage.Literals.DSL_CEP_AFTER__END);
+ }
+ }
+
+ @Check
+ def checkCepBefore(DSL_CEP_BEFORE operation) {
+ var start = timestamp(operation.start);
+ var end = timestamp(operation.end);
+
+ if (start.compareTo(end) >= 0) {
+ var msg = "end must be after start";
+ error(msg, SensinactPackage.Literals.DSL_CEP_BEFORE__END);
+ }
+ }
+
+ def timestamp(DSL_CEP_DURATION duration) {
+ var retval = BigDecimal.ZERO;
+ if (duration != null && duration.units != null) {
+ for (unit : duration.units) {
+ if (unit instanceof DSL_CEP_DURATION_MIN) {
+ var min = unit as DSL_CEP_DURATION_MIN;
+ retval = retval.add(min.min.multiply(new BigDecimal("60")));
+ } else if (unit instanceof DSL_CEP_DURATION_SEC) {
+ var sec = unit as DSL_CEP_DURATION_SEC;
+ retval = retval.add(sec.sec);
+ }
+ }
+ }
+ return retval;
+ }
+
+}
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/xtend-gen/org/eclipse/sensinact/studio/language/.SensinactRuntimeModule.java._trace b/xtext/org.eclipse.sensinact.studio.language.sensinact/xtend-gen/org/eclipse/sensinact/studio/language/.SensinactRuntimeModule.java._trace
new file mode 100644
index 0000000..92ab29c
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/xtend-gen/org/eclipse/sensinact/studio/language/.SensinactRuntimeModule.java._trace
Binary files differ
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/xtend-gen/org/eclipse/sensinact/studio/language/.SensinactRuntimeModule.xtendbin b/xtext/org.eclipse.sensinact.studio.language.sensinact/xtend-gen/org/eclipse/sensinact/studio/language/.SensinactRuntimeModule.xtendbin
new file mode 100644
index 0000000..15baf96
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/xtend-gen/org/eclipse/sensinact/studio/language/.SensinactRuntimeModule.xtendbin
Binary files differ
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/xtend-gen/org/eclipse/sensinact/studio/language/.SensinactStandaloneSetup.java._trace b/xtext/org.eclipse.sensinact.studio.language.sensinact/xtend-gen/org/eclipse/sensinact/studio/language/.SensinactStandaloneSetup.java._trace
new file mode 100644
index 0000000..6c46f97
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/xtend-gen/org/eclipse/sensinact/studio/language/.SensinactStandaloneSetup.java._trace
Binary files differ
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/xtend-gen/org/eclipse/sensinact/studio/language/.SensinactStandaloneSetup.xtendbin b/xtext/org.eclipse.sensinact.studio.language.sensinact/xtend-gen/org/eclipse/sensinact/studio/language/.SensinactStandaloneSetup.xtendbin
new file mode 100644
index 0000000..8ee1b7c
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/xtend-gen/org/eclipse/sensinact/studio/language/.SensinactStandaloneSetup.xtendbin
Binary files differ
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/xtend-gen/org/eclipse/sensinact/studio/language/SensinactRuntimeModule.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/xtend-gen/org/eclipse/sensinact/studio/language/SensinactRuntimeModule.java
new file mode 100644
index 0000000..0bc7135
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/xtend-gen/org/eclipse/sensinact/studio/language/SensinactRuntimeModule.java
@@ -0,0 +1,20 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.language;
+
+import org.eclipse.sensinact.studio.language.AbstractSensinactRuntimeModule;
+
+/**
+ * Use this class to register components to be used at runtime / without the Equinox extension registry.
+ */
+@SuppressWarnings("all")
+public class SensinactRuntimeModule extends AbstractSensinactRuntimeModule {
+}
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/xtend-gen/org/eclipse/sensinact/studio/language/SensinactStandaloneSetup.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/xtend-gen/org/eclipse/sensinact/studio/language/SensinactStandaloneSetup.java
new file mode 100644
index 0000000..3162f5a
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/xtend-gen/org/eclipse/sensinact/studio/language/SensinactStandaloneSetup.java
@@ -0,0 +1,24 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.language;
+
+import org.eclipse.sensinact.studio.language.SensinactStandaloneSetupGenerated;
+
+/**
+ * Initialization support for running Xtext languages without Equinox extension registry.
+ */
+@SuppressWarnings("all")
+public class SensinactStandaloneSetup extends SensinactStandaloneSetupGenerated {
+ public static void doSetup() {
+ SensinactStandaloneSetup _sensinactStandaloneSetup = new SensinactStandaloneSetup();
+ _sensinactStandaloneSetup.createInjectorAndDoEMFRegistration();
+ }
+}
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/xtend-gen/org/eclipse/sensinact/studio/language/generator/.SensinactGenerator.java._trace b/xtext/org.eclipse.sensinact.studio.language.sensinact/xtend-gen/org/eclipse/sensinact/studio/language/generator/.SensinactGenerator.java._trace
new file mode 100644
index 0000000..2318fed
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/xtend-gen/org/eclipse/sensinact/studio/language/generator/.SensinactGenerator.java._trace
Binary files differ
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/xtend-gen/org/eclipse/sensinact/studio/language/generator/.SensinactGenerator.xtendbin b/xtext/org.eclipse.sensinact.studio.language.sensinact/xtend-gen/org/eclipse/sensinact/studio/language/generator/.SensinactGenerator.xtendbin
new file mode 100644
index 0000000..f94b80e
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/xtend-gen/org/eclipse/sensinact/studio/language/generator/.SensinactGenerator.xtendbin
Binary files differ
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/xtend-gen/org/eclipse/sensinact/studio/language/generator/SensinactGenerator.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/xtend-gen/org/eclipse/sensinact/studio/language/generator/SensinactGenerator.java
new file mode 100644
index 0000000..ef6983b
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/xtend-gen/org/eclipse/sensinact/studio/language/generator/SensinactGenerator.java
@@ -0,0 +1,28 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.language.generator;
+
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.xtext.generator.AbstractGenerator;
+import org.eclipse.xtext.generator.IFileSystemAccess2;
+import org.eclipse.xtext.generator.IGeneratorContext;
+
+/**
+ * Generates code from your model files on save.
+ *
+ * See https://www.eclipse.org/Xtext/documentation/303_runtime_concepts.html#code-generation
+ */
+@SuppressWarnings("all")
+public class SensinactGenerator extends AbstractGenerator {
+ @Override
+ public void doGenerate(final Resource resource, final IFileSystemAccess2 fsa, final IGeneratorContext context) {
+ }
+}
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/xtend-gen/org/eclipse/sensinact/studio/language/scoping/.SensinactScopeProvider.java._trace b/xtext/org.eclipse.sensinact.studio.language.sensinact/xtend-gen/org/eclipse/sensinact/studio/language/scoping/.SensinactScopeProvider.java._trace
new file mode 100644
index 0000000..017d851
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/xtend-gen/org/eclipse/sensinact/studio/language/scoping/.SensinactScopeProvider.java._trace
Binary files differ
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/xtend-gen/org/eclipse/sensinact/studio/language/scoping/.SensinactScopeProvider.xtendbin b/xtext/org.eclipse.sensinact.studio.language.sensinact/xtend-gen/org/eclipse/sensinact/studio/language/scoping/.SensinactScopeProvider.xtendbin
new file mode 100644
index 0000000..8f4748d
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/xtend-gen/org/eclipse/sensinact/studio/language/scoping/.SensinactScopeProvider.xtendbin
Binary files differ
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/xtend-gen/org/eclipse/sensinact/studio/language/scoping/SensinactScopeProvider.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/xtend-gen/org/eclipse/sensinact/studio/language/scoping/SensinactScopeProvider.java
new file mode 100644
index 0000000..8063909
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/xtend-gen/org/eclipse/sensinact/studio/language/scoping/SensinactScopeProvider.java
@@ -0,0 +1,56 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.language.scoping;
+
+import com.google.common.base.Objects;
+import com.google.common.base.Predicate;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.sensinact.studio.language.scoping.AbstractSensinactScopeProvider;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_SENSINACT;
+import org.eclipse.xtext.resource.IEObjectDescription;
+import org.eclipse.xtext.scoping.IScope;
+import org.eclipse.xtext.scoping.impl.FilteringScope;
+
+/**
+ * Filer elements to "stay" in the current file.
+ *
+ * See https://www.eclipse.org/Xtext/documentation/303_runtime_concepts.html#scoping
+ * on how and when to use it.
+ */
+@SuppressWarnings("all")
+public class SensinactScopeProvider extends AbstractSensinactScopeProvider {
+ @Override
+ public IScope getScope(final EObject context, final EReference reference) {
+ IScope _scope = super.getScope(context, reference);
+ return new FilteringScope(_scope, new Predicate<IEObjectDescription>() {
+ @Override
+ public boolean apply(final IEObjectDescription input) {
+ EObject _eObjectOrProxy = input.getEObjectOrProxy();
+ DSL_SENSINACT curECA = SensinactScopeProvider.this.getEca(_eObjectOrProxy);
+ DSL_SENSINACT contextEca = SensinactScopeProvider.this.getEca(context);
+ return Objects.equal(curECA, contextEca);
+ }
+ });
+ }
+
+ public DSL_SENSINACT getEca(final EObject object) {
+ boolean _equals = Objects.equal(object, null);
+ if (_equals) {
+ return null;
+ }
+ if ((object instanceof DSL_SENSINACT)) {
+ return ((DSL_SENSINACT) object);
+ }
+ EObject _eContainer = object.eContainer();
+ return this.getEca(_eContainer);
+ }
+}
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/xtend-gen/org/eclipse/sensinact/studio/language/validation/.SensinactValidator.java._trace b/xtext/org.eclipse.sensinact.studio.language.sensinact/xtend-gen/org/eclipse/sensinact/studio/language/validation/.SensinactValidator.java._trace
new file mode 100644
index 0000000..402f465
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/xtend-gen/org/eclipse/sensinact/studio/language/validation/.SensinactValidator.java._trace
Binary files differ
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/xtend-gen/org/eclipse/sensinact/studio/language/validation/.SensinactValidator.xtendbin b/xtext/org.eclipse.sensinact.studio.language.sensinact/xtend-gen/org/eclipse/sensinact/studio/language/validation/.SensinactValidator.xtendbin
new file mode 100644
index 0000000..a094dd7
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/xtend-gen/org/eclipse/sensinact/studio/language/validation/.SensinactValidator.xtendbin
Binary files differ
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/xtend-gen/org/eclipse/sensinact/studio/language/validation/SensinactValidator.java b/xtext/org.eclipse.sensinact.studio.language.sensinact/xtend-gen/org/eclipse/sensinact/studio/language/validation/SensinactValidator.java
new file mode 100644
index 0000000..38b7d0d
--- /dev/null
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/xtend-gen/org/eclipse/sensinact/studio/language/validation/SensinactValidator.java
@@ -0,0 +1,301 @@
+/**
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation and/or initial documentation
+ */
+package org.eclipse.sensinact.studio.language.validation;
+
+import com.google.common.base.Objects;
+import java.math.BigDecimal;
+import java.util.List;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_AFTER;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_BEFORE;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_DURATION;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_DURATION_MIN;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_DURATION_SEC;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_CEP_STATEMENT;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Expression;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_ListParam;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_REF;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_Resource;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_ResourceAction;
+import org.eclipse.sensinact.studio.language.sensinact.DSL_SENSINACT;
+import org.eclipse.sensinact.studio.language.sensinact.SensinactPackage;
+import org.eclipse.sensinact.studio.language.sensinact.impl.DSL_REFImpl;
+import org.eclipse.sensinact.studio.language.validation.AbstractSensinactValidator;
+import org.eclipse.sensinact.studio.model.manager.modelupdater.ModelEditor;
+import org.eclipse.sensinact.studio.model.resource.utils.ResourceDescriptor;
+import org.eclipse.sensinact.studio.resource.AccessMethod;
+import org.eclipse.sensinact.studio.resource.AccessMethodType;
+import org.eclipse.xtext.validation.Check;
+import org.eclipse.xtext.xbase.lib.Conversions;
+import org.eclipse.xtext.xbase.lib.Exceptions;
+
+/**
+ * This class contains custom validation rules.
+ *
+ * See https://www.eclipse.org/Xtext/documentation/303_runtime_concepts.html#validation
+ */
+@SuppressWarnings("all")
+public class SensinactValidator extends AbstractSensinactValidator {
+ public boolean isConnected() {
+ try {
+ ModelEditor _instance = ModelEditor.getInstance();
+ List<String> _gatewaysId = _instance.getGatewaysId();
+ int _length = ((Object[])Conversions.unwrapArray(_gatewaysId, Object.class)).length;
+ return (_length != 0);
+ } catch (Throwable _e) {
+ throw Exceptions.sneakyThrow(_e);
+ }
+ }
+
+ @Check
+ public void checkGatewayIsConnected(final DSL_SENSINACT eca) {
+ boolean _isConnected = this.isConnected();
+ boolean _not = (!_isConnected);
+ if (_not) {
+ this.warning("Please connect the studio to your gateway", SensinactPackage.Literals.DSL_SENSINACT__RESOURCES);
+ }
+ }
+
+ @Check
+ public void refNameIsUnique(final DSL_REF ref) {
+ int nameOccurences = 0;
+ String name = ref.getName();
+ EObject _eContainer = ref.eContainer();
+ DSL_SENSINACT superEntity = ((DSL_SENSINACT) _eContainer);
+ boolean _notEquals = (!Objects.equal(superEntity, null));
+ if (_notEquals) {
+ EList<DSL_Resource> _resources = superEntity.getResources();
+ for (final DSL_Resource other : _resources) {
+ String _name = other.getName();
+ boolean _equals = name.equals(_name);
+ if (_equals) {
+ nameOccurences++;
+ }
+ }
+ EList<DSL_CEP_STATEMENT> _cep = superEntity.getCep();
+ for (final DSL_CEP_STATEMENT other_1 : _cep) {
+ String _name_1 = other_1.getName();
+ boolean _equals_1 = name.equals(_name_1);
+ if (_equals_1) {
+ nameOccurences++;
+ }
+ }
+ if ((nameOccurences > 1)) {
+ String _name_2 = ref.getName();
+ this.error("Reference names names have to be unique", SensinactPackage.Literals.DSL_REF__NAME, _name_2);
+ }
+ }
+ }
+
+ @Check
+ public void checkResourceExists(final DSL_Resource dslResource) {
+ try {
+ boolean _isConnected = this.isConnected();
+ if (_isConnected) {
+ String gatewayID = dslResource.getGatewayID();
+ String deviceID = dslResource.getDeviceID();
+ String serviceID = dslResource.getServiceID();
+ String resourceID = dslResource.getResourceID();
+ ModelEditor _instance = ModelEditor.getInstance();
+ boolean _existsGateway = _instance.existsGateway(gatewayID);
+ boolean _not = (!_existsGateway);
+ if (_not) {
+ this.warning((("The gateway " + gatewayID) + " does not exist"),
+ SensinactPackage.Literals.DSL_RESOURCE__GATEWAY_ID, "INVALID_NAME");
+ } else {
+ ModelEditor _instance_1 = ModelEditor.getInstance();
+ boolean _existsDevice = _instance_1.existsDevice(gatewayID, deviceID);
+ boolean _not_1 = (!_existsDevice);
+ if (_not_1) {
+ this.warning(((("The device " + deviceID) + " does not exist in gateway ") + gatewayID),
+ SensinactPackage.Literals.DSL_RESOURCE__DEVICE_ID, "INVALID_NAME");
+ } else {
+ ModelEditor _instance_2 = ModelEditor.getInstance();
+ boolean _existsService = _instance_2.existsService(gatewayID, deviceID, serviceID);
+ boolean _not_2 = (!_existsService);
+ if (_not_2) {
+ this.warning(((("The service " + serviceID) + " does not exist in gateway ") + gatewayID),
+ SensinactPackage.Literals.DSL_RESOURCE__SERVICE_ID, "INVALID_NAME");
+ } else {
+ ModelEditor _instance_3 = ModelEditor.getInstance();
+ boolean _existsResource = _instance_3.existsResource(gatewayID, deviceID, serviceID, resourceID);
+ boolean _not_3 = (!_existsResource);
+ if (_not_3) {
+ this.warning(((("The resource " + resourceID) + " does not exist in gateway ") + gatewayID),
+ SensinactPackage.Literals.DSL_RESOURCE__RESOURCE_ID, "INVALID_NAME");
+ }
+ }
+ }
+ }
+ }
+ } catch (Throwable _e) {
+ throw Exceptions.sneakyThrow(_e);
+ }
+ }
+
+ @Check
+ public Object checkActionAccessMethod(final DSL_ResourceAction resourceAction) {
+ Object _xifexpression = null;
+ boolean _isConnected = this.isConnected();
+ if (_isConnected) {
+ Object _xblockexpression = null;
+ {
+ DSL_REF ref = resourceAction.getRef();
+ String _actiontype = resourceAction.getActiontype();
+ AccessMethodType actionType = AccessMethodType.getByName(_actiontype);
+ DSL_ListParam _listParam = resourceAction.getListParam();
+ int nbParams = this.getNbParams(_listParam);
+ _xblockexpression = this.checkParameters(ref, actionType, nbParams, SensinactPackage.Literals.DSL_RESOURCE_ACTION__ACTIONTYPE);
+ }
+ _xifexpression = _xblockexpression;
+ }
+ return _xifexpression;
+ }
+
+ public int getNbParams(final DSL_ListParam params) {
+ boolean _equals = Objects.equal(params, null);
+ if (_equals) {
+ return 0;
+ }
+ EList<DSL_Expression> _param = params.getParam();
+ boolean _equals_1 = Objects.equal(_param, null);
+ if (_equals_1) {
+ return 0;
+ }
+ EList<DSL_Expression> _param_1 = params.getParam();
+ return _param_1.size();
+ }
+
+ public Object checkParameters(final DSL_REF ref, final AccessMethodType actionType, final int nbParams, final EStructuralFeature feature) {
+ try {
+ Object _xifexpression = null;
+ if ((ref instanceof DSL_Resource)) {
+ DSL_Resource dslResource = ((DSL_Resource) ref);
+ String gatewayID = dslResource.getGatewayID();
+ String deviceID = dslResource.getDeviceID();
+ String serviceID = dslResource.getServiceID();
+ String resourceID = dslResource.getResourceID();
+ ResourceDescriptor descriptor = new ResourceDescriptor(gatewayID, deviceID, serviceID, resourceID);
+ boolean _and = false;
+ boolean _notEquals = (!Objects.equal(descriptor, null));
+ if (!_notEquals) {
+ _and = false;
+ } else {
+ boolean _notEquals_1 = (!Objects.equal(actionType, null));
+ _and = _notEquals_1;
+ }
+ if (_and) {
+ ModelEditor _instance = ModelEditor.getInstance();
+ AccessMethod method = _instance.getAccessMethodWithTypeNbParams(descriptor, actionType, nbParams);
+ boolean _equals = Objects.equal(method, null);
+ if (_equals) {
+ String msg = null;
+ if ((nbParams == 0)) {
+ msg = "This action type without parameters is not available for this resource";
+ } else {
+ if ((nbParams == 1)) {
+ msg = "This action type with one parameter is not available for this resource";
+ } else {
+ if ((nbParams == 0)) {
+ msg = (("This action type with " + Integer.valueOf(nbParams)) + " parameters is not available for this resource");
+ }
+ }
+ }
+ this.error(msg, feature);
+ }
+ }
+ } else {
+ Object _xifexpression_1 = null;
+ if ((ref instanceof DSL_CEP_STATEMENT)) {
+ _xifexpression_1 = null;
+ } else {
+ Object _xifexpression_2 = null;
+ Class<? extends DSL_REF> _class = ref.getClass();
+ boolean _equals_1 = _class.equals(DSL_REFImpl.class);
+ if (_equals_1) {
+ _xifexpression_2 = null;
+ } else {
+ throw new RuntimeException("Should never happen");
+ }
+ _xifexpression_1 = _xifexpression_2;
+ }
+ _xifexpression = _xifexpression_1;
+ }
+ return _xifexpression;
+ } catch (Throwable _e) {
+ throw Exceptions.sneakyThrow(_e);
+ }
+ }
+
+ @Check
+ public void checkCepAfter(final DSL_CEP_AFTER operation) {
+ DSL_CEP_DURATION _start = operation.getStart();
+ BigDecimal start = this.timestamp(_start);
+ DSL_CEP_DURATION _end = operation.getEnd();
+ BigDecimal end = this.timestamp(_end);
+ int _compareTo = start.compareTo(end);
+ boolean _greaterEqualsThan = (_compareTo >= 0);
+ if (_greaterEqualsThan) {
+ String msg = "end must be after start";
+ this.error(msg, SensinactPackage.Literals.DSL_CEP_AFTER__END);
+ }
+ }
+
+ @Check
+ public void checkCepBefore(final DSL_CEP_BEFORE operation) {
+ DSL_CEP_DURATION _start = operation.getStart();
+ BigDecimal start = this.timestamp(_start);
+ DSL_CEP_DURATION _end = operation.getEnd();
+ BigDecimal end = this.timestamp(_end);
+ int _compareTo = start.compareTo(end);
+ boolean _greaterEqualsThan = (_compareTo >= 0);
+ if (_greaterEqualsThan) {
+ String msg = "end must be after start";
+ this.error(msg, SensinactPackage.Literals.DSL_CEP_BEFORE__END);
+ }
+ }
+
+ public BigDecimal timestamp(final DSL_CEP_DURATION duration) {
+ BigDecimal retval = BigDecimal.ZERO;
+ boolean _and = false;
+ boolean _notEquals = (!Objects.equal(duration, null));
+ if (!_notEquals) {
+ _and = false;
+ } else {
+ EList<EObject> _units = duration.getUnits();
+ boolean _notEquals_1 = (!Objects.equal(_units, null));
+ _and = _notEquals_1;
+ }
+ if (_and) {
+ EList<EObject> _units_1 = duration.getUnits();
+ for (final EObject unit : _units_1) {
+ if ((unit instanceof DSL_CEP_DURATION_MIN)) {
+ DSL_CEP_DURATION_MIN min = ((DSL_CEP_DURATION_MIN) unit);
+ BigDecimal _min = min.getMin();
+ BigDecimal _bigDecimal = new BigDecimal("60");
+ BigDecimal _multiply = _min.multiply(_bigDecimal);
+ BigDecimal _add = retval.add(_multiply);
+ retval = _add;
+ } else {
+ if ((unit instanceof DSL_CEP_DURATION_SEC)) {
+ DSL_CEP_DURATION_SEC sec = ((DSL_CEP_DURATION_SEC) unit);
+ BigDecimal _sec = sec.getSec();
+ BigDecimal _add_1 = retval.add(_sec);
+ retval = _add_1;
+ }
+ }
+ }
+ }
+ return retval;
+ }
+}