Commit 006879b8 authored by Dominique Marcadet's avatar Dominique Marcadet

remove use of FeatureMap in AnyLN

parent 043108aa
......@@ -622,19 +622,11 @@
eType="#//DOI" unsettable="true" containment="true" resolveProxies="false"
eOpposite="#//DOI/ParentAnyLN"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="ReportControl" ordered="false"
upperBound="-1" eType="#//ReportControl" volatile="true" unsettable="true"
containment="true" resolveProxies="false" eOpposite="#//ReportControl/ParentAnyLN">
<eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
<details key="group" value="#ControlWithTriggerOpt"/>
</eAnnotations>
</eStructuralFeatures>
upperBound="-1" eType="#//ReportControl" unsettable="true" containment="true"
resolveProxies="false" eOpposite="#//ReportControl/ParentAnyLN"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="LogControl" ordered="false"
upperBound="-1" eType="#//LogControl" volatile="true" unsettable="true" containment="true"
resolveProxies="false" eOpposite="#//LogControl/ParentAnyLN">
<eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
<details key="group" value="#ControlWithTriggerOpt"/>
</eAnnotations>
</eStructuralFeatures>
upperBound="-1" eType="#//LogControl" unsettable="true" containment="true"
resolveProxies="false" eOpposite="#//LogControl/ParentAnyLN"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="DataSet" ordered="false"
upperBound="-1" eType="#//DataSet" unsettable="true" containment="true" resolveProxies="false"
eOpposite="#//DataSet/ParentAnyLN"/>
......@@ -653,13 +645,6 @@
<eStructuralFeatures xsi:type="ecore:EReference" name="ReferredByLNode" ordered="false"
upperBound="-1" eType="#//LNode" transient="true" unsettable="true" resolveProxies="false"
eOpposite="#//LNode/RefersToAnyLN"/>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="ControlWithTriggerOpt"
ordered="false" upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EFeatureMapEntry"
transient="true" unsettable="true">
<eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
<details key="kind" value="group"/>
</eAnnotations>
</eStructuralFeatures>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Association" eSuperTypes="#//BaseElement #//AgLNRef">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="associationID" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"
......
......@@ -374,7 +374,6 @@
<genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference SCL.ecore#//AnyLN/ReferredByAssociation"/>
<genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference SCL.ecore#//AnyLN/ReferredByIEDName"/>
<genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference SCL.ecore#//AnyLN/ReferredByLNode"/>
<genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EAttribute SCL.ecore#//AnyLN/ControlWithTriggerOpt"/>
<genOperations ecoreOperation="SCL.ecore#//AnyLN/getParentLDevice"/>
<genOperations ecoreOperation="SCL.ecore#//AnyLN/getNamespace"/>
</genClasses>
......
......@@ -21,7 +21,6 @@
package fr.centralesupelec.edf.riseclipse.iec61850.scl;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.util.FeatureMap;
/**
* <!-- begin-user-doc -->
......@@ -47,7 +46,6 @@ import org.eclipse.emf.ecore.util.FeatureMap;
* <li>{@link fr.centralesupelec.edf.riseclipse.iec61850.scl.AnyLN#getReferredByAssociation <em>Referred By Association</em>}</li>
* <li>{@link fr.centralesupelec.edf.riseclipse.iec61850.scl.AnyLN#getReferredByIEDName <em>Referred By IED Name</em>}</li>
* <li>{@link fr.centralesupelec.edf.riseclipse.iec61850.scl.AnyLN#getReferredByLNode <em>Referred By LNode</em>}</li>
* <li>{@link fr.centralesupelec.edf.riseclipse.iec61850.scl.AnyLN#getControlWithTriggerOpt <em>Control With Trigger Opt</em>}</li>
* </ul>
*
* @see fr.centralesupelec.edf.riseclipse.iec61850.scl.SclPackage#getAnyLN()
......@@ -421,8 +419,7 @@ public interface AnyLN extends UnNaming {
* @see #unsetReportControl()
* @see fr.centralesupelec.edf.riseclipse.iec61850.scl.SclPackage#getAnyLN_ReportControl()
* @see fr.centralesupelec.edf.riseclipse.iec61850.scl.ReportControl#getParentAnyLN
* @model opposite="ParentAnyLN" containment="true" unsettable="true" volatile="true" ordered="false"
* extendedMetaData="group='#ControlWithTriggerOpt'"
* @model opposite="ParentAnyLN" containment="true" unsettable="true" ordered="false"
* @generated
*/
EList< ReportControl > getReportControl();
......@@ -463,8 +460,7 @@ public interface AnyLN extends UnNaming {
* @see #unsetLogControl()
* @see fr.centralesupelec.edf.riseclipse.iec61850.scl.SclPackage#getAnyLN_LogControl()
* @see fr.centralesupelec.edf.riseclipse.iec61850.scl.LogControl#getParentAnyLN
* @model opposite="ParentAnyLN" containment="true" unsettable="true" volatile="true" ordered="false"
* extendedMetaData="group='#ControlWithTriggerOpt'"
* @model opposite="ParentAnyLN" containment="true" unsettable="true" ordered="false"
* @generated
*/
EList< LogControl > getLogControl();
......@@ -728,42 +724,6 @@ public interface AnyLN extends UnNaming {
*/
boolean isSetReferredByLNode();
/**
* Returns the value of the '<em><b>Control With Trigger Opt</b></em>' attribute list.
* The list contents are of type {@link org.eclipse.emf.ecore.util.FeatureMap.Entry}.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @return the value of the '<em>Control With Trigger Opt</em>' attribute list.
* @see #isSetControlWithTriggerOpt()
* @see #unsetControlWithTriggerOpt()
* @see fr.centralesupelec.edf.riseclipse.iec61850.scl.SclPackage#getAnyLN_ControlWithTriggerOpt()
* @model unsettable="true" dataType="org.eclipse.emf.ecore.EFeatureMapEntry" many="true" transient="true" ordered="false"
* extendedMetaData="kind='group'"
* @generated
*/
FeatureMap getControlWithTriggerOpt();
/**
* Unsets the value of the '{@link fr.centralesupelec.edf.riseclipse.iec61850.scl.AnyLN#getControlWithTriggerOpt <em>Control With Trigger Opt</em>}' attribute list.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #isSetControlWithTriggerOpt()
* @see #getControlWithTriggerOpt()
* @generated
*/
void unsetControlWithTriggerOpt();
/**
* Returns whether the value of the '{@link fr.centralesupelec.edf.riseclipse.iec61850.scl.AnyLN#getControlWithTriggerOpt <em>Control With Trigger Opt</em>}' attribute list is set.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @return whether the value of the '<em>Control With Trigger Opt</em>' attribute list is set.
* @see #unsetControlWithTriggerOpt()
* @see #getControlWithTriggerOpt()
* @generated
*/
boolean isSetControlWithTriggerOpt();
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
......
......@@ -7197,15 +7197,6 @@ public interface SclPackage extends EPackage {
*/
int ANY_LN__REFERRED_BY_LNODE = UN_NAMING_FEATURE_COUNT + 14;
/**
* The feature id for the '<em><b>Control With Trigger Opt</b></em>' attribute list.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
* @ordered
*/
int ANY_LN__CONTROL_WITH_TRIGGER_OPT = UN_NAMING_FEATURE_COUNT + 15;
/**
* The number of structural features of the '<em>Any LN</em>' class.
* <!-- begin-user-doc -->
......@@ -7213,7 +7204,7 @@ public interface SclPackage extends EPackage {
* @generated
* @ordered
*/
int ANY_LN_FEATURE_COUNT = UN_NAMING_FEATURE_COUNT + 16;
int ANY_LN_FEATURE_COUNT = UN_NAMING_FEATURE_COUNT + 15;
/**
* The operation id for the '<em>Build Explicit Links</em>' operation.
......@@ -12694,15 +12685,6 @@ public interface SclPackage extends EPackage {
*/
int LN__REFERRED_BY_LNODE = ANY_LN__REFERRED_BY_LNODE;
/**
* The feature id for the '<em><b>Control With Trigger Opt</b></em>' attribute list.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
* @ordered
*/
int LN__CONTROL_WITH_TRIGGER_OPT = ANY_LN__CONTROL_WITH_TRIGGER_OPT;
/**
* The feature id for the '<em><b>Prefix</b></em>' attribute.
* <!-- begin-user-doc -->
......@@ -12973,15 +12955,6 @@ public interface SclPackage extends EPackage {
*/
int LN0__REFERRED_BY_LNODE = ANY_LN__REFERRED_BY_LNODE;
/**
* The feature id for the '<em><b>Control With Trigger Opt</b></em>' attribute list.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
* @ordered
*/
int LN0__CONTROL_WITH_TRIGGER_OPT = ANY_LN__CONTROL_WITH_TRIGGER_OPT;
/**
* The feature id for the '<em><b>GSE Control</b></em>' containment reference list.
* <!-- begin-user-doc -->
......@@ -25005,17 +24978,6 @@ public interface SclPackage extends EPackage {
*/
EReference getAnyLN_ReferredByLNode();
/**
* Returns the meta object for the attribute list '{@link fr.centralesupelec.edf.riseclipse.iec61850.scl.AnyLN#getControlWithTriggerOpt <em>Control With Trigger Opt</em>}'.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @return the meta object for the attribute list '<em>Control With Trigger Opt</em>'.
* @see fr.centralesupelec.edf.riseclipse.iec61850.scl.AnyLN#getControlWithTriggerOpt()
* @see #getAnyLN()
* @generated
*/
EAttribute getAnyLN_ControlWithTriggerOpt();
/**
* Returns the meta object for the '{@link fr.centralesupelec.edf.riseclipse.iec61850.scl.AnyLN#getParentLDevice() <em>Get Parent LDevice</em>}' operation.
* <!-- begin-user-doc -->
......@@ -53,10 +53,8 @@ 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.BasicFeatureMap;
import org.eclipse.emf.ecore.util.EObjectContainmentWithInverseEList;
import org.eclipse.emf.ecore.util.EObjectWithInverseEList;
import org.eclipse.emf.ecore.util.FeatureMap;
import org.eclipse.emf.ecore.util.InternalEList;
/**
......@@ -82,7 +80,6 @@ import org.eclipse.emf.ecore.util.InternalEList;
* <li>{@link fr.centralesupelec.edf.riseclipse.iec61850.scl.impl.AnyLNImpl#getReferredByAssociation <em>Referred By Association</em>}</li>
* <li>{@link fr.centralesupelec.edf.riseclipse.iec61850.scl.impl.AnyLNImpl#getReferredByIEDName <em>Referred By IED Name</em>}</li>
* <li>{@link fr.centralesupelec.edf.riseclipse.iec61850.scl.impl.AnyLNImpl#getReferredByLNode <em>Referred By LNode</em>}</li>
* <li>{@link fr.centralesupelec.edf.riseclipse.iec61850.scl.impl.AnyLNImpl#getControlWithTriggerOpt <em>Control With Trigger Opt</em>}</li>
* </ul>
*
* @generated
......@@ -233,6 +230,26 @@ public abstract class AnyLNImpl extends UnNamingImpl implements AnyLN {
*/
protected EList< DOI > doi;
/**
* The cached value of the '{@link #getReportControl() <em>Report Control</em>}' containment reference list.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getReportControl()
* @generated
* @ordered
*/
protected EList< ReportControl > reportControl;
/**
* The cached value of the '{@link #getLogControl() <em>Log Control</em>}' containment reference list.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getLogControl()
* @generated
* @ordered
*/
protected EList< LogControl > logControl;
/**
* The cached value of the '{@link #getDataSet() <em>Data Set</em>}' containment reference list.
* <!-- begin-user-doc -->
......@@ -293,16 +310,6 @@ public abstract class AnyLNImpl extends UnNamingImpl implements AnyLN {
*/
protected EList< LNode > referredByLNode;
/**
* The cached value of the '{@link #getControlWithTriggerOpt() <em>Control With Trigger Opt</em>}' attribute list.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getControlWithTriggerOpt()
* @generated
* @ordered
*/
protected FeatureMap controlWithTriggerOpt;
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
......@@ -778,7 +785,11 @@ public abstract class AnyLNImpl extends UnNamingImpl implements AnyLN {
*/
@Override
public EList< ReportControl > getReportControl() {
return getControlWithTriggerOpt().list( SclPackage.eINSTANCE.getAnyLN_ReportControl() );
if( reportControl == null ) {
reportControl = new EObjectContainmentWithInverseEList.Unsettable< ReportControl >( ReportControl.class,
this, SclPackage.ANY_LN__REPORT_CONTROL, SclPackage.REPORT_CONTROL__PARENT_ANY_LN );
}
return reportControl;
}
/**
......@@ -788,7 +799,7 @@ public abstract class AnyLNImpl extends UnNamingImpl implements AnyLN {
*/
@Override
public void unsetReportControl() {
( ( FeatureMap.Internal ) getControlWithTriggerOpt() ).clear( SclPackage.eINSTANCE.getAnyLN_ReportControl() );
if( reportControl != null ) ( ( InternalEList.Unsettable< ? > ) reportControl ).unset();
}
/**
......@@ -798,8 +809,7 @@ public abstract class AnyLNImpl extends UnNamingImpl implements AnyLN {
*/
@Override
public boolean isSetReportControl() {
return !( ( FeatureMap.Internal ) getControlWithTriggerOpt() )
.isEmpty( SclPackage.eINSTANCE.getAnyLN_ReportControl() );
return reportControl != null && ( ( InternalEList.Unsettable< ? > ) reportControl ).isSet();
}
/**
......@@ -809,7 +819,11 @@ public abstract class AnyLNImpl extends UnNamingImpl implements AnyLN {
*/
@Override
public EList< LogControl > getLogControl() {
return getControlWithTriggerOpt().list( SclPackage.eINSTANCE.getAnyLN_LogControl() );
if( logControl == null ) {
logControl = new EObjectContainmentWithInverseEList.Unsettable< LogControl >( LogControl.class, this,
SclPackage.ANY_LN__LOG_CONTROL, SclPackage.LOG_CONTROL__PARENT_ANY_LN );
}
return logControl;
}
/**
......@@ -819,7 +833,7 @@ public abstract class AnyLNImpl extends UnNamingImpl implements AnyLN {
*/
@Override
public void unsetLogControl() {
( ( FeatureMap.Internal ) getControlWithTriggerOpt() ).clear( SclPackage.eINSTANCE.getAnyLN_LogControl() );
if( logControl != null ) ( ( InternalEList.Unsettable< ? > ) logControl ).unset();
}
/**
......@@ -829,8 +843,7 @@ public abstract class AnyLNImpl extends UnNamingImpl implements AnyLN {
*/
@Override
public boolean isSetLogControl() {
return !( ( FeatureMap.Internal ) getControlWithTriggerOpt() )
.isEmpty( SclPackage.eINSTANCE.getAnyLN_LogControl() );
return logControl != null && ( ( InternalEList.Unsettable< ? > ) logControl ).isSet();
}
/**
......@@ -1037,39 +1050,6 @@ public abstract class AnyLNImpl extends UnNamingImpl implements AnyLN {
return referredByLNode != null && ( ( InternalEList.Unsettable< ? > ) referredByLNode ).isSet();
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public FeatureMap getControlWithTriggerOpt() {
if( controlWithTriggerOpt == null ) {
controlWithTriggerOpt = new BasicFeatureMap( this, SclPackage.ANY_LN__CONTROL_WITH_TRIGGER_OPT );
}
return controlWithTriggerOpt;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public void unsetControlWithTriggerOpt() {
if( controlWithTriggerOpt != null ) ( ( InternalEList.Unsettable< ? > ) controlWithTriggerOpt ).unset();
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public boolean isSetControlWithTriggerOpt() {
return controlWithTriggerOpt != null && ( ( InternalEList.Unsettable< ? > ) controlWithTriggerOpt ).isSet();
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
......@@ -1250,8 +1230,6 @@ public abstract class AnyLNImpl extends UnNamingImpl implements AnyLN {
return ( ( InternalEList< ? > ) getReferredByIEDName() ).basicRemove( otherEnd, msgs );
case SclPackage.ANY_LN__REFERRED_BY_LNODE:
return ( ( InternalEList< ? > ) getReferredByLNode() ).basicRemove( otherEnd, msgs );
case SclPackage.ANY_LN__CONTROL_WITH_TRIGGER_OPT:
return ( ( InternalEList< ? > ) getControlWithTriggerOpt() ).basicRemove( otherEnd, msgs );
}
return super.eInverseRemove( otherEnd, featureID, msgs );
}
......@@ -1294,9 +1272,6 @@ public abstract class AnyLNImpl extends UnNamingImpl implements AnyLN {
return getReferredByIEDName();
case SclPackage.ANY_LN__REFERRED_BY_LNODE:
return getReferredByLNode();
case SclPackage.ANY_LN__CONTROL_WITH_TRIGGER_OPT:
if( coreType ) return getControlWithTriggerOpt();
return ( ( FeatureMap.Internal ) getControlWithTriggerOpt() ).getWrapper();
}
return super.eGet( featureID, resolve, coreType );
}
......@@ -1365,9 +1340,6 @@ public abstract class AnyLNImpl extends UnNamingImpl implements AnyLN {
getReferredByLNode().clear();
getReferredByLNode().addAll( ( Collection< ? extends LNode > ) newValue );
return;
case SclPackage.ANY_LN__CONTROL_WITH_TRIGGER_OPT:
( ( FeatureMap.Internal ) getControlWithTriggerOpt() ).set( newValue );
return;
}
super.eSet( featureID, newValue );
}
......@@ -1425,9 +1397,6 @@ public abstract class AnyLNImpl extends UnNamingImpl implements AnyLN {
case SclPackage.ANY_LN__REFERRED_BY_LNODE:
unsetReferredByLNode();
return;
case SclPackage.ANY_LN__CONTROL_WITH_TRIGGER_OPT:
unsetControlWithTriggerOpt();
return;
}
super.eUnset( featureID );
}
......@@ -1470,8 +1439,6 @@ public abstract class AnyLNImpl extends UnNamingImpl implements AnyLN {
return isSetReferredByIEDName();
case SclPackage.ANY_LN__REFERRED_BY_LNODE:
return isSetReferredByLNode();
case SclPackage.ANY_LN__CONTROL_WITH_TRIGGER_OPT:
return isSetControlWithTriggerOpt();
}
return super.eIsSet( featureID );
}
......@@ -1517,8 +1484,6 @@ public abstract class AnyLNImpl extends UnNamingImpl implements AnyLN {
result.append( lnType );
else
result.append( "<unset>" );
result.append( ", ControlWithTriggerOpt: " );
result.append( controlWithTriggerOpt );
result.append( ')' );
return result.toString();
}
......
......@@ -4542,16 +4542,6 @@ public class SclPackageImpl extends EPackageImpl implements SclPackage {
return ( EReference ) getAnyLN().getEStructuralFeatures().get( 14 );
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public EAttribute getAnyLN_ControlWithTriggerOpt() {
return ( EAttribute ) getAnyLN().getEStructuralFeatures().get( 15 );
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
......
......@@ -622,19 +622,11 @@
eType="#//DOI" unsettable="true" containment="true" resolveProxies="false"
eOpposite="#//DOI/ParentAnyLN"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="ReportControl" ordered="false"
upperBound="-1" eType="#//ReportControl" volatile="true" unsettable="true"
containment="true" resolveProxies="false" eOpposite="#//ReportControl/ParentAnyLN">
<eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
<details key="group" value="#ControlWithTriggerOpt"/>
</eAnnotations>
</eStructuralFeatures>
upperBound="-1" eType="#//ReportControl" unsettable="true" containment="true"
resolveProxies="false" eOpposite="#//ReportControl/ParentAnyLN"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="LogControl" ordered="false"
upperBound="-1" eType="#//LogControl" volatile="true" unsettable="true" containment="true"
resolveProxies="false" eOpposite="#//LogControl/ParentAnyLN">
<eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
<details key="group" value="#ControlWithTriggerOpt"/>
</eAnnotations>
</eStructuralFeatures>
upperBound="-1" eType="#//LogControl" unsettable="true" containment="true"
resolveProxies="false" eOpposite="#//LogControl/ParentAnyLN"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="DataSet" ordered="false"
upperBound="-1" eType="#//DataSet" unsettable="true" containment="true" resolveProxies="false"
eOpposite="#//DataSet/ParentAnyLN"/>
......@@ -653,13 +645,6 @@
<eStructuralFeatures xsi:type="ecore:EReference" name="ReferredByLNode" ordered="false"
upperBound="-1" eType="#//LNode" transient="true" unsettable="true" resolveProxies="false"
eOpposite="#//LNode/RefersToAnyLN"/>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="ControlWithTriggerOpt"
ordered="false" upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EFeatureMapEntry"
transient="true" unsettable="true">
<eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
<details key="kind" value="group"/>
</eAnnotations>
</eStructuralFeatures>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Association" eSuperTypes="#//BaseElement #//AgLNRef">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="associationID" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment