blob: 319b5cbd71bfbad981b1b3f9cf521f443f2af241 [file] [log] [blame]
/**
* Copyright (c) 2011, 2015 - Lunifera GmbH (Gross Enzersdorf, Austria), Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Florian Pirchner - Initial implementation
*/
package org.eclipse.osbp.dsl.entity.xtext.linker;
import org.eclipse.emf.common.util.TreeIterator;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.osbp.dsl.entity.xtext.extensions.Constants;
import org.eclipse.osbp.dsl.semantic.common.types.LDataType;
import org.eclipse.osbp.dsl.semantic.common.types.LScalarType;
import org.eclipse.osbp.dsl.semantic.common.types.LType;
import org.eclipse.osbp.dsl.semantic.common.types.LTypedPackage;
import org.eclipse.osbp.dsl.semantic.common.types.OSBPTypesFactory;
import org.eclipse.osbp.dsl.semantic.entity.LBean;
import org.eclipse.osbp.dsl.semantic.entity.LEntity;
import org.eclipse.osbp.dsl.semantic.entity.LEntityAttribute;
import org.eclipse.osbp.dsl.semantic.entity.LEntityModel;
import org.eclipse.osbp.dsl.semantic.entity.OSBPEntityFactory;
import org.eclipse.osbp.xtext.oxtype.linker.JvmTypeAwareLinker;
import org.eclipse.xtext.diagnostics.IDiagnosticConsumer;
import org.eclipse.xtext.util.OnChangeEvictingCache;
import org.eclipse.xtext.util.concurrent.IUnitOfWork;
import com.google.inject.Inject;
public class EntityLinker extends JvmTypeAwareLinker {
// @Inject
// private OnChangeEvictingCache cache;
// @Override
// protected void doLinkModel(final EObject model, IDiagnosticConsumer consumer) {
// super.doLinkModel(model, consumer);
//
// cache.execWithoutCacheClear(model.eResource(),
// new IUnitOfWork.Void<Resource>() {
// @Override
// public void process(Resource state) throws Exception {
// TreeIterator<EObject> iterator = model.eAllContents();
// while (iterator.hasNext()) {
// EObject eObject = iterator.next();
// if (eObject instanceof LEntity) {
// LEntity entity = (LEntity) eObject;
// if (entity.isHistorized()) {
// applyHistorized(entity);
// } else if (entity.isTimedependent()) {
// applyTimedependent(entity);
// }
// }
// }
// }
// });
// }
protected void afterModelLinked(EObject model,
IDiagnosticConsumer diagnosticsConsumer) {
super.afterModelLinked(model, diagnosticsConsumer);
// load the super types eager to ensure sub types resolving
LEntityModel lModel = (LEntityModel) model;
for (LTypedPackage lPkg : lModel.getPackages()) {
for (LType lType : lPkg.getTypes()) {
if (lType instanceof LEntity) {
LEntity lEntity = (LEntity) lType;
lEntity.getSuperType();
} else if (lType instanceof LBean) {
LBean lBean = (LBean) lType;
lBean.getSuperType();
}
}
}
}
// /**
// * Applies the synthetic attributes for historized entities.
// *
// * @param entity
// */
// protected void applyHistorized(LEntity entity) {
//
// LTypedPackage pkg = (LTypedPackage) entity.eContainer();
//
// LEntityAttribute ooid = OSBPEntityFactory.eINSTANCE
// .createLEntityAttribute();
// ooid.setName(Constants.PROP__OID);
// ooid.setType(findInternalOID(entity, pkg));
// entity.getFeatures().add(ooid);
//
// LEntityAttribute version = OSBPEntityFactory.eINSTANCE
// .createLEntityAttribute();
// version.setName(Constants.PROP__VERSION);
// version.setType(findInternalDatatype(entity, pkg,
// Constants.DT_INTERNAL_OBJECT_VERSION));
// entity.getFeatures().add(version);
//
// LEntityAttribute current = OSBPEntityFactory.eINSTANCE
// .createLEntityAttribute();
// current.setName(Constants.PROP__ISCURRENT);
// current.setType(findInternalDatatype(entity, pkg,
// Constants.DT_INTERNAL_IS_CURRENT_VERSION));
// entity.getFeatures().add(current);
// }
//
// /**
// * Applies the synthetic attributes for historized entities.
// *
// * @param entity
// */
// protected void applyTimedependent(LEntity entity) {
//
// LTypedPackage pkg = (LTypedPackage) entity.eContainer();
//
// LEntityAttribute ooid = OSBPEntityFactory.eINSTANCE
// .createLEntityAttribute();
// ooid.setName(Constants.PROP__OID);
// ooid.setType(findInternalOID(entity, pkg));
// entity.getFeatures().add(ooid);
//
// LEntityAttribute validFrom = OSBPEntityFactory.eINSTANCE
// .createLEntityAttribute();
// validFrom.setName(Constants.PROP__VALID_FROM);
// validFrom.setType(findInternalValidDate(entity, pkg,
// Constants.DT_INTERNAL_VALID_FROM));
// entity.getFeatures().add(validFrom);
//
// LEntityAttribute validUntil = OSBPEntityFactory.eINSTANCE
// .createLEntityAttribute();
// validUntil.setName(Constants.PROP__VALID_UNTIL);
// validUntil.setType(findInternalValidDate(entity, pkg,
// Constants.DT_INTERNAL_VALID_UNTIL));
// entity.getFeatures().add(validUntil);
// }
//
// /**
// * Tries to find the datatype to be used for valid from and valid until.
// *
// * @param entity
// * @param pkg
// * @return
// */
// private LDataType findInternalValidDate(LEntity entity, LTypedPackage pkg,
// String dtName) {
// LDataType datatype = null;
// for (LType type : pkg.getTypes()) {
// if (type instanceof LDataType) {
// LDataType temp = (LDataType) type;
// if (temp.getName().equals(dtName)) {
// datatype = temp;
// break;
// }
// }
// }
//
// if (datatype == null) {
// datatype = OSBPTypesFactory.eINSTANCE.createLDataType();
// datatype.setName(dtName);
// datatype.setDate(true);
// datatype.setDateType(entity.getTimedependentDateType());
// pkg.getTypes().add(datatype);
// }
// return datatype;
// }
//
// /**
// * Tries to find the datatype to be used for valid from and valid until.
// *
// * @param entity
// * @param pkg
// * @return
// */
// private LScalarType findInternalOID(LEntity entity, LTypedPackage pkg) {
// LDataType datatype = null;
// for (LType type : pkg.getTypes()) {
// if (!type.eIsProxy() && type instanceof LDataType) {
// LDataType temp = (LDataType) type;
// if (temp.getName().equals(Constants.DT_INTERNAL_OBJECT_ID)) {
// datatype = temp;
// break;
// }
// }
// }
//
// if (datatype == null) {
// datatype = OSBPTypesFactory.eINSTANCE.createLDataType();
// datatype.setName(Constants.DT_INTERNAL_OBJECT_ID);
// datatype.setSyntheticFlag(true);
// datatype.setSyntheticSelector(Constants.DT_INTERNAL_OBJECT_ID);
// // will be resolved later to avoid entity.super calls. Entity.super
// // would resolve cross references too early.
// datatype.setSyntheticType(entity);
// pkg.getTypes().add(datatype);
// }
// return datatype;
// }
//
// /**
// * Tries to find the datatype to be used for valid from and valid until.
// *
// * @param entity
// * @param pkg
// * @return
// */
// private LDataType findInternalDatatype(LEntity entity, LTypedPackage pkg,
// String syntheticType) {
// LDataType datatype = null;
// for (LType type : pkg.getTypes()) {
// if (type instanceof LDataType) {
// LDataType temp = (LDataType) type;
// if (temp.getName().equals(syntheticType)) {
// datatype = temp;
// break;
// }
// }
// }
//
// if (datatype == null) {
// datatype = OSBPTypesFactory.eINSTANCE.createLDataType();
// datatype.setName(syntheticType);
// datatype.setSyntheticFlag(true);
// datatype.setSyntheticSelector(syntheticType);
// pkg.getTypes().add(datatype);
// }
// return datatype;
// }
}