use of org.eclipse.emf.ecore.EEnum in project BIMserver by opensourceBIM.
the class DatabaseSession method convertByteArrayToObject.
@SuppressWarnings({ "unused" })
private IdEObject convertByteArrayToObject(IdEObject idEObject, EClass originalQueryClass, EClass eClass, long oid, ByteBuffer buffer, IfcModelInterface model, int rid, QueryInterface query, TodoList todoList) throws BimserverDatabaseException {
try {
if (idEObject == null) {
idEObject = createInternal(eClass, query);
((IdEObjectImpl) idEObject).setOid(oid);
((IdEObjectImpl) idEObject).setPid(query.getPid());
if (rid == Integer.MAX_VALUE) {
throw new BimserverDatabaseException("Database corrupt, rid cannot be " + Integer.MAX_VALUE);
}
}
if (idEObject.eClass().getEAnnotation("wrapped") == null) {
try {
model.addAllowMultiModel(oid, idEObject);
} catch (IfcModelInterfaceException e) {
throw new BimserverDatabaseException(e);
}
}
((IdEObjectImpl) idEObject).setRid(rid);
((IdEObjectImpl) idEObject).useInverses(false);
if (DEVELOPER_DEBUG && StorePackage.eINSTANCE == idEObject.eClass().getEPackage()) {
LOGGER.info("Read: " + idEObject.eClass().getName() + " pid=" + query.getPid() + " oid=" + oid + " rid=" + rid);
}
((IdEObjectImpl) idEObject).setLoadingState(State.LOADING);
objectCache.put(oid, idEObject);
int unsettedLength = model.getPackageMetaData().getUnsettedLength(eClass);
byte[] unsetted = new byte[unsettedLength];
buffer.get(unsetted);
int fieldCounter = 0;
((IdEObjectImpl) idEObject).setUuid(new UUID(buffer.getLong(), buffer.getLong()));
for (EStructuralFeature feature : eClass.getEAllStructuralFeatures()) {
try {
if (model.getPackageMetaData().useForDatabaseStorage(eClass, feature)) {
boolean isUnsetted = (unsetted[fieldCounter / 8] & (1 << (fieldCounter % 8))) != 0;
if (isUnsetted) {
if (feature.isUnsettable()) {
idEObject.eUnset(feature);
} else if (feature.isMany()) {
// do nothing
} else if (feature.getDefaultValue() != null) {
idEObject.eSet(feature, feature.getDefaultValue());
}
} else {
if (false) {
// we have to do some reading to maintain a correct
// index
fakeRead(buffer, feature);
} else {
Object newValue = null;
if (feature.isMany()) {
newValue = readList(idEObject, originalQueryClass, buffer, model, query, todoList, feature);
} else {
if (feature.getEType() instanceof EEnum) {
int enumOrdinal = buffer.getInt();
if (enumOrdinal == -1) {
newValue = null;
} else {
EClassifier eType = feature.getEType();
EEnumLiteral enumLiteral = ((EEnumImpl) eType).getEEnumLiteral(enumOrdinal);
if (enumLiteral != null) {
newValue = enumLiteral.getInstance();
}
}
} else if (feature.getEType() instanceof EClass) {
// EReference eReference = (EReference) feature;
buffer.order(ByteOrder.LITTLE_ENDIAN);
short cid = buffer.getShort();
buffer.order(ByteOrder.BIG_ENDIAN);
if (cid == -1) {
// null, do nothing
} else if (cid < 0) {
// non minus one and negative cid means value is embedded in record
EClass referenceClass = database.getEClassForCid((short) (-cid));
if (feature.getEAnnotation("dbembed") != null) {
newValue = readEmbeddedValue(feature, buffer, referenceClass, query);
} else {
newValue = readWrappedValue(feature, buffer, referenceClass, query);
}
} else if (cid > 0) {
// positive cid means value is reference to other record
EClass referenceClass = database.getEClassForCid(cid);
if (referenceClass == null) {
throw new BimserverDatabaseException("No eClass found for cid " + cid);
}
// readReference is going to read a long, which includes the 2 bytes for the cid
buffer.position(buffer.position() - 2);
newValue = readReference(originalQueryClass, buffer, model, idEObject, feature, referenceClass, query, todoList);
// if (eReference.getEOpposite() != null &&
// ((IdEObjectImpl)
// newValue).isLoadedOrLoading()) {
// newValue = null;
// }
}
} else if (feature.getEType() instanceof EDataType) {
newValue = readPrimitiveValue(feature.getEType(), buffer, query);
}
}
if (newValue != null) {
idEObject.eSet(feature, newValue);
}
}
}
fieldCounter++;
}
} catch (StringIndexOutOfBoundsException e) {
throw new BimserverDatabaseException("Reading " + eClass.getName() + "(" + oid + ")." + feature.getName(), e);
} catch (BufferUnderflowException e) {
throw new BimserverDatabaseException("Reading " + eClass.getName() + "(" + oid + ")." + feature.getName(), e);
} catch (BufferOverflowException e) {
throw new BimserverDatabaseException("Reading " + eClass.getName() + "(" + oid + ")." + feature.getName(), e);
}
}
((IdEObjectImpl) idEObject).setLoaded();
((IdEObjectImpl) idEObject).useInverses(true);
if (DEVELOPER_DEBUG && idEObject.getRid() > 100000 || idEObject.getRid() < -100000) {
LOGGER.debug("Improbable rid " + idEObject.getRid() + " - " + idEObject);
}
return idEObject;
} catch (BufferUnderflowException e) {
throw new BimserverDatabaseException("Reading " + eClass.getName(), e);
} catch (BufferOverflowException e) {
throw new BimserverDatabaseException("Reading " + eClass.getName(), e);
}
}
use of org.eclipse.emf.ecore.EEnum in project BIMserver by opensourceBIM.
the class SetAttributeChange 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());
HashMapVirtualObject object = transaction.get(oid);
if (object == null) {
Query query = new Query(packageMetaData);
QueryPart queryPart = query.createQueryPart();
queryPart.addOid(oid);
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 (object == null) {
throw new UserException("No object of type \"" + eClass.getName() + "\" with oid " + oid + " found in project with pid " + transaction.getProject().getId());
}
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");
}
EAttribute eAttribute = packageMetaData.getEAttribute(eClass.getName(), attributeName);
if (eAttribute == null) {
throw new UserException("No attribute with the name \"" + attributeName + "\" found in class \"" + eClass.getName() + "\"");
}
if (value instanceof List && eAttribute.isMany()) {
List sourceList = (List) value;
if (!eAttribute.isMany()) {
throw new UserException("Attribute is not of type 'many'");
}
List list = (List) object.eGet(eAttribute);
list.clear();
List asStringList = null;
if (eAttribute.getEType() == EcorePackage.eINSTANCE.getEDouble()) {
asStringList = (List) object.eGet(object.eClass().getEStructuralFeature(attributeName + "AsString"));
asStringList.clear();
}
for (Object o : sourceList) {
if (eAttribute.getEType() == EcorePackage.eINSTANCE.getEDouble()) {
asStringList.add(String.valueOf(o));
}
list.add(o);
}
} else {
if (eAttribute.isMany()) {
throw new UserException("Attribute is not of type 'single'");
}
if (eAttribute.getEType() instanceof EEnum) {
EEnum eEnum = (EEnum) eAttribute.getEType();
if (eEnum.getName().contentEquals("Tristate")) {
object.set(eAttribute.getName(), packageMetaData.getEEnum("Tristate").getEEnumLiteral(((Boolean) value).toString().toUpperCase()).getInstance());
} else {
object.set(eAttribute.getName(), eEnum.getEEnumLiteral(((String) value).toUpperCase()).getInstance());
}
} else {
object.set(eAttribute.getName(), value);
}
if (value instanceof Double) {
object.set(object.eClass().getEStructuralFeature(attributeName + "AsString").getName(), String.valueOf((Double) value));
}
}
}
use of org.eclipse.emf.ecore.EEnum in project BIMserver by opensourceBIM.
the class DatabaseReadingStackFrame method convertByteArrayToObject.
protected HashMapVirtualObject convertByteArrayToObject(EClass eClass, long oid, ByteBuffer buffer, int rid) throws BimserverDatabaseException {
try {
int unsettedLength = getPackageMetaData().getUnsettedLength(eClass);
byte[] unsetted = new byte[unsettedLength];
buffer.get(unsetted);
int fieldCounter = 0;
HashMapVirtualObject idEObject = new HashMapVirtualObject(reusable, eClass, oid, new UUID(buffer.getLong(), buffer.getLong()));
for (EStructuralFeature feature : eClass.getEAllStructuralFeatures()) {
try {
if (getPackageMetaData().useForDatabaseStorage(eClass, feature)) {
boolean isUnsetted = (unsetted[fieldCounter / 8] & (1 << (fieldCounter % 8))) != 0;
if (isUnsetted) {
if (feature.isUnsettable()) {
idEObject.eUnset(feature);
} else if (feature.isMany()) {
// do nothing
} else if (feature.getDefaultValue() != null) {
idEObject.setAttribute((EAttribute) feature, feature.getDefaultValue());
}
} else {
Object newValue = null;
if (feature.isMany()) {
newValue = readList(idEObject, buffer, feature);
} else {
if (feature.getEType() instanceof EEnum) {
int enumOrdinal = buffer.getInt();
if (enumOrdinal == -1) {
newValue = null;
} else {
EClassifier eType = feature.getEType();
EEnumLiteral enumLiteral = ((EEnumImpl) eType).getEEnumLiteral(enumOrdinal);
if (enumLiteral != null) {
newValue = enumLiteral.getInstance();
}
}
} else if (feature.getEType() instanceof EClass) {
// EReference eReference = (EReference) feature;
buffer.order(ByteOrder.LITTLE_ENDIAN);
short cid = buffer.getShort();
buffer.order(ByteOrder.BIG_ENDIAN);
if (cid == -1) {
// null, do nothing
} else if (cid < 0) {
// negative cid means value is embedded in
// record
EClass referenceClass = queryObjectProvider.getDatabaseSession().getEClass((short) (-cid));
if (feature.getEAnnotation("dbembed") != null) {
newValue = readEmbeddedValue(feature, buffer, referenceClass);
} else {
newValue = readWrappedValue(feature, buffer, referenceClass);
}
} else if (cid > 0) {
// positive cid means value is reference to
// other record
EClass referenceClass = queryObjectProvider.getDatabaseSession().getEClass(cid);
if (referenceClass == null) {
throw new BimserverDatabaseException("No eClass found for cid " + cid);
}
buffer.position(buffer.position() - 2);
newValue = readReference(buffer, feature, referenceClass);
if ((Long) newValue != -1) {
if (queryObjectProvider.hasReadOrIsGoingToRead(((Long) newValue)) || queryObjectProvider.hasReadOrIsGoingToRead(referenceClass)) {
idEObject.addUseForSerialization(feature);
}
}
// if (eReference.getEOpposite() != null &&
// ((IdEObjectImpl)
// newValue).isLoadedOrLoading()) {
// newValue = null;
// }
}
} else if (feature.getEType() instanceof EDataType) {
newValue = readPrimitiveValue(feature.getEType(), buffer);
}
if (newValue != null) {
if (feature instanceof EAttribute) {
idEObject.setAttribute((EAttribute) feature, newValue);
} else {
if (newValue instanceof Long) {
idEObject.setReference((EReference) feature, (Long) newValue);
} else {
idEObject.setReference((EReference) feature, (WrappedVirtualObject) newValue);
}
}
}
}
}
fieldCounter++;
}
} catch (StringIndexOutOfBoundsException e) {
throw new BimserverDatabaseException("Reading " + eClass.getName() + "." + feature.getName(), e);
} catch (BufferUnderflowException e) {
throw new BimserverDatabaseException("Reading " + eClass.getName() + "." + feature.getName() + " " + buffer.capacity(), e);
} catch (BufferOverflowException e) {
throw new BimserverDatabaseException("Reading " + eClass.getName() + "." + feature.getName(), e);
}
}
return idEObject;
} catch (BufferUnderflowException e) {
throw new BimserverDatabaseException("Reading " + eClass.getName(), e);
} catch (BufferOverflowException e) {
throw new BimserverDatabaseException("Reading " + eClass.getName(), e);
}
}
use of org.eclipse.emf.ecore.EEnum in project BIMserver by opensourceBIM.
the class Step0050 method migrate.
@Override
public void migrate(Schema schema, DatabaseSession databaseSession) {
EEnum userType = schema.getEEnum("store", "UserType");
schema.createEEnumLiteral(userType, "MONITOR");
}
use of org.eclipse.emf.ecore.EEnum in project BIMserver by opensourceBIM.
the class SharedJsonDeserializer method readPrimitive.
private Object readPrimitive(JsonReader jsonReader, EStructuralFeature eStructuralFeature) throws IOException, DeserializeException {
EClassifier eClassifier = eStructuralFeature.getEType();
if (eClassifier == EcorePackage.eINSTANCE.getEString()) {
return jsonReader.nextString();
} else if (eClassifier == EcorePackage.eINSTANCE.getEDouble()) {
return jsonReader.nextDouble();
} else if (eClassifier == EcorePackage.eINSTANCE.getEBoolean()) {
return jsonReader.nextBoolean();
} else if (eClassifier == EcorePackage.eINSTANCE.getEInt()) {
return jsonReader.nextInt();
} else if (eClassifier == EcorePackage.eINSTANCE.getEShort()) {
return (short) jsonReader.nextInt();
} else if (eClassifier == EcorePackage.eINSTANCE.getELong()) {
return jsonReader.nextLong();
} else if (eClassifier == EcorePackage.eINSTANCE.getEIntegerObject()) {
return jsonReader.nextInt();
} else if (eClassifier == EcorePackage.eINSTANCE.getEByteArray()) {
return Base64.decodeBase64(jsonReader.nextString());
} else if (eClassifier == EcorePackage.eINSTANCE.getEDate()) {
long timestamp = jsonReader.nextLong();
return new Date(timestamp);
} else if (eClassifier == EcorePackage.eINSTANCE.getEFloat()) {
return (float) jsonReader.nextDouble();
} else if (eClassifier == EcorePackage.eINSTANCE.getEEnum()) {
EEnum eEnum = (EEnum) eStructuralFeature.getEType();
return eEnum.getEEnumLiteral(jsonReader.nextString()).getInstance();
} else if (eClassifier instanceof EClass) {
if (eStructuralFeature.getEType().getName().equals("IfcGloballyUniqueId")) {
IfcGloballyUniqueId ifcGloballyUniqueId = Ifc2x3tc1Factory.eINSTANCE.createIfcGloballyUniqueId();
ifcGloballyUniqueId.setWrappedValue(jsonReader.nextString());
return ifcGloballyUniqueId;
} else if (eStructuralFeature.getEType().getName().equals("Vector3f")) {
jsonReader.beginObject();
Vector3f vector3f = GeometryFactory.eINSTANCE.createVector3f();
jsonReader.nextName();
jsonReader.nextString();
jsonReader.nextName();
vector3f.setX(jsonReader.nextDouble());
jsonReader.nextName();
vector3f.setY(jsonReader.nextDouble());
jsonReader.nextName();
vector3f.setZ(jsonReader.nextDouble());
jsonReader.endObject();
return vector3f;
} else {
throw new DeserializeException(DeserializerErrorCode.UNIMPLEMENTED_BIMSERVER_FEATURE, eStructuralFeature.getEType().getName() + " not implemented");
}
} else if (eClassifier instanceof EEnum) {
EEnum eEnum = (EEnum) eStructuralFeature.getEType();
if (jsonReader.peek() == JsonToken.BOOLEAN) {
return eEnum.getEEnumLiteral(jsonReader.nextBoolean() ? "TRUE" : "FALSE").getInstance();
} else {
return eEnum.getEEnumLiteral(jsonReader.nextString()).getInstance();
}
} else {
throw new DeserializeException(DeserializerErrorCode.UNIMPLEMENTED_BIMSERVER_FEATURE, "Unimplemented type " + eStructuralFeature.getEType().getName());
}
}
Aggregations