use of org.bimserver.shared.HashMapVirtualObject 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.bimserver.shared.HashMapVirtualObject 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.bimserver.shared.HashMapVirtualObject in project BIMserver by opensourceBIM.
the class RemoveAttributeChange method execute.
@SuppressWarnings("rawtypes")
@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 (!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());
}
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 (eAttribute.isMany()) {
List list = (List) object.get(eAttribute.getName());
list.remove(index);
}
}
use of org.bimserver.shared.HashMapVirtualObject in project BIMserver by opensourceBIM.
the class ObjectProviderProxy method next.
@Override
public HashMapVirtualObject next() throws BimserverDatabaseException {
HashMapVirtualObject next = objectProvider.next();
if (next != null) {
if (next == last) {
throw new BimserverDatabaseException("Endless loop detected");
}
last = next;
objectListener.newObject(next);
}
return next;
}
Aggregations