view src/main/java/de/mpiwg/itgroup/ismi/util/guiComponents/MisattributionTable.java @ 128:aef031e76278

105: MISATTRIBUTION should be deleted when detached Task-Url: https://it-dev.mpiwg-berlin.mpg.de/tracs/ismi/ticket/105
author casties
date Wed, 01 Feb 2017 18:20:04 +0100
parents ca36b24a22f7
children 502ae5b1a07d
line wrap: on
line source

package de.mpiwg.itgroup.ismi.util.guiComponents;

import java.util.ArrayList;
import java.util.List;

import javax.faces.event.ActionEvent;

import org.apache.log4j.Logger;
import org.mpi.openmind.repository.bo.Entity;
import org.mpi.openmind.repository.bo.Relation;

import de.mpiwg.itgroup.ismi.auxObjects.ListenerObject;
import de.mpiwg.itgroup.ismi.entry.beans.AbstractISMIBean;
import de.mpiwg.itgroup.ismi.utils.SelectableObject;

public class MisattributionTable extends AbstractISMIBean {
	private static final long serialVersionUID = -2756216426560705499L;
	private static Logger logger = Logger.getLogger(MisattributionTable.class);

	private List<SelectableObject<Misattribution>> list = new ArrayList<SelectableObject<Misattribution>>();
	
	private Misattribution misatt;
	
	private ListenerObject lo = new ListenerObject(PERSON, "name_translit");
	//private String attName;
	//private String oc;
	
	public MisattributionTable(){
		/*
		this.attName = attName;
		this.oc = oc;
		*/
	}
	
	public void listenerRemove(ActionEvent event){		
		List<SelectableObject<Misattribution>> toDelete = new ArrayList<SelectableObject<Misattribution>>();
		
		for(SelectableObject<Misattribution> so : this.list){
			if(so.isSelected()){
				toDelete.add(so);
			}
		}
		for(SelectableObject<Misattribution> so : toDelete){
			this.list.remove(so);
		}
	}
	
	public void listenerEditRef(ActionEvent event){
		SelectableObject<Misattribution> so = 
			(SelectableObject<Misattribution>)getRequestBean("item");
		if(so != null){
			this.misatt = so.getObj();
		}
	}
	
	public void listenerSaveRef(ActionEvent event){
		this.misatt = null;
	}
	
	public void listenerCancel(ActionEvent event){
		//@TODO
	}
	
	public void listenerCreate(ActionEvent event){
		if(this.lo.entity != null & this.lo.entity.isPersistent()){
			this.create(this.lo.entity);	
		}
	}
	
	public void load(Entity misattEntity){
		if(!containsEntity(misattEntity)){
			//TODO sort
			//Collections.sort(this.misattList);
			try {
				this.list.add(new SelectableObject<Misattribution>(Misattribution.load(misattEntity, getWrapper(), getUserName())));
			} catch (Exception e) {
				addErrorMsg(e.getMessage());
				e.printStackTrace();
			}
		}else{
			addGeneralMsg("This entity has been already inserted!");
		}
	}
	
	public void create(Entity person){
		try {
			this.list.add(new SelectableObject<Misattribution>(Misattribution.create(person, getWrapper(), getUserName())));
		} catch (Exception e) {
			addErrorMsg(e.getMessage());
			e.printStackTrace();
		}
	}
	
	private boolean containsEntity(Entity ent){
		for(SelectableObject<Misattribution> so : this.list){
			if(so.getObj().getPerson() != null && so.getObj().getPerson().getId().equals(ent.getId())){
				return true;
			}
		}
		return false;
	}
	
	/**
	 * Save all misattributions.
	 * 
	 * Deletes removed misattributions.
	 * 
	 * @param text
	 * @return
	 * @throws Exception
	 */
	public Entity saveMisattributions(Entity text) throws Exception {
		// remember old misattributions
		List<Relation> oldRels = text.getSourceRelations(Misattribution.HAS_AUTHOR_MISATT, Misattribution.MISATT);
		// delete old relations
		text.removeAllSourceRelationsByName(Misattribution.HAS_AUTHOR_MISATT);
		// create new misattributions
		for (Misattribution misatt : this.getMisattList()) {
			text = misatt.saveAndGetMisattribution(text);
		}
		// check for orphaned old misattributions
		for (Relation rel : oldRels) {
			boolean match = false;
			for (Misattribution mi : this.getMisattList()) {
				Entity miEnt = mi.getMisatt();
				if (miEnt != null && rel.getTargetId() == miEnt.getId()) {
					match = true;
					break;
				}
			}
			if (!match) {
				Entity ent = getWrapper().getEntityById(rel.getTargetId());
				logger.warn("Orphaned MISATTRIBUTION will be deleted: " + ent);
				getWrapper().removeCurrentVersionEntity(ent, getUserName());
			}
		}
		return text;
	}	
	
	private List<Misattribution> getMisattList() {
		List<Misattribution> list = new ArrayList<Misattribution>();
		for(SelectableObject<Misattribution> so : this.list){
			list.add(so.getObj());
		}
		return list;
	}
	
	public List<SelectableObject<Misattribution>> getList() {
		return list;
	}

	public void setList(List<SelectableObject<Misattribution>> list) {
		this.list = list;
	}

	public Misattribution getMisatt() {
		return misatt;
	}

	public void setMisatt(Misattribution misatt) {
		this.misatt = misatt;
	}

	public ListenerObject getLo() {
		return lo;
	}

	public void setLo(ListenerObject lo) {
		this.lo = lo;
	}
}