private <RET extends ORecord> RET saveInternal(ORecord iRecord, String iClusterName, OPERATION_MODE iMode, boolean iForceCreate,
ORecordCallback<? extends Number> iRecordCreatedCallback, ORecordCallback<Integer> iRecordUpdatedCallback) {
if (!(iRecord instanceof ODocument)) {
assignAndCheckCluster(iRecord, iClusterName);
return (RET) currentTx.saveRecord(iRecord, iClusterName, iMode, iForceCreate, iRecordCreatedCallback, iRecordUpdatedCallback);
}
ODocument doc = (ODocument) iRecord;
ODocumentInternal.checkClass(doc, this);
try {
doc.validate();
} catch (OValidationException e) {
doc.undo();
throw e;
}
ODocumentInternal.convertAllMultiValuesToTrackedVersions(doc);
if (iForceCreate || !doc.getIdentity().isValid()) {
if (doc.getClassName() != null)
checkSecurity(ORule.ResourceGeneric.CLASS, ORole.PERMISSION_CREATE, doc.getClassName());
assignAndCheckCluster(doc, iClusterName);
} else {
if (doc.getClassName() != null)
checkSecurity(ORule.ResourceGeneric.CLASS, ORole.PERMISSION_UPDATE, doc.getClassName());
}
doc = (ODocument) currentTx
.saveRecord(iRecord, iClusterName, iMode, iForceCreate, iRecordCreatedCallback, iRecordUpdatedCallback);
return (RET) doc;
}