view src/main/java/de/mpiwg/itgroup/ismi/defs/DefinitionForm.java @ 215:26138384984c

update more instances of IIIF server URL.
author casties
date Sat, 15 Jan 2022 16:09:55 +0100
parents 2e911857a759
children
line wrap: on
line source

package de.mpiwg.itgroup.ismi.defs;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.mpi.openmind.repository.bo.Attribute;
import org.mpi.openmind.repository.bo.Entity;
import org.mpi.openmind.repository.bo.Node;
import org.mpi.openmind.repository.bo.Relation;

import de.mpiwg.itgroup.ismi.browse.EntityRepositoryBean;
import de.mpiwg.itgroup.ismi.utils.SelectableObject;

public class DefinitionForm extends AbstractDefinitionForm implements
		Serializable {
	private static final long serialVersionUID = 1L;

	private static Logger logger = Logger.getLogger(DefinitionForm.class);

	public void createDefinition(ActionEvent event) {
		this.tmpLWDefinition = new Entity(Node.TYPE_TBOX, Node.TYPE_TBOX, false);
	}

	public void cancelCreationDefinition(ActionEvent event) {
		this.tmpLWDefinition = null;
		this.selectedLWDefinition = null;
	}

	public void saveLWDefinition(ActionEvent event) {
		try {
			if (tmpLWDefinition != null
					&& StringUtils.isNotBlank(tmpLWDefinition.getOwnValue())) {

				String ov = tmpLWDefinition.getOwnValue();
				tmpLWDefinition.setOwnValue(convertDefOW(ov));

				this.selectedLWDefinition = this.getWrapper().saveLWDefinition(
						tmpLWDefinition, getSessionBean().getUsername());
				this.tmpLWDefinition = null;
				this.loadDefinition();
			}
		} catch (Exception e) {
			e.printStackTrace();
			logger.error(e.getMessage(), e);
			this.printInternalError(e);
		}

	}

	public DefinitionForm() {
		this.loadDefinitions();
	}

	public void listenerCancelEdition(ActionEvent event) {
		this.loadDefinitions();
	}

	public void loadDefinitions() {
		this.defList = getWrapper().getLWDefinitions();
		this.defSelectList = new ArrayList<SelectItem>();

		this.selectedLWDefinition = null;
		for (Entity def : this.defList) {
			this.defSelectList.add(new SelectItem(def.getId(), def
					.getOwnValue()));
		}
		EntityRepositoryBean bean = (EntityRepositoryBean) getSessionBean("EntityRepository");
		if (bean != null) {
			bean.updateDefinitions(this.defList);
		}
	}

	public void loadDefinition() {
		this.attList = new ArrayList<SelectableObject<Attribute>>();
		for (Attribute att : getWrapper().getDefAttributes(
				this.selectedLWDefinition.getOwnValue())) {
			this.attList.add(new SelectableObject<Attribute>(att));
		}
		this.srcRelList = new ArrayList<SelectableObject<Relation>>();
		for (Relation rel : getWrapper().getDefSourceRelations(
				this.selectedLWDefinition.getOwnValue())) {
			rel.setSource(selectedLWDefinition);
			rel.setTarget(getWrapper().getDefinitionById(rel.getTargetId()));
			srcRelList.add(new SelectableObject<Relation>(rel));
		}
		this.tarRelList = new ArrayList<SelectableObject<Relation>>();
		for (Relation rel : getWrapper().getDefTargetRelations(
				this.selectedLWDefinition.getOwnValue())) {
			rel.setSource(getWrapper().getDefinitionById(rel.getSourceId()));
			rel.setTarget(selectedLWDefinition);
			tarRelList.add(new SelectableObject<Relation>(rel));
		}
	}

	public void listenerShowDefinition(ActionEvent event) {
		this.selectedLWDefinition = (Entity) getRequestBean("def");
		if (this.selectedLWDefinition != null) {
			this.loadDefinition();
		} else {
			addGeneralMsg("The definition could not be loaded.");
		}
	}

	// ********************* Possible Values for attributes***********
	public void listenerAddPossibleValue(ActionEvent event) {
		this.possibleValuesList.add(new SelectableObject<String>(new String()));
	}

	public void listenerDeletePossibleValues(ActionEvent event) {
		List<SelectableObject<String>> toDelete = new ArrayList<SelectableObject<String>>();
		for (SelectableObject<String> so : this.possibleValuesList) {
			if (so.isSelected()) {
				toDelete.add(so);
			}
		}
		for (SelectableObject<String> so : toDelete) {
			this.possibleValuesList.remove(so);
		}
	}

	// ***************************************************************

	// **************************** Relations ************************
	public void listenerDeleteSourceRelations(ActionEvent event) {
		try {
			List<SelectableObject<Relation>> toDelete = new ArrayList<SelectableObject<Relation>>();
			for (SelectableObject<Relation> so : this.srcRelList) {
				if (so.isSelected()) {
					toDelete.add(so);
				}
			}
			for (SelectableObject<Relation> so : toDelete) {
				this.getWrapper().removeDefRelation((Relation) so.getObj());
			}
			this.loadDefinition();
		} catch (Exception e) {
			e.printStackTrace();
			logger.error(e.getMessage(), e);
			this.printInternalError(e);
		}
	}

	public void listenerDeleteTargetRelations(ActionEvent event) {
		try {
			List<SelectableObject<Relation>> toDelete = new ArrayList<SelectableObject<Relation>>();
			for (SelectableObject<Relation> so : this.tarRelList) {
				if (so.isSelected()) {
					toDelete.add(so);
				}
			}
			for (SelectableObject<Relation> so : toDelete) {
				this.getWrapper().removeDefRelation((Relation) so.getObj());
			}
			this.loadDefinition();
		} catch (Exception e) {
			e.printStackTrace();
			logger.error(e.getMessage(), e);
			this.printInternalError(e);
		}
	}

	public void listenerEditSourceRelation(ActionEvent event) {
		SelectableObject<Relation> so = (SelectableObject<Relation>) getRequestBean("relObj");
		if (so != null && so.getObj() != null
				&& so.getObj() instanceof Relation) {
			Relation rel = so.getObj();
			this.selectedRelation = (Relation) rel.clone();

			this.selectedRelationAttributes = new ArrayList<SelectableObject<Attribute>>();
			for (Attribute att : getWrapper().getDefRelationAttributes(
					rel.getId())) {
				this.selectedRelationAttributes
						.add(new SelectableObject<Attribute>(att));
			}
		}
		this.isSourceRelation = true;
	}

	public void listenerEditTargetRelation(ActionEvent event) {
		SelectableObject<Relation> so = (SelectableObject<Relation>) getRequestBean("relObj");
		if (so != null && so.getObj() != null
				&& so.getObj() instanceof Relation) {
			Relation rel = so.getObj();
			this.selectedRelation = (Relation) rel.clone();
		}
		this.isSourceRelation = false;
	}

	public void listenerCancelEditionOfRelation(ActionEvent event) {
		this.selectedRelation = null;
	}

	public void listenerSaveRelation(ActionEvent event) {
		try {
			if (!this.isRelationUnique(selectedRelation)) {
				addGeneralMsg("The relation could not be saved. There is already a relation with same source, target and label.");
				return;
			}
			if (!this.isOKRelationAttributes()) {
				addGeneralMsg("The relation could not be saved. There are some attributes for this relation with same name or with empty name.");
				return;
			}

			this.selectedRelation.setSourceModif(this.selectedLWDefinition
					.getModificationTime());
			this.selectedRelation
					.setSourceObjectClass(this.selectedLWDefinition
							.getObjectClass());
			this.getWrapper().saveDefRelation(selectedRelation, getSessionBean().getUsername());
			for (SelectableObject<Attribute> so : this.selectedRelationAttributes) {
				Attribute att = so.getObj();
				att.setSourceId(this.selectedRelation.getId());
				att.setSourceModif(this.selectedRelation.getModificationTime());
				att.setSourceObjectClass(this.selectedRelation.getObjectClass());
				this.getWrapper().saveDefAttribute(att, getSessionBean().getUsername());
			}
			this.selectedRelation = null;
			this.loadDefinition();
		} catch (Exception e) {
			e.printStackTrace();
			logger.error(e.getMessage(), e);
			this.printInternalError(e);
		}
	}

	public void listenerCreateSourceRelation(ActionEvent event) {
		this.selectedRelation = new Relation();
		this.selectedRelation.setSource(selectedLWDefinition);
		this.isSourceRelation = true;
		this.selectedRelationAttributes = new ArrayList<SelectableObject<Attribute>>();
	}

	public void listenerCreateTargetRelation(ActionEvent event) {
		this.selectedRelation = new Relation();
		this.selectedRelation.setTarget(selectedLWDefinition);
		this.isSourceRelation = false;
		this.selectedRelationAttributes = new ArrayList<SelectableObject<Attribute>>();
	}

	// ******************** Attributes for relation *****************

	public void listenerCreateAttributeForRelation(ActionEvent event) {
		Attribute att = new Attribute(Node.TYPE_TBOX, "text", "");
		att.setSourceId(this.selectedRelation.getId());
		att.setSourceObjectClass(Node.TYPE_TBOX);
		att.setSourceModif(this.selectedRelation.getModificationTime());
		att.setSystemStatus(Node.SYS_STATUS_CURRENT_VERSION);
		if (selectedRelationAttributes == null) {
			this.selectedRelationAttributes = new ArrayList<SelectableObject<Attribute>>();
		}
		this.selectedRelationAttributes
				.add(new SelectableObject<Attribute>(att));
	}

	public void listenerDeleteAttributesForRelation(ActionEvent event) {
		try {
			List<SelectableObject<Attribute>> toDelete = new ArrayList<SelectableObject<Attribute>>();
			for (SelectableObject<Attribute> so : this.selectedRelationAttributes) {
				if (so.isSelected()) {
					toDelete.add(so);
				}
			}
			for (SelectableObject<Attribute> so : toDelete) {
				this.selectedRelationAttributes.remove(so);
				Attribute att = (Attribute) so.getObj();
				if (att.getId() != null) {
					this.getWrapper().removeDefAttribute(att);
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
			logger.error(e.getMessage(), e);
			this.printInternalError(e);
		}

	}

	// ***************************************************************
	// **************************** Attributes ***********************

	public void listenerCreateAttribute(ActionEvent event) {
		this.selectedAttribute = new Attribute(Node.TYPE_TBOX, "text", "");
		this.selectedAttribute.setSourceId(this.selectedLWDefinition.getId());
		this.selectedAttribute.setSourceObjectClass(Node.TYPE_TBOX);
		this.selectedAttribute.setSourceModif(this.selectedLWDefinition
				.getModificationTime());
		this.selectedAttribute.setSystemStatus(Node.SYS_STATUS_CURRENT_VERSION);

		this.possibleValuesList = new ArrayList<SelectableObject<String>>();
		if (possibleValuesList.size() == 0) {
			this.possibleValuesList.add(new SelectableObject<String>(
					new String()));
		}
	}

	public void listenerEditAttribute(ActionEvent event) {
		SelectableObject<Attribute> so = (SelectableObject<Attribute>) getRequestBean("attObj");
		if (so != null && so.getObj() != null
				&& so.getObj() instanceof Attribute) {
			Attribute att = (Attribute) so.getObj();
			this.selectedAttribute = (Attribute) att.clone();

			this.possibleValuesList = new ArrayList<SelectableObject<String>>();
			for (String possibleValue : selectedAttribute
					.getPossibleValuesList()) {
				this.possibleValuesList.add(new SelectableObject<String>(
						possibleValue));
			}
			if (possibleValuesList.size() == 0) {
				this.possibleValuesList.add(new SelectableObject<String>(
						new String()));
			}
		}
	}

	public void listenerSaveAttribute(ActionEvent event) {
		try {
			this.selectedAttribute
					.setOwnValue(convertAttOrRelOW(selectedAttribute
							.getOwnValue()));

			if (StringUtils.isBlank(selectedAttribute.getOwnValue())) {
				addGeneralMsg("The attribute could not be saved."
						+ " The attribute must have a name.");
				return;
			}

			if (!isAttributeNameUnique(selectedAttribute)) {
				addGeneralMsg("The attribute could not be saved."
						+ " There is already a attribute with the same name.");
				return;
			}
			this.savePossibleValues();
			getWrapper().saveDefAttribute(selectedAttribute, getSessionBean().getUsername());
			this.selectedAttribute = null;
			this.loadDefinition();
		} catch (Exception e) {
			e.printStackTrace();
			logger.error(e.getMessage(), e);
			this.printInternalError(e);
		}
	}

	private void savePossibleValues() {
		List<String> list = new ArrayList<String>();
		for (SelectableObject<String> so : this.possibleValuesList) {
			String value = so.getObj();
			if (StringUtils.isNotBlank(value)) {
				if (list.contains(value)) {
					addGeneralMsg("There are two or more values equals.");
					return;
				} else {
					list.add(value);
				}
			}
		}

		Collections.sort(list);
		this.selectedAttribute.setPossibleValuesList(list);
	}

	private boolean isRelationUnique(Relation editingRel) {
		for (SelectableObject<Relation> so : this.srcRelList) {
			Relation rel = so.getObj();
			if (!rel.getId().equals(editingRel.getId())
					&& rel.getSourceId().equals(editingRel.getSourceId())
					&& rel.getTargetId().equals(editingRel.getTargetId())
					&& rel.getOwnValue().equals(editingRel.getOwnValue())) {
				return false;
			}
		}
		for (SelectableObject<Relation> so : this.tarRelList) {
			Relation rel = so.getObj();
			if (!rel.getId().equals(editingRel.getId())
					&& rel.getSourceId().equals(editingRel.getSourceId())
					&& rel.getTargetId().equals(editingRel.getTargetId())
					&& rel.getOwnValue().equals(editingRel.getOwnValue())) {
				return false;
			}
		}
		return true;
	}

	private boolean isOKRelationAttributes() {
		List<String> testList = new ArrayList<String>();
		if (selectedRelationAttributes != null) {
			for (SelectableObject<Attribute> so : this.selectedRelationAttributes) {
				Attribute att = so.getObj();
				if (StringUtils.isBlank(att.getOwnValue())) {
					return false;
				}
				att.setOwnValue(convertAttOrRelOW(att.getOwnValue()));
				if (testList.contains(att.getOwnValue())) {
					return false;
				} else {
					testList.add(att.getOwnValue());
				}
			}
		}
		return true;
	}

	private boolean isAttributeNameUnique(Attribute editingAtt) {
		for (SelectableObject<Attribute> so : this.attList) {
			Attribute att = so.getObj();
			if (!att.getId().equals(editingAtt.getId())
					&& att.getOwnValue().equals(editingAtt.getOwnValue())) {
				return false;
			}
		}
		return true;
	}

	public void listenerCancelEditionOfAttribute(ActionEvent event) {
		this.selectedAttribute = null;
		this.possibleValuesList = null;
	}

	public void listenerDeleteAttributes(ActionEvent event) {
		try {
			List<SelectableObject<Attribute>> toDelete = new ArrayList<SelectableObject<Attribute>>();
			for (SelectableObject<Attribute> so : this.attList) {
				if (so.isSelected()) {
					toDelete.add(so);
				}
			}
			for (SelectableObject<Attribute> so : toDelete) {
				this.getWrapper().removeDefAttribute(so.getObj());
			}
			this.loadDefinition();
		} catch (Exception e) {
			e.printStackTrace();
			logger.error(e.getMessage(), e);
			this.printInternalError(e);
		}
	}
	// ***************************************************************
	// ***************************************************************
}