@SuppressWarnings("unchecked")
protected void createReferences(DcObject dco) {
for (DcField field : dco.getFields()) {
Object value = dco.getValue(field.getIndex());
if (field.getValueType() == DcRepository.ValueTypes._DCOBJECTREFERENCE) {
DcObject reference = value instanceof DcObject ? (DcObject) value : null;
if (reference == null) continue;
// also created references for the sub items of this reference...
createReferences(reference);
try {
DcObject existing = DataManager.getItem(reference.getModule().getIndex(), reference.getID());
existing = existing == null ? DataManager.getObjectForString(reference.getModule().getIndex(), reference.toString()) : existing;
if (existing == null) {
// save the value that was set
reference.setValidate(false);
reference.saveNew(false);
reference.setValidate(true);
} else {
// reuse the existing value
dco.setValue(field.getIndex(), existing);
}
} catch (Exception e) {
logger.error("Error (" + e + ") while creating a new reference item; " + reference, e);
}
} else if (field.getValueType() == DcRepository.ValueTypes._DCOBJECTCOLLECTION) {
if (value == null)
continue;
for (DcMapping mapping : (Collection<DcMapping>) value) {
DcObject reference = mapping.getReferencedObject();
try {
if (reference == null) continue;
// also created references for the sub items of this reference...
createReferences(reference);
DcObject existing = DataManager.getItem(reference.getModule().getIndex(), reference.getID());
existing = existing == null ? DataManager.getObjectForString(reference.getModule().getIndex(), reference.toString()) : existing;
if (existing == null) {
reference.setValidate(false);
reference.saveNew(false);
reference.setValidate(true);
} else {
mapping.setValue(DcMapping._B_REFERENCED_ID, existing.getID());
}
} catch (Exception e) {
logger.error("Error (" + e + ") while creating a new reference item; " + reference, e);
}
}