use of org.eclipse.emf.ecore.EEnum in project xtext-core by eclipse.
the class XtextScopeProvider method getScope.
@Override
public IScope getScope(final EObject context, EReference reference) {
if (reference == XtextPackage.eINSTANCE.getTypeRef_Classifier()) {
if (context instanceof TypeRef) {
final TypeRef typeRef = (TypeRef) context;
final AbstractMetamodelDeclaration metaModel = typeRef.getMetamodel();
if (metaModel != null) {
EPackage pack = metaModel.getEPackage();
if (pack != null)
return createClassifierScope(Collections.singletonList(pack));
} else {
return createReferencedPackagesScope(GrammarUtil.getGrammar(context));
}
} else {
return createReferencedPackagesScope(GrammarUtil.getGrammar(context));
}
return IScope.NULLSCOPE;
}
if (reference == XtextPackage.eINSTANCE.getEnumLiteralDeclaration_EnumLiteral()) {
final EnumRule rule = GrammarUtil.containingEnumRule(context);
if (rule.getType() != null && rule.getType().getClassifier() != null && rule.getType().getClassifier() instanceof EEnum) {
return createEnumLiteralsScope((EEnum) rule.getType().getClassifier());
}
return IScope.NULLSCOPE;
}
if (reference == XtextPackage.eINSTANCE.getGrammar_UsedGrammars()) {
return globalScopeProvider.getScope(context.eResource(), reference, new Predicate<IEObjectDescription>() {
@Override
public boolean apply(IEObjectDescription input) {
return !input.getEObjectURI().equals(EcoreUtil.getURI(context));
}
});
}
if (reference == XtextPackage.eINSTANCE.getRuleCall_Rule()) {
return createScope(context.eResource(), reference.getEReferenceType(), new SuperCallScope(context));
}
if (reference == XtextPackage.eINSTANCE.getParameterReference_Parameter()) {
ParserRule rule = GrammarUtil.containingParserRule(context);
if (rule == null) {
return IScope.NULLSCOPE;
}
return Scopes.scopeFor(rule.getParameters());
}
if (reference == XtextPackage.eINSTANCE.getNamedArgument_Parameter()) {
RuleCall ruleCall = EcoreUtil2.getContainerOfType(context, RuleCall.class);
if (ruleCall == null) {
return IScope.NULLSCOPE;
}
AbstractRule referencedRule = ruleCall.getRule();
if (referencedRule instanceof ParserRule) {
return Scopes.scopeFor(((ParserRule) referencedRule).getParameters());
}
return IScope.NULLSCOPE;
}
return createScope(context.eResource(), reference.getEReferenceType(), IScope.NULLSCOPE);
}
use of org.eclipse.emf.ecore.EEnum in project xtext-core by eclipse.
the class Xtext2EcoreTransformer method deriveEnums.
private void deriveEnums(EnumRule rule) {
EEnum returnType = (EEnum) rule.getType().getClassifier();
if (returnType != null) {
List<EnumLiteralDeclaration> decls = EcoreUtil2.getAllContentsOfType(rule, EnumLiteralDeclaration.class);
for (EnumLiteralDeclaration decl : decls) {
if (decl.getEnumLiteral() == null) {
List<INode> nodes = NodeModelUtils.findNodesForFeature(decl, XtextPackage.Literals.ENUM_LITERAL_DECLARATION__ENUM_LITERAL);
if (!nodes.isEmpty()) {
if (nodes.size() > 1)
throw new IllegalStateException("Unexpected nodes found: " + nodes);
INode node = nodes.get(0);
String text = NodeModelUtils.getTokenText(node).replace("^", "");
EEnumLiteral literal = null;
if (rule.getType().getMetamodel() instanceof ReferencedMetamodel) {
literal = returnType.getEEnumLiteral(text);
} else {
EEnumLiteral existing = returnType.getEEnumLiteral(text);
if (existing == null) {
literal = EcoreFactory.eINSTANCE.createEEnumLiteral();
int index = returnType.getELiterals().size();
returnType.getELiterals().add(literal);
literal.setName(text);
literal.setValue(index);
if (decl.getLiteral() != null) {
literal.setLiteral(decl.getLiteral().getValue());
} else {
literal.setLiteral(text);
}
} else {
literal = existing;
}
SourceAdapter.adapt(literal, decl);
}
if (literal == null) {
reportError(new TransformationException(TransformationErrorCode.InvalidFeature, "Enum literal '" + text + "' does not exist.", decl));
} else {
decl.setEnumLiteral(literal);
}
}
}
if (decl.getLiteral() == null && decl.getEnumLiteral() != null) {
Keyword kw = XtextFactory.eINSTANCE.createKeyword();
kw.setValue(decl.getEnumLiteral().getLiteral());
decl.setLiteral(kw);
}
}
}
}
use of org.eclipse.emf.ecore.EEnum in project BIMserver by opensourceBIM.
the class IfcSchemaToJson method convert.
private void convert(OutputStream outputStream, File docs, EPackage ePackage) throws IOException {
IfcDoc ifcDoc = null;
if (docs != null) {
ifcDoc = new IfcDoc(docs);
}
ObjectMapper objectMapper = new ObjectMapper();
ObjectNode root = objectMapper.createObjectNode();
ObjectNode classes = objectMapper.createObjectNode();
root.set("classes", classes);
for (EClassifier eClassifier : ePackage.getEClassifiers()) {
ObjectNode classifierNode = objectMapper.createObjectNode();
classes.set(eClassifier.getName(), classifierNode);
if (eClassifier instanceof EEnum) {
} else if (eClassifier instanceof EClass) {
EClass eClass = (EClass) eClassifier;
String domain = "geometry";
if (ifcDoc != null) {
domain = ifcDoc.getDomain(eClass.getName());
}
classifierNode.put("domain", domain);
ArrayNode superClassesNode = objectMapper.createArrayNode();
classifierNode.set("superclasses", superClassesNode);
for (EClass superClass : eClass.getESuperTypes()) {
superClassesNode.add(superClass.getName());
}
ObjectNode fieldsNode = objectMapper.createObjectNode();
classifierNode.set("fields", fieldsNode);
for (EStructuralFeature eStructuralFeature : eClass.getEStructuralFeatures()) {
ObjectNode fieldNode = objectMapper.createObjectNode();
fieldsNode.set(eStructuralFeature.getName(), fieldNode);
fieldNode.put("type", convertType(eStructuralFeature.getEType()));
fieldNode.put("reference", eStructuralFeature instanceof EReference);
fieldNode.put("many", eStructuralFeature.isMany());
fieldNode.put("inverse", eStructuralFeature.getEAnnotation("inverse") != null);
}
}
}
objectMapper.writerWithDefaultPrettyPrinter().writeValue(outputStream, root);
}
use of org.eclipse.emf.ecore.EEnum in project BIMserver by opensourceBIM.
the class SetWrappedAttributeChange method execute.
@SuppressWarnings({ "rawtypes", "unchecked" })
@Override
public void execute(Transaction transaction) throws UserException, BimserverLockConflictException, BimserverDatabaseException, IOException, QueryException {
PackageMetaData packageMetaData = transaction.getDatabaseSession().getMetaDataManager().getPackageMetaData(transaction.getProject().getSchema());
Query query = new Query(packageMetaData);
QueryPart queryPart = query.createQueryPart();
queryPart.addOid(oid);
HashMapVirtualObject object = transaction.get(oid);
if (object == null) {
QueryObjectProvider queryObjectProvider = new QueryObjectProvider(transaction.getDatabaseSession(), transaction.getBimServer(), query, Collections.singleton(transaction.getPreviousRevision().getOid()), packageMetaData);
object = queryObjectProvider.next();
transaction.updated(object);
}
EClass eClass = transaction.getDatabaseSession().getEClassForOid(oid);
if (!ChangeHelper.canBeChanged(eClass)) {
throw new UserException("Only objects from the following schemas are allowed to be changed: Ifc2x3tc1 and IFC4, this object (" + eClass.getName() + ") is from the \"" + eClass.getEPackage().getName() + "\" package");
}
if (object == null) {
throw new UserException("No object of type \"" + eClass.getName() + "\" with oid " + oid + " found in project with pid " + transaction.getProject().getId());
}
EReference eReference = packageMetaData.getEReference(eClass.getName(), attributeName);
if (eReference == null) {
throw new UserException("No reference with the name \"" + attributeName + "\" found in class \"" + eClass.getName() + "\"");
}
if (value instanceof List && eReference.isMany()) {
List sourceList = (List) value;
if (!eReference.isMany()) {
throw new UserException("Attribute is not of type 'many'");
}
List list = (List) object.eGet(eReference);
for (Object o : sourceList) {
if (eReference.getEType() == EcorePackage.eINSTANCE.getEDouble()) {
List asStringList = (List) object.eGet(object.eClass().getEStructuralFeature(attributeName + "AsString"));
asStringList.add(String.valueOf(o));
}
list.add(o);
}
} else {
if (eReference.isMany()) {
throw new UserException("Attribute is not of type 'single'");
}
if (eReference.getEType() instanceof EEnum) {
EEnum eEnum = (EEnum) eReference.getEType();
object.set(eReference.getName(), eEnum.getEEnumLiteral(((String) value).toUpperCase()).getInstance());
} else {
EClass typeEClass = (EClass) packageMetaData.getEClassifier(type);
if (typeEClass.getEAnnotation("wrapped") == null) {
throw new UserException("Not a wrapped type");
}
HashMapWrappedVirtualObject wrappedObject = new HashMapWrappedVirtualObject(typeEClass);
if (typeEClass == Ifc2x3tc1Package.eINSTANCE.getIfcBoolean()) {
if ((Boolean) value == true) {
value = Tristate.TRUE;
} else {
value = Tristate.FALSE;
}
}
wrappedObject.set(wrappedObject.eClass().getEStructuralFeature("wrappedValue").getName(), value);
object.set(eReference.getName(), wrappedObject);
if (value instanceof Double) {
wrappedObject.set(wrappedObject.eClass().getEStructuralFeature("wrappedValueAsString").getName(), String.valueOf((Double) value));
}
}
}
}
use of org.eclipse.emf.ecore.EEnum in project BIMserver by opensourceBIM.
the class DatabaseSession method convertObjectToByteArray.
private ByteBuffer convertObjectToByteArray(IdEObject object, ByteBuffer buffer, PackageMetaData packageMetaData) throws BimserverDatabaseException {
if (object.getUuid() == null) {
throw new BimserverDatabaseException("UUID is required " + object.eClass().getName());
}
int bufferSize = getExactSize(object, packageMetaData, true);
if (bufferSize > buffer.capacity()) {
LOGGER.debug("Buffer too small (" + bufferSize + ")");
buffer = ByteBuffer.allocate(bufferSize);
}
int unsettedLength = packageMetaData.getUnsettedLength(object.eClass());
byte[] unsetted = new byte[unsettedLength];
int fieldCounter = 0;
for (EStructuralFeature feature : object.eClass().getEAllStructuralFeatures()) {
if (packageMetaData.useForDatabaseStorage(object.eClass(), feature)) {
if (useUnsetBit(feature, object)) {
unsetted[fieldCounter / 8] |= (1 << (fieldCounter % 8));
}
fieldCounter++;
}
}
buffer.put(unsetted);
EClass eClass = getEClassForOid(object.getOid());
if (!eClass.isSuperTypeOf(object.eClass())) {
throw new BimserverDatabaseException("Object with oid " + object.getOid() + " is a " + object.eClass().getName() + " but it's cid-part says it's a " + eClass.getName());
}
buffer.putLong(object.getUuid().getMostSignificantBits());
buffer.putLong(object.getUuid().getLeastSignificantBits());
for (EStructuralFeature feature : object.eClass().getEAllStructuralFeatures()) {
if (packageMetaData.useForDatabaseStorage(object.eClass(), feature)) {
if (!useUnsetBit(feature, object)) {
if (feature.isMany()) {
writeList(object, buffer, packageMetaData, feature);
} else {
Object value = object.eGet(feature);
if (feature.getEType() instanceof EEnum) {
if (value == null) {
buffer.putInt(-1);
} else {
EEnum eEnum = (EEnum) feature.getEType();
EEnumLiteral eEnumLiteral = eEnum.getEEnumLiteralByLiteral(((Enum<?>) value).toString());
if (eEnumLiteral != null) {
buffer.putInt(eEnumLiteral.getValue());
} else {
LOGGER.error(((Enum<?>) value).toString() + " not found");
buffer.putInt(-1);
}
}
} else if (feature.getEType() instanceof EClass) {
if (value == null) {
buffer.order(ByteOrder.LITTLE_ENDIAN);
buffer.putShort((short) -1);
buffer.order(ByteOrder.BIG_ENDIAN);
} else {
IdEObject referencedObject = (IdEObject) value;
EClass referencedClass = referencedObject.eClass();
if (feature.getEAnnotation("dbembed") != null) {
writeEmbeddedValue(object.getPid(), object.getRid(), value, buffer, packageMetaData);
} else if (referencedClass.getEAnnotation("wrapped") != null) {
writeWrappedValue(object.getPid(), object.getRid(), value, buffer, packageMetaData);
} else {
writeReference(object, value, buffer, feature);
}
}
} else if (feature.getEType() instanceof EDataType) {
writePrimitiveValue(feature, value, buffer);
}
}
}
}
}
if (buffer.position() != bufferSize) {
throw new BimserverDatabaseException("Value buffer sizes do not match for " + object.eClass().getName() + " " + buffer.position() + "/" + bufferSize);
}
return buffer;
}
Aggregations