@Override public boolean convertRecords2Links() { final Map<OIdentifiable, Change> newChangedValues = new HashMap<OIdentifiable, Change>(); for (Map.Entry<OIdentifiable, Change> entry : changes.entrySet()) { OIdentifiable identifiable = entry.getKey(); if (identifiable instanceof ORecord) { ORID identity = identifiable.getIdentity(); ORecord record = (ORecord) identifiable; identity = record.getIdentity(); newChangedValues.put(identity, entry.getValue()); } else newChangedValues.put(entry.getKey().getIdentity(), entry.getValue()); } for (Map.Entry<OIdentifiable, Change> entry : newChangedValues.entrySet()) { if (entry.getKey() instanceof ORecord) { ORecord record = (ORecord) entry.getKey(); newChangedValues.put(record, entry.getValue()); } else return false; } newEntries.clear(); changes.clear(); changes.putAll(newChangedValues); return true; }
public void remove(OIdentifiable identifiable) { if (removeFromNewEntries(identifiable)) { if (size >= 0) size--; } else { final Change counter = changes.get(identifiable); if (counter == null) { // Not persistent keys can only be in changes or newEntries if (identifiable.getIdentity().isPersistent()) { changes.put(identifiable, new DiffChange(-1)); size = -1; } else // Return immediately to prevent firing of event return; } else { counter.decrement(); if (size >= 0) if (counter.isUndefined()) size = -1; else size--; } } if (this.owner != null) ORecordInternal.unTrack(this.owner, identifiable); if (updateOwner) fireCollectionChangedEvent( new OMultiValueChangeEvent<OIdentifiable, OIdentifiable>( OMultiValueChangeEvent.OChangeType.REMOVE, identifiable, null, identifiable, false)); }
public void add(final OIdentifiable identifiable) { if (identifiable == null) throw new NullPointerException("Impossible to add a null identifiable in a ridbag"); if (identifiable.getIdentity().isValid()) { Change counter = changes.get(identifiable); if (counter == null) changes.put(identifiable, new DiffChange(1)); else { if (counter.isUndefined()) { counter = getAbsoluteValue(identifiable); changes.put(identifiable, counter); } counter.increment(); } } else { final OModifiableInteger counter = newEntries.get(identifiable); if (counter == null) newEntries.put(identifiable, new OModifiableInteger(1)); else counter.increment(); } if (size >= 0) size++; if (this.owner != null) ORecordInternal.track(this.owner, identifiable); if (updateOwner) fireCollectionChangedEvent( new OMultiValueChangeEvent<OIdentifiable, OIdentifiable>( OMultiValueChangeEvent.OChangeType.ADD, identifiable, identifiable, null, false)); }
@Override public OIdentifiable next() { currentRemoved = false; if (currentCounter < currentFinalCounter) { currentCounter++; return currentValue; } if (newEntryIterator.hasNext()) { Map.Entry<OIdentifiable, OModifiableInteger> entry = newEntryIterator.next(); currentValue = entry.getKey(); currentFinalCounter = entry.getValue().intValue(); currentCounter = 1; return currentValue; } if (nextChange != null && nextSBTreeEntry != null) { if (nextChange.getKey().compareTo(nextSBTreeEntry.getKey()) < 0) { currentValue = nextChange.getKey(); currentFinalCounter = nextChange.getValue().applyTo(0); currentCounter = 1; nextChange = nextChangedNotRemovedEntry(changedValuesIterator); } else { currentValue = nextSBTreeEntry.getKey(); currentFinalCounter = nextSBTreeEntry.getValue(); currentCounter = 1; nextSBTreeEntry = nextChangedNotRemovedSBTreeEntry(sbTreeIterator); if (nextChange != null && nextChange.getKey().equals(currentValue)) nextChange = nextChangedNotRemovedEntry(changedValuesIterator); } } else if (nextChange != null) { currentValue = nextChange.getKey(); currentFinalCounter = nextChange.getValue().applyTo(0); currentCounter = 1; nextChange = nextChangedNotRemovedEntry(changedValuesIterator); } else if (nextSBTreeEntry != null) { currentValue = nextSBTreeEntry.getKey(); currentFinalCounter = nextSBTreeEntry.getValue(); currentCounter = 1; nextSBTreeEntry = nextChangedNotRemovedSBTreeEntry(sbTreeIterator); } else throw new NoSuchElementException(); if (convertToRecord) return currentValue.getRecord(); return currentValue; }