<?xml version="1.0" encoding="UTF-8"?>
<genmodel:GenModel xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
    xmlns:genmodel="http://www.eclipse.org/emf/2002/GenModel" copyrightText="Copyright (c) 2022 Contributors to the Eclipse Foundation.&#xA;&#xA;This program and the accompanying materials are made&#xA;available under the terms of the Eclipse Public License 2.0&#xA;which is available at https://www.eclipse.org/legal/epl-2.0/&#xA;&#xA;SPDX-License-Identifier: EPL-2.0&#xA;&#xA;Contributors:&#xA;  Data In Motion - initial API and implementation "
    modelDirectory="/org.eclipse.sensinact.core.model/src" modelPluginID="org.eclipse.sensinact.core.model"
    modelName="sensinact" rootExtendsClass="org.eclipse.emf.ecore.impl.MinimalEObjectImpl$Container$Dynamic$Permissive"
    importerID="org.eclipse.emf.importer.ecore" complianceLevel="11.0" suppressGenModelAnnotations="false"
    copyrightFields="false" operationReflection="true" importOrganizing="true" oSGiCompatible="true">
  <foreignModel>sensinact.ecore</foreignModel>
  <genPackages prefix="Provider" basePackage="org.eclipse.sensinact.model.core" resource="XMI"
      disposableProviderFactory="true" ecorePackage="sensinact.ecore#/">
    <genEnums typeSafeEnumCompatible="false" ecoreEnum="sensinact.ecore#//ResourceType">
      <genEnumLiterals ecoreEnumLiteral="sensinact.ecore#//ResourceType/ACTION"/>
      <genEnumLiterals ecoreEnumLiteral="sensinact.ecore#//ResourceType/PROPERTY"/>
      <genEnumLiterals ecoreEnumLiteral="sensinact.ecore#//ResourceType/SENSOR"/>
      <genEnumLiterals ecoreEnumLiteral="sensinact.ecore#//ResourceType/STATE_VARIABLE"/>
    </genEnums>
    <genEnums typeSafeEnumCompatible="false" ecoreEnum="sensinact.ecore#//ValueType">
      <genEnumLiterals ecoreEnumLiteral="sensinact.ecore#//ValueType/FIXED"/>
      <genEnumLiterals ecoreEnumLiteral="sensinact.ecore#//ValueType/OBSERVABLE"/>
      <genEnumLiterals ecoreEnumLiteral="sensinact.ecore#//ValueType/MODIFIABLE"/>
    </genEnums>
    <genDataTypes ecoreDataType="sensinact.ecore#//EGeoJsonObject" create="try { return new com.fasterxml.jackson.databind.ObjectMapper().readValue(it, GeoJsonObject.class); } catch (com.fasterxml.jackson.core.JsonProcessingException e) { throw new IllegalArgumentException(e); }"
        convert="try { return new com.fasterxml.jackson.databind.ObjectMapper().writeValueAsString(it); } catch (com.fasterxml.jackson.core.JsonProcessingException e) { throw new IllegalArgumentException(e); }"/>
    <genDataTypes ecoreDataType="sensinact.ecore#//EInstant" create="return Instant.parse(it);"
        convert="return it.toString();"/>
    <genClasses ecoreClass="sensinact.ecore#//Provider">
      <genAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
        <details key="body" value="org.eclipse.emf.ecore.EStructuralFeature serviceFeature = eClass().getEStructuralFeature(service);\nreturn serviceFeature != null ? (Service) eGet(serviceFeature) : null;"/>
      </genAnnotations>
      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute sensinact.ecore#//Provider/id"/>
      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference sensinact.ecore#//Provider/admin"/>
      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference sensinact.ecore#//Provider/linkedProviders"/>
      <genOperations ecoreOperation="sensinact.ecore#//Provider/getService" body="EStructuralFeature serviceFeature = eClass().getEStructuralFeature(serviceName);&#xA;if (serviceFeature instanceof &lt;%org.eclipse.emf.ecore.EReference%>) {&#xA;&#x9;EClass refEClass = ((EReference) serviceFeature).getEReferenceType();&#xA;&#x9;return ProviderPackage.Literals.SERVICE.isSuperTypeOf(refEClass) ? (Service) eGet(serviceFeature) : null;&#xA;}&#xA;return null;">
        <genParameters ecoreParameter="sensinact.ecore#//Provider/getService/serviceName"/>
      </genOperations>
      <genOperations ecoreOperation="sensinact.ecore#//Provider/getServiceEClass"
          body="&lt;%org.eclipse.emf.ecore.EStructuralFeature%>  serviceFeature = eClass().getEStructuralFeature(serviceName);&#xA;if (serviceFeature instanceof &lt;%org.eclipse.emf.ecore.EReference%>) {&#xA;    Object service = eGet(serviceFeature);&#xA;    &lt;%org.eclipse.emf.ecore.EClass%> refEClass;&#xA;    if (service instanceof &lt;%org.eclipse.emf.ecore.EObject%>) {&#xA;        refEClass = ((EObject) service).eClass();&#xA;    } else {&#xA;        refEClass = ((EReference) serviceFeature).getEReferenceType();&#xA;    }&#xA;    return ProviderPackage.Literals.SERVICE.isSuperTypeOf(refEClass) ? refEClass : null;&#xA;}&#xA;return null;&#xA;">
        <genParameters ecoreParameter="sensinact.ecore#//Provider/getServiceEClass/serviceName"/>
      </genOperations>
    </genClasses>
    <genClasses ecoreClass="sensinact.ecore#//Admin">
      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute sensinact.ecore#//Admin/friendlyName"/>
      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute sensinact.ecore#//Admin/location"/>
      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute sensinact.ecore#//Admin/modelPackageUri"/>
      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute sensinact.ecore#//Admin/model"/>
    </genClasses>
    <genClasses image="false" ecoreClass="sensinact.ecore#//Service">
      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference sensinact.ecore#//Service/metadata"/>
      <genOperations documentation="The eIsSet works a bit differently than the EMF Default. An EAttribute is seen as set, if it is the default value or if the Metadata with a timestamp are available."
          ecoreOperation="sensinact.ecore#//Service/eIsSet" body="boolean result = super.eIsSet(feature);&#xA;// we only change the behaviour for EAttributes&#xA;if (!result &amp;&amp; feature instanceof org.eclipse.emf.ecore.EAttribute){&#xA;    if (getMetadata().containsKey(feature) &amp;&amp; getMetadata().get(feature).getTimestamp() != null) {&#xA;        result = true;&#xA;    } else {&#xA;         // if there is a default, we can see this as set&#xA;        result = feature.getDefaultValueLiteral() != null;&#xA;     }&#xA;}&#xA;return result;">
        <genParameters ecoreParameter="sensinact.ecore#//Service/eIsSet/feature"/>
      </genOperations>
    </genClasses>
    <genClasses ecoreClass="sensinact.ecore#//Metadata">
      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference sensinact.ecore#//Metadata/extra"/>
      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute sensinact.ecore#//Metadata/timestamp"/>
    </genClasses>
    <genClasses ecoreClass="sensinact.ecore#//FeatureMetadata">
      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference sensinact.ecore#//FeatureMetadata/key"/>
      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference sensinact.ecore#//FeatureMetadata/value"/>
    </genClasses>
    <genClasses ecoreClass="sensinact.ecore#//FeatureCustomMetadata">
      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute sensinact.ecore#//FeatureCustomMetadata/name"/>
      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute sensinact.ecore#//FeatureCustomMetadata/value"/>
      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute sensinact.ecore#//FeatureCustomMetadata/timestamp"/>
    </genClasses>
    <genClasses ecoreClass="sensinact.ecore#//ServiceMap">
      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference sensinact.ecore#//ServiceMap/value"/>
      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute sensinact.ecore#//ServiceMap/key"/>
    </genClasses>
    <genClasses ecoreClass="sensinact.ecore#//DynamicProvider">
      <genAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
        <details key="body" value="return getServices().get(service);"/>
      </genAnnotations>
      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference sensinact.ecore#//DynamicProvider/services"/>
      <genOperations ecoreOperation="sensinact.ecore#//DynamicProvider/getService"
          body="Service service = super.getService(serviceName);&#xA;return service != null ? service : getServices().get(serviceName);">
        <genParameters ecoreParameter="sensinact.ecore#//DynamicProvider/getService/serviceName"/>
      </genOperations>
      <genOperations ecoreOperation="sensinact.ecore#//DynamicProvider/getServiceEClass"
          body="EClass serviceType = super.getServiceEClass(serviceName);&#xA;if (serviceType != null) {&#xA;    return serviceType;&#xA;} else {&#xA;    Service service = getServices().get(serviceName);&#xA;    return service != null ? service.eClass() : null;&#xA;}">
        <genParameters ecoreParameter="sensinact.ecore#//DynamicProvider/getServiceEClass/serviceName"/>
      </genOperations>
    </genClasses>
  </genPackages>
</genmodel:GenModel>
