| OCL generator and EMF super types [message #1774435] | 
Sat, 14 October 2017 06:25   | 
 
Eclipse User  | 
 | 
 | 
   | 
 
Hi all,  
 
I detect a strange behavior during the EMF generation when I have OCL constraints generated in the EMF java code. 
 
So, I have a first metamodel  
 
package metamodel : metamodel = 'http://metamodel'
{
	class ClassA extends Class
	{
		attribute name : String[?];
		invariant name_inv: name <> 'test';
	}
	class Class;
}
 
 
In the associated genmodel, I add this annotation 
 
  <genAnnotations source="http://www.eclipse.org/OCL/GenModel">
    <details key="Use Delegates" value="false"/>
  </genAnnotations>
 
 
EMF generation works perfectly, and I code of my name_inv is generated: 
public boolean name_inv(final DiagnosticChain diagnostics, final Map<Object, Object> context) {
		/**
		 *
		 * inv name_inv:
		 *   let severity : Integer[1] = 'ClassA::name_inv'.getSeverity()
		 *   in
		 *     if severity <= 0
		 *     then true
		 *     else
		 *       let result : Boolean[1] = name <> 'test'
		 *       in
		 *         'ClassA::name_inv'.logDiagnostic(self, null, diagnostics, context, null, severity, result, 0)
		 *     endif
		 */
		final /*@NonInvalid*/ Executor executor = PivotUtilInternal.getExecutor(this);
		final /*@NonInvalid*/ IntegerValue severity_0 = CGStringGetSeverityOperation.INSTANCE.evaluate(executor, MetamodelTables.STR_ClassA_c_c_name_inv);
		final /*@NonInvalid*/ boolean le = OclComparableLessThanEqualOperation.INSTANCE.evaluate(executor, severity_0, MetamodelTables.INT_0).booleanValue();
		/*@NonInvalid*/ boolean symbol_0;
		if (le) {
			symbol_0 = ValueUtil.TRUE_VALUE;
		}
		else {
			final /*@NonInvalid*/ String name = this.getName();
			final /*@NonInvalid*/ boolean result = !MetamodelTables.STR_test.equals(name);
			final /*@NonInvalid*/ boolean logDiagnostic = CGStringLogDiagnosticOperation.INSTANCE.evaluate(executor, TypeId.BOOLEAN, MetamodelTables.STR_ClassA_c_c_name_inv, this, (Object)null, diagnostics, context, (Object)null, severity_0, result, MetamodelTables.INT_0).booleanValue();
			symbol_0 = logDiagnostic;
		}
		return Boolean.TRUE == symbol_0;
	}
 
 
Now, I have this second metamodel: 
 
import metamodel : '../../metamodel.emf/model/Metamodel.ecore#/' ;
package metamodel2 : metamodel2 = 'http://metamodel2'
{
	class ClassB extends metamodel::Class,metamodel::ClassA;
}
 
 
So, I have this diagram: 
 
  
 
When I generate the EMF model code of the second metamodel,  
I obtain errors on ClassBImpl class saying that: 
 
Quote: 
The type ClassBImpl must implement the inherited abstract method ClassA.name_inv(DiagnosticChain, Map<Object,Object>) 
  
 
To resolve it, I add the unimplemented method using the quick fix. 
 
HOWEVER, when I edit my second metamodel by changing the order of the extended classes,  
 
import metamodel : '../../metamodel.emf/model/Metamodel.ecore#/' ;
package metamodel2 : metamodel2 = 'http://metamodel2'
{
	class ClassB extends metamodel::ClassA, metamodel::Class;
}
 
 
the generation works perfectly without errors. 
 
So, my questions are: 
 
Is that a OCL generation bug? 
Otherwise, Is the order of extended classes important? 
and must conform to a specific representation enforced by EMF and OCL ? 
[Updated on: Sat, 14 October 2017 06:42] by Moderator  
 |  
 |  
  | 
 | 
 | 
Powered by 
FUDForum. Page generated in 0.03885 seconds