Search in sources :

Example 31 with EEnum

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);
}
Also used : EnumRule(org.eclipse.xtext.EnumRule) ParserRule(org.eclipse.xtext.ParserRule) TypeRef(org.eclipse.xtext.TypeRef) EEnum(org.eclipse.emf.ecore.EEnum) AbstractMetamodelDeclaration(org.eclipse.xtext.AbstractMetamodelDeclaration) AbstractRule(org.eclipse.xtext.AbstractRule) RuleCall(org.eclipse.xtext.RuleCall) EPackage(org.eclipse.emf.ecore.EPackage) IEObjectDescription(org.eclipse.xtext.resource.IEObjectDescription)

Example 32 with EEnum

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);
            }
        }
    }
}
Also used : INode(org.eclipse.xtext.nodemodel.INode) EnumLiteralDeclaration(org.eclipse.xtext.EnumLiteralDeclaration) Keyword(org.eclipse.xtext.Keyword) EEnumLiteral(org.eclipse.emf.ecore.EEnumLiteral) EEnum(org.eclipse.emf.ecore.EEnum) ReferencedMetamodel(org.eclipse.xtext.ReferencedMetamodel)

Example 33 with EEnum

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);
}
Also used : EClass(org.eclipse.emf.ecore.EClass) ObjectNode(com.fasterxml.jackson.databind.node.ObjectNode) EStructuralFeature(org.eclipse.emf.ecore.EStructuralFeature) EClassifier(org.eclipse.emf.ecore.EClassifier) EEnum(org.eclipse.emf.ecore.EEnum) ArrayNode(com.fasterxml.jackson.databind.node.ArrayNode) ObjectMapper(com.fasterxml.jackson.databind.ObjectMapper) EReference(org.eclipse.emf.ecore.EReference) IfcDoc(org.bimserver.shared.IfcDoc)

Example 34 with EEnum

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));
            }
        }
    }
}
Also used : Query(org.bimserver.database.queries.om.Query) HashMapWrappedVirtualObject(org.bimserver.shared.HashMapWrappedVirtualObject) PackageMetaData(org.bimserver.emf.PackageMetaData) QueryPart(org.bimserver.database.queries.om.QueryPart) EEnum(org.eclipse.emf.ecore.EEnum) EClass(org.eclipse.emf.ecore.EClass) HashMapVirtualObject(org.bimserver.shared.HashMapVirtualObject) QueryObjectProvider(org.bimserver.database.queries.QueryObjectProvider) List(java.util.List) HashMapWrappedVirtualObject(org.bimserver.shared.HashMapWrappedVirtualObject) HashMapVirtualObject(org.bimserver.shared.HashMapVirtualObject) UserException(org.bimserver.shared.exceptions.UserException) EReference(org.eclipse.emf.ecore.EReference)

Example 35 with EEnum

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;
}
Also used : EEnum(org.eclipse.emf.ecore.EEnum) BimserverDatabaseException(org.bimserver.BimserverDatabaseException) EClass(org.eclipse.emf.ecore.EClass) IdEObject(org.bimserver.emf.IdEObject) EDataType(org.eclipse.emf.ecore.EDataType) EStructuralFeature(org.eclipse.emf.ecore.EStructuralFeature) VirtualObject(org.bimserver.shared.VirtualObject) HashMapVirtualObject(org.bimserver.shared.HashMapVirtualObject) EObject(org.eclipse.emf.ecore.EObject) IdEObject(org.bimserver.emf.IdEObject) EEnumLiteral(org.eclipse.emf.ecore.EEnumLiteral) EEnum(org.eclipse.emf.ecore.EEnum)

Aggregations

EEnum (org.eclipse.emf.ecore.EEnum)51 EClass (org.eclipse.emf.ecore.EClass)28 EEnumLiteral (org.eclipse.emf.ecore.EEnumLiteral)22 EDataType (org.eclipse.emf.ecore.EDataType)14 EPackage (org.eclipse.emf.ecore.EPackage)13 EStructuralFeature (org.eclipse.emf.ecore.EStructuralFeature)10 Grammar (org.eclipse.xtext.Grammar)10 Test (org.junit.Test)9 HashMapVirtualObject (org.bimserver.shared.HashMapVirtualObject)8 EClassifier (org.eclipse.emf.ecore.EClassifier)8 EReference (org.eclipse.emf.ecore.EReference)7 BimserverDatabaseException (org.bimserver.BimserverDatabaseException)6 IdEObject (org.bimserver.emf.IdEObject)6 EObject (org.eclipse.emf.ecore.EObject)6 EnumRule (org.eclipse.xtext.EnumRule)6 EnumLiteralDeclaration (org.eclipse.xtext.EnumLiteralDeclaration)5 List (java.util.List)4 IdEObjectImpl (org.bimserver.emf.IdEObjectImpl)4 VirtualObject (org.bimserver.shared.VirtualObject)4 EAttribute (org.eclipse.emf.ecore.EAttribute)4