package org.docear.plugin.pdfutilities.features; import java.net.URI; import java.util.ArrayList; import java.util.Collection; import java.util.List; import org.docear.plugin.core.features.AnnotationID; import org.docear.plugin.pdfutilities.map.AnnotationController; public class AnnotationModel implements IAnnotation{ private AnnotationID id; private AnnotationType annotationType; private Integer page; private Integer generationNumber; private URI destinationUri; private String title; private boolean isNew; private Integer objectNumber; private URI uri; private Object annotationObject; private boolean isConflicted; private List<AnnotationModel> children = new ArrayList<AnnotationModel>(); private AnnotationModel parent; private boolean isInserted; public AnnotationModel(){}; //needed for serialization public AnnotationModel(AnnotationID id){ this.setAnnotationID(id); } public AnnotationModel(AnnotationID id, AnnotationType type){ this.setAnnotationID(id); this.annotationType = type; } public AnnotationID getAnnotationID() { if(id == null && uri != null && objectNumber != null){ id = new AnnotationID(uri, objectNumber); } return id; } public void setAnnotationID(AnnotationID id) { this.id = id; this.objectNumber = id.getObjectNumber(); this.uri = id.getUri(); } public AnnotationType getAnnotationType() { return annotationType; } public void setAnnotationType(AnnotationType annotationType) { this.annotationType = annotationType; } public Integer getPage() { return page; } public void setPage(Integer page) { this.page = page; } public Integer getObjectNumber() { return this.objectNumber; } public void setObjectNumber(Integer objectNumber) { this.objectNumber = objectNumber; if(this.uri != null){ this.id = new AnnotationID(this.getUri(), objectNumber); } } public Integer getGenerationNumber() { return generationNumber; } public void setGenerationNumber(Integer generationNumber) { this.generationNumber = generationNumber; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public URI getDestinationUri() { return destinationUri; } public void setDestinationUri(URI uri) { this.destinationUri = uri; } public List<AnnotationModel> getChildren() { return children; } public void setNew(boolean isNew){ this.isNew = isNew; } public boolean isNew(){ return this.isNew; } public boolean isConflicted() { return isConflicted; } public void setConflicted(boolean isConflicted) { this.isConflicted = isConflicted; } public String toString(){ return this.getTitle(); } public URI getUri(){ return this.uri; } public void setUri(URI absoluteUri){ this.uri = absoluteUri; if(this.objectNumber != null){ this.id = new AnnotationID(absoluteUri, this.getObjectNumber()); } } public boolean hasNewChildren(){ for(IAnnotation child : this.children){ if(child.isNew() || child.hasNewChildren()){ return true; } } return false; } public boolean hasConflictedChildren(){ for(AnnotationModel child : this.children){ if(child.isConflicted() || child.hasConflictedChildren()){ return true; } } return false; } public static boolean hasConflicts(Collection<AnnotationModel> annotations){ for(AnnotationModel model : annotations){ if(model.isConflicted || model.hasConflictedChildren()){ return true; } } return false; } public Object getAnnotationObject() { return annotationObject; } public void setAnnotationObject(Object annotationObject) { this.annotationObject = annotationObject; } public String getDocumentHash() { return AnnotationController.getDocumentHash(getUri()); } public AnnotationModel getParent() { return parent; } public void setParent(AnnotationModel parent) { this.parent = parent; } public boolean isInserted() { return isInserted; } public void setInserted(boolean isInserted) { this.isInserted = isInserted; } public int getChildIndex(AnnotationModel child){ return this.children.indexOf(child); } }