/**
* Copyright (c) 2011 - 2015, Lunifera GmbH (Gross Enzersdorf), Loetz KG (Heidelberg)
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Florian Pirchner - Initial implementation
*/
package org.lunifera.dsl.dto.xtext.linker;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.xtext.common.types.JvmTypeReference;
import org.lunifera.dsl.dto.xtext.extensions.MethodNamingExtensions;
import org.lunifera.dsl.semantic.common.types.LAttribute;
import org.lunifera.dsl.semantic.common.types.LReference;
import org.lunifera.dsl.semantic.common.types.LunTypesPackage;
import org.lunifera.dsl.semantic.dto.LDtoInheritedAttribute;
import org.lunifera.dsl.semantic.dto.LDtoInheritedReference;
import org.lunifera.dsl.semantic.dto.LunDtoPackage;
import org.lunifera.dsl.semantic.entity.LBean;
import org.lunifera.dsl.semantic.entity.LBeanReference;
import org.lunifera.dsl.semantic.entity.LEntity;
import org.lunifera.dsl.semantic.entity.LEntityReference;
import org.lunifera.dsl.xtext.lazyresolver.LazyJvmTypeLinkingHelper;
import org.lunifera.dsl.xtext.lazyresolver.validation.SuppressWarningAdapter;
import com.google.inject.Inject;
public class DtoJvmLinkingHelper extends LazyJvmTypeLinkingHelper {
@Inject
private MethodNamingExtensions namingExtension;
public DtoJvmLinkingHelper() {
register(LunDtoPackage.Literals.LDTO__SUPER_TYPE,
LunDtoPackage.Literals.LDTO__SUPER_TYPE_JVM);
register(LunDtoPackage.Literals.LDTO__WRAPPED_TYPE,
LunDtoPackage.Literals.LDTO__WRAPPED_TYPE_JVM);
register(LunTypesPackage.Literals.LATTRIBUTE__TYPE,
LunTypesPackage.Literals.LATTRIBUTE__TYPE_JVM);
register(LunDtoPackage.Literals.LDTO_ABSTRACT_REFERENCE__TYPE,
LunDtoPackage.Literals.LDTO_ABSTRACT_REFERENCE__TYPE_JVM);
register(
LunDtoPackage.Literals.LDTO_INHERITED_ATTRIBUTE__INHERITED_FEATURE,
LunDtoPackage.Literals.LDTO_INHERITED_ATTRIBUTE__INHERITED_FEATURE_TYPE_JVM,
new IJvmLinkCrossRefStringEnhancer() {
@Override
public String enhance(EObject context,
EStructuralFeature feature, String crossRefString) {
LDtoInheritedAttribute lAtt = (LDtoInheritedAttribute) context
.eContainer();
LAttribute lInhAtt = lAtt.getInheritedFeature();
if (lInhAtt.eIsProxy()) {
return crossRefString;
}
if (lInhAtt.getType() instanceof LBean) {
return namingExtension.toDTOBeanSimpleName(lInhAtt
.getType().getName());
} else {
return lInhAtt.getType().getName();
}
}
}, null);
register(LunDtoPackage.Literals.LDTO__WRAPPED_TYPE,
LunDtoPackage.Literals.LDTO__WRAPPED_TYPE_JVM);
register(
LunDtoPackage.Literals.LDTO_INHERITED_REFERENCE__INHERITED_FEATURE,
LunDtoPackage.Literals.LDTO_INHERITED_REFERENCE__INHERITED_FEATURE_TYPE_JVM,
new IJvmLinkCrossRefStringEnhancer() {
@Override
public String enhance(EObject context,
EStructuralFeature feature, String crossRefString) {
LDtoInheritedReference lRef = (LDtoInheritedReference) context
.eContainer();
LReference lInhRef = lRef
.getInheritedFeature();
if(lInhRef.eIsProxy()){
return crossRefString;
}
if(lInhRef instanceof LEntityReference){
LEntityReference lEntityRef = (LEntityReference) lInhRef;
if (lEntityRef.getType() instanceof LEntity) {
return namingExtension
.toDTOBeanSimpleName(lEntityRef.getType()
.getName());
} else {
return lEntityRef.getType().getName();
}
}else if(lInhRef instanceof LBeanReference){
LBeanReference lBeanRef = (LBeanReference) lInhRef;
if (lBeanRef.getType() instanceof LBean) {
return namingExtension
.toDTOBeanSimpleName(lBeanRef.getType()
.getName());
} else {
return lBeanRef.getType().getName();
}
}
throw new IllegalArgumentException(feature + " ----- " + context);
}
}, null);
// Also register the need of a proxy for the jvmType of a mapper. But
// therefore a different crossRefString needs to become used.
register(LunDtoPackage.Literals.LDTO__SUPER_TYPE,
LunDtoPackage.Literals.LDTO__SUPER_TYPE_MAPPER_JVM,
new IJvmLinkCrossRefStringEnhancer() {
@Override
public String enhance(EObject context,
EStructuralFeature feature, String crossRefString) {
return namingExtension.toMapperName(crossRefString);
}
}, new IJvmTypeRefFinisher() {
@Override
public void finish(EStructuralFeature jvmLinkFeature,
JvmTypeReference typeRef) {
typeRef.eAdapters().add(
new SuppressWarningAdapter(
SuppressWarningAdapter.RAW_TYPE));
}
});
}
}