package org.aplikator.server.data;
import java.io.Serializable;
import org.aplikator.client.shared.data.ContainerNodeDTO;
import org.aplikator.client.shared.data.Operation;
import org.aplikator.server.DescriptorRegistry;
import org.aplikator.server.descriptor.View;
@SuppressWarnings("serial")
public class ContainerNode implements Serializable {
private View view;
private Record original;
private Record edited;
private Operation operation;
ContainerNode(View view, Record original, Record edited, Operation operation) {
this.view = view;
this.original = original;
this.edited = edited;
this.operation = operation;
}
/**
* Conversion from ContainerNodeDTO
*
* @param containerNodeDTO
*/
public ContainerNode(ContainerNodeDTO containerNodeDTO) {
this((View) DescriptorRegistry.get().getDescriptionItem(containerNodeDTO.getViewId()),
containerNodeDTO.getOriginal() != null ? new Record(containerNodeDTO.getOriginal()) : null,
containerNodeDTO.getEdited() != null ? new Record(containerNodeDTO.getEdited()) : null,
containerNodeDTO.getOperation());
}
/**
* Conversion to ContainerNodeDTO
*
* @return
*/
public ContainerNodeDTO getContainerNodeDTO() {
return new ContainerNodeDTO(this.getView().getId(),
this.getOriginal() != null ? this.getOriginal().getRecordDTO() : null,
this.getEdited() != null ? this.getEdited().getRecordDTO() : null,
this.getOperation());
}
public View getView() {
return view;
}
public Record getOriginal() {
return original;
}
public void setOriginal(Record original) {
this.original = original;
}
public Record getEdited() {
return edited;
}
public void setEdited(Record edited) {
this.edited = edited;
}
public Operation getOperation() {
return operation;
}
public void setOperation(Operation operation) {
this.operation = operation;
}
/**
* Returns a record, which contains summary of properties from edited and original.
* If property exists in both, the merged record contains the edited one
*
* @return
*/
public Record getMerged() {
// if edited and original is null then return null
if ((this.getOriginal() == null) && (this.getEdited() == null)) {
return null;
}
// if edited is null then returns cloned original
if (this.getEdited() == null) {
return this.getOriginal().clone();
}
// if original is null then returns cloned edited
if (this.getOriginal() == null) {
return this.getEdited().clone();
}
// initially creates a merged record as a clone of edited
Record mergedRec = this.getEdited().clone();
for (String property : this.getOriginal().getRecordDTO().getProperties()) {
// adds properties from original if property is not yet present
if (!mergedRec.getRecordDTO().getProperties().contains(property)) {
mergedRec.getRecordDTO().setValue(property, this.getOriginal().getRecordDTO().getValue(property));
}
}
// adds annotations from original
for (String annotKey : this.getOriginal().getRecordDTO().getAnnotations()) {
if (!mergedRec.hasAnnotation(annotKey)) {
mergedRec.putAnnotation(annotKey, this.getOriginal().getAnnotation(annotKey));
}
}
return mergedRec;
}
}