blob: 1a92d901f083c71f9837d595721a1a94aa290ef0 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2013, 2018 CEA LIST and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v20.html
*
* Contributors:
* E.D.Willink(CEA LIST) - Initial API and implementation
*******************************************************************************/
package org.eclipse.ocl.examples.codegen.java.types;
import org.eclipse.emf.ecore.EClassifier;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.ocl.examples.codegen.cgmodel.CGUnboxExp;
import org.eclipse.ocl.examples.codegen.cgmodel.CGValuedElement;
import org.eclipse.ocl.examples.codegen.generator.CodeGenerator;
import org.eclipse.ocl.examples.codegen.generator.GenModelHelper;
import org.eclipse.ocl.examples.codegen.generator.TypeDescriptor;
import org.eclipse.ocl.examples.codegen.java.JavaLocalContext;
import org.eclipse.ocl.examples.codegen.java.JavaStream;
import org.eclipse.ocl.pivot.CollectionType;
import org.eclipse.ocl.pivot.Type;
import org.eclipse.ocl.pivot.ids.CollectionTypeId;
import org.eclipse.ocl.pivot.ids.IdResolver;
import org.eclipse.ocl.pivot.ids.TemplateParameterId;
import org.eclipse.ocl.pivot.ids.TypeId;
import org.eclipse.ocl.pivot.internal.manager.PivotMetamodelManager;
import org.eclipse.ocl.pivot.internal.utilities.EnvironmentFactoryInternal;
/**
* A BoxedValueDescriptor describes a type whose boxed representation differs from its unboxed representation. It has a pivot ElementId and a Java class.
* <p>
* Thus an IntegerValue is a TypeId.INTEGER and an org.eclipse.ocl.domain.values.IntegerValue.
*/
public class BoxedValuesDescriptor extends AbstractValueDescriptor implements BoxedDescriptor
{
private /*@LazyNonNull*/ CollectionDescriptor unboxedDescriptor;
private /*@LazyNonNull*/ CollectionDescriptor ecoreDescriptor;
public BoxedValuesDescriptor(@NonNull CollectionTypeId elementId, @NonNull Class<?> javaClass) {
super(elementId, javaClass);
}
@Override
public @NonNull Boolean appendUnboxStatements(@NonNull JavaStream js, @NonNull JavaLocalContext<@NonNull ?> localContext,
@NonNull CGUnboxExp cgUnboxExp, @NonNull CGValuedElement boxedValue) {
// if (collectionDescriptor != null) {
js.append("final ");
// js.appendIsRequired(true);
// js.append(" ");
unboxedDescriptor.append(js, true);
// js.appendClassReference(List.class, false, unboxedTypeDescriptor.getJavaClass());
js.append(" ");
js.appendValueName(cgUnboxExp);
js.append(" = ");
js.appendValueName(boxedValue);
js.append(".asEcoreObjects(");
js.appendReferenceTo(localContext.getIdResolverVariable(cgUnboxExp));
js.append(", ");
unboxedDescriptor.appendElement(js, true);
js.append(".class);\n");
//
js.append("assert ");
js.appendValueName(cgUnboxExp);
js.append(" != null;\n");
// }
return true;
}
protected EClassifier getEClassifier(@NonNull PivotMetamodelManager metamodelManager, @NonNull Type type) {
for (@SuppressWarnings("null")org.eclipse.ocl.pivot.@NonNull Class dType : metamodelManager.getPartialClasses(type)) {
EClassifier eClass = (EClassifier) dType.getESObject();
if (eClass != null) {
return eClass;
}
}
return null;
}
@Override
public @NonNull EcoreDescriptor getEcoreDescriptor(@NonNull CodeGenerator codeGenerator, @Nullable Class<?> instanceClass) {
CollectionDescriptor ecoreDescriptor2 = ecoreDescriptor;
if (ecoreDescriptor2 == null) {
Type type;
CollectionTypeId id = (CollectionTypeId)elementId;
TypeId typeId = id.getElementTypeId();
TypeId generalizedId = id.getGeneralizedId();
EnvironmentFactoryInternal environmentFactory = codeGenerator.getEnvironmentFactory();
IdResolver idResolver = environmentFactory.getIdResolver();
if (generalizedId == id) {
type = idResolver.getClass(id, null);
}
else if (typeId instanceof TemplateParameterId) {
CollectionType collectionType = (CollectionType) idResolver.getClass(generalizedId, null);
type = collectionType.getElementType();
assert type != null;
}
else {
type = idResolver.getClass(typeId, null);
}
/* EClassifier eClassifier = getEClassifier(environmentFactory.getMetamodelManager(), type);
if (eClassifier != null) {
GenModelHelper genModelHelper = codeGenerator.getGenModelHelper();
try {
Class<?> javaClass = genModelHelper.getEcoreInterfaceClassifier(eClassifier);
ecoreDescriptor2 = new EObjectsDescriptor(id, eClassifier, javaClass);
}
catch (Exception e) {
String instanceClassName = type.getInstanceClassName();
if (instanceClassName == null) {
instanceClassName = genModelHelper.getEcoreInterfaceClassifierName(eClassifier);
}
if (instanceClassName != null) {
ecoreDescriptor2 = new FutureEObjectsDescriptor(id, eClassifier, instanceClassName);
}
}
} */
// if (ecoreDescriptor2 == null) {
ecoreDescriptor2 = new EcoreListDescriptor(id, environmentFactory.getStandardLibrary(), type);
// }
ecoreDescriptor = ecoreDescriptor2;
}
return (EcoreDescriptor) ecoreDescriptor2;
}
@Override
public @NonNull UnboxedDescriptor getUnboxedDescriptor(@NonNull CodeGenerator codeGenerator) {
CollectionDescriptor unboxedDescriptor2 = unboxedDescriptor;
if (unboxedDescriptor2 == null) {
org.eclipse.ocl.pivot.Class type;
CollectionTypeId id = (CollectionTypeId)elementId;
TypeId generalizedId = id.getGeneralizedId();
EnvironmentFactoryInternal environmentFactory = codeGenerator.getEnvironmentFactory();
IdResolver idResolver = environmentFactory.getIdResolver();
if (generalizedId == id) {
type = idResolver.getClass(id, null);
}
else {
TypeId typeId = id.getElementTypeId();
type = idResolver.getClass(typeId, null);
}
EClassifier eClassifier = getEClassifier(environmentFactory.getMetamodelManager(), type);
if (eClassifier != null) {
GenModelHelper genModelHelper = codeGenerator.getGenModelHelper();
try {
Class<?> javaClass = genModelHelper.getEcoreInterfaceClassifier(eClassifier);
unboxedDescriptor2 = new EObjectsDescriptor(id, eClassifier, javaClass);
}
catch (Exception e) {
String instanceClassName = type.getInstanceClassName();
if (instanceClassName == null) {
instanceClassName = genModelHelper.getEcoreInterfaceClassifierName(eClassifier);
}
if (instanceClassName != null) {
unboxedDescriptor2 = new FutureEObjectsDescriptor(id, eClassifier, instanceClassName);
}
}
}
if (unboxedDescriptor2 == null) {
unboxedDescriptor2 = new UnboxedElementsDescriptor(id, environmentFactory.getStandardLibrary(), type);
}
unboxedDescriptor = unboxedDescriptor2;
}
return unboxedDescriptor2;
}
@Override
public final boolean isAssignableFrom(@NonNull TypeDescriptor typeDescriptor) {
if (!(typeDescriptor instanceof BoxedDescriptor)) {
return false;
}
return javaClass.isAssignableFrom(typeDescriptor.getJavaClass());
}
}