Mercurial > hg > openmind
view src/main/java/org/mpi/openmind/repository/bo/Relation.java @ 56:467843399e70
Fixs for lost relation, when editing clone entities in parallel
author | jurzua <jjjurzua@hotmail.com> |
---|---|
date | Mon, 28 Nov 2016 14:26:10 +0100 |
parents | 2d669fdd0a8b |
children | b5a22b9ab9c6 |
line wrap: on
line source
package org.mpi.openmind.repository.bo; import java.io.Serializable; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.List; import javax.persistence.Column; import javax.persistence.DiscriminatorValue; import javax.persistence.Transient; import org.apache.commons.codec.binary.Base64; import org.apache.commons.lang.StringUtils; import org.hibernate.annotations.Cache; import org.hibernate.annotations.CacheConcurrencyStrategy; import org.mpi.openmind.cache.WrapperService; import org.mpi.openmind.repository.utils.OMUtils; import cl.maps.penta.PentaKey; import cl.maps.utils.RelKey; /** * * @author jurzua */ @javax.persistence.Entity @DiscriminatorValue("RELATION") @Cache(usage=CacheConcurrencyStrategy.READ_ONLY) public class Relation extends Node implements Serializable, Comparable<Relation> { public Relation(){ this.setSystemStatus(SYS_STATUS_CURRENT_VERSION); } public static Relation defRelation(Relation other, WrapperService ws) throws Exception{ Relation rel = new Relation(); rel.setOwnValue(other.getOwnValue()); rel.setObjectClass(other.getObjectClass()); rel.setType(other.getType()); Entity src = ws.getDefinitionById(other.getSourceId()); Entity tar = ws.getDefinitionById(other.getTargetId()); if(src == null || tar == null){ throw new Exception("src and/or target not found!"); } rel.setSource(src); rel.setTarget(tar); return rel; } public static Relation entRelation(Relation other, WrapperService ws) throws Exception{ Relation rel = new Relation(); rel.setOwnValue(other.getOwnValue()); rel.setObjectClass(other.getOwnValue()); rel.setType(Node.TYPE_ABOX); Entity src = ws.getEntityById(other.getSourceId()); Entity tar = ws.getEntityById(other.getTargetId()); if(src == null || tar == null){ throw new Exception("src and/or target not found!"); } rel.setSource(src); rel.setTarget(tar); return rel; } public Relation(Entity source, Entity target){ this.setSource(source); this.setTarget(target); source.addSourceRelation(this); target.addTargetRelation(this); this.setSystemStatus(Node.SYS_STATUS_CURRENT_VERSION); } public Relation(Entity srcNonLW, Entity tarNonLW, String ownValue){ this.setSource(srcNonLW); this.setTarget(tarNonLW); srcNonLW.addSourceRelation(this); tarNonLW.addTargetRelation(this); this.setOwnValue(ownValue); this.setSystemStatus(Node.SYS_STATUS_CURRENT_VERSION); } @Column(name="source_id") private Long sourceId; @Column(name="source_modif") private Long sourceModif; @Column(name="source_obj_class") private String sourceObjectClass; @Column(name="target_id") private Long targetId; @Column(name="target_modif") private Long targetModif; @Column(name="target_obj_class") private String targetObjectClass; @Transient private Entity source; @Transient private Entity target; @Transient private List<Attribute> attributes = new ArrayList<Attribute>(); public Attribute getAttributeByName(String name) { for (Attribute attribute : this.getAttributes()) { if (attribute.getObjectClass().equals(name)) { return attribute; } } return null; } public void addAttribute(Attribute att){ if(att != null){ att.setSourceId(this.getId()); att.setSourceModif(this.getModificationTime()); att.setSystemStatus(this.getSystemStatus()); this.attributes.add(att); } } @Override public void setSystemStatus(String status) { super.setSystemStatus(status); if(this.attributes != null){ for(Attribute att : this.attributes){ att.setSystemStatus(status); } } } public List<Attribute> getAttributes() { return attributes; } public void setAttributes(List<Attribute> attributes) { this.attributes = attributes; } public String getSourceObjectClass() { return sourceObjectClass; } public void setSourceObjectClass(String sourceObjectClass) { this.sourceObjectClass = sourceObjectClass; } public String getTargetObjectClass() { return targetObjectClass; } public void setTargetObjectClass(String targetObjectClass) { this.targetObjectClass = targetObjectClass; } public Long getSourceModif() { return sourceModif; } public void setSourceModif(Long sourceModif) { this.sourceModif = sourceModif; } public Long getTargetModif() { return targetModif; } public void setTargetModif(Long targetModif) { this.targetModif = targetModif; } public Entity getSource() { return source; } public void setSource(Entity src) { this.source = src; if(src != null){ this.setSourceId(src.getId()); this.setSourceModif(src.getModificationTime()); this.setSourceObjectClass(src.getObjectClass()); } } public Entity getTarget() { return target; } public void setTarget(Entity target) { this.target = target; if(target != null){ this.setTargetId(target.getId()); this.setTargetModif(target.getModificationTime()); this.setTargetObjectClass(target.getObjectClass()); } } public Long getSourceId() { return sourceId; } public void setSourceId(Long sourceId) { this.sourceId = sourceId; } public Long getTargetId() { return targetId; } public void setTargetId(Long targetId) { this.targetId = targetId; } /** * Returns if this Relation is equal to another Relation. * * Compares ownvalue (=type), source id and target id. * * @param other * @return */ public boolean equalsContent(Relation other) { if (other == null) { return false; } if (StringUtils.equals(getOwnValue(), other.getOwnValue()) && OMUtils.equals(getSourceId(), other.getSourceId()) && OMUtils.equals(getTargetId(), other.getTargetId())) { return true; } return false; } public String printSource(){ return "Source [sourceObjectClass=" + sourceObjectClass + ", sourceId=" + sourceId + ", sourceModif=" + sourceModif + "]"; } public String printTarget(){ return "Target [targetObjectClass=" + targetObjectClass + ", targetId=" + targetId + ", targetModif=" + targetModif + "]"; } @Override public String toString() { String source = ", Src[id=" + sourceId; if(getSource() != null) source += ", src=" + getSource().getOwnValue(); source +="] "; String target = ", Tar[id=" + targetId; if(getTarget() != null) target += ", tar=" + getTarget().getOwnValue(); target +="] "; return "Relation[" + "rowId=" + this.getRowId() + ", " + "id=" + getId() +", " + "ownValue=" + getOwnValue() + source + target + ", " + "sysStatus=" + this.getSystemStatus() + "]"; } /** * Returns a String representation with base64-encoded own-value. * * To be used for the transaction log. * * @return */ public String toEncString() { try { String es = "RELATION[" + "id=\"" + this.getId() + "\", " + "row-id=\"" + this.getRowId() + "\", " + "object-class=\"" + this.getObjectClass() + "\", " + "source-id=\"" + this.getSourceId() + "\", " + "source-mtime=\"" + this.getSourceModif() + "\", " + "source-oc=\"" + this.getSourceObjectClass() + "\", " + "target-id=\"" + this.getTargetId() + "\", " + "target-mtime=\"" + this.getTargetModif() + "\", " + "target-oc=\"" + this.getTargetObjectClass() + "\", " + "mtime=\"" + this.getModificationTime() + "\", " + "version=\"" + this.getVersion() + "\", " + "user=\"" + this.getUser() + "\", " + "public=\"" + this.getIsPublic() + "\", " + "system-status=\"" + this.getSystemStatus() + "\", " + "status=\"" + this.getStatus() + "\", " + "type=\"" + this.getType() + "\", " + "b64-value=\"" + ((this.getOwnValue() != null) ? Base64.encodeBase64String(this.getOwnValue().getBytes("UTF-8")) : "") + "\"]"; return es; } catch (UnsupportedEncodingException e) { // this shouldn't happen e.printStackTrace(); } return "!!!ENCODING-ERROR!!!"; } @Override public int compareTo(Relation e) { if(e == null) return 1; if(StringUtils.isNotEmpty(this.getOwnValue())) return this.getOwnValue().compareTo(e.getOwnValue()); else return 0; } public PentaKey<RelKey, Long, Long, String, Long> getKey(){ return new PentaKey<RelKey, Long, Long, String, Long>( new RelKey(this.getSourceId(), this.getTargetId(), this.getOwnValue()), this.getSourceId(), this.getTargetId(), this.getOwnValue(), this.getId()); } @Override public String getNodeType() { return "RELATION"; } }