# HG changeset patch # User Robert Casties # Date 1528894633 -7200 # Node ID 0d31c8be7c31896c672fbff5c4135041b7810e1b # Parent c9dec00f0f17a976ec78531db3019f2ef383bc45 new MissingRelations feature and UI. including searchByRelations() with Filter in FullEntityRepositoryBean. diff -r c9dec00f0f17 -r 0d31c8be7c31 src/main/java/de/mpiwg/itgroup/ismi/browse/FullEntityRepositoryBean.java --- a/src/main/java/de/mpiwg/itgroup/ismi/browse/FullEntityRepositoryBean.java Fri Jun 08 18:59:49 2018 +0200 +++ b/src/main/java/de/mpiwg/itgroup/ismi/browse/FullEntityRepositoryBean.java Wed Jun 13 14:57:13 2018 +0200 @@ -9,6 +9,8 @@ import org.mpi.openmind.cache.WrapperService; import org.mpi.openmind.repository.bo.Attribute; import org.mpi.openmind.repository.bo.Entity; +import org.mpi.openmind.repository.bo.Relation; +import org.mpi.openmind.repository.services.utils.RelationFilter; /** * EntityRepositoryBean for full Entities with Attributes and Relations loaded. @@ -24,8 +26,9 @@ protected boolean sortAttributeNumerically = false; - /* - * (non-Javadoc) + /** + * updateAdvancedEntities() method that makes sure that the current Entities + * are not lightweight. * * @see de.mpiwg.itgroup.ismi.browse.AbstractEntityRepositoryBean# * updateAdvancedEntities() @@ -71,7 +74,15 @@ return GOTO_ENTITY_REPOSITORY; } + /** + * Loads all entities of this.objectClass and sorts by this.sortAttributeName. + * + * Sort attributes as integer if this.sortAttributeNumerically. + * + * @throws Exception + */ public void sortByAttributes() throws Exception { + logger.debug("Start sortByAttributes..."); this.resultMode = MODE_ADVANCED; this.setPage(""); this.entities = new ArrayList(); @@ -83,7 +94,7 @@ * run search and sort result (by attribute) */ List resultList = getWrapper().getEntitiesByDef(this.objectClass); - // sort List (by ownvalue) + // sort List (by attribute) Collections.sort(resultList, getEntityAttributeComparator(this.sortAttributeName, this.sortAttributeNumerically)); this.entities = resultList; @@ -97,8 +108,18 @@ } else { this.resultSummaryMsg = "No items were found!"; } + logger.debug("Done sortByAttributes."); } + /** + * Returns Comparator for Entities that uses the Attribute attname. + * + * Sorts as integer if numerically. + * + * @param attName + * @param numerically + * @return + */ public Comparator getEntityAttributeComparator(final String attName, final boolean numerically) { return new Comparator() { @Override @@ -143,6 +164,84 @@ } }; } + + /** + * Loads all entities of this.objectClass matching the given RelationFilters. + * + * Filters Relations by relObjectClass and either srcObjectClass or tarObjectClass. + * + * Requires all RelationFilters to match. + * + * @throws Exception + */ + public void searchByRelations(List relationFilters) { + logger.debug("Start searchByRelations..."); + this.resultMode = MODE_ADVANCED; + this.setPage(""); + this.entities = new ArrayList(); + this.currentEntities = new ArrayList(); + this.resultSummaryMsg = ""; + + /* + * get all entities and filter result (by relation) + */ + List resultList = getWrapper().getEntitiesByDef(this.objectClass); + for (Entity entity : resultList) { + if (entity.isLightweight()) { + entity = getWrapper().getEntityContent(entity); + } + boolean condFailed = false; + for (RelationFilter filter :relationFilters) { + if (filter.tarObjectClass != null) { + List rels = entity.getSourceRelations(filter.relObjectClass, filter.tarObjectClass); + if (filter.relationMissing) { + // is the relation missing? + if (!rels.isEmpty()) { + condFailed = true; + break; + } + } else { + if (rels.isEmpty()) { + condFailed = true; + break; + } + } + } else if (filter.srcObjectClass != null) { + List rels = entity.getTargetRelations(filter.relObjectClass, filter.srcObjectClass); + if (filter.relationMissing) { + // is the relation missing? + if (!rels.isEmpty()) { + condFailed = true; + break; + } + } else { + if (rels.isEmpty()) { + condFailed = true; + break; + } + } + } + } + if (!condFailed) { + // all conditions matched + entities.add(entity); + } + } + + // sort List (by ownValue) + Collections.sort(entities); + + if (entities.size() > 0) { + int entitiesCount = entities.size(); + this.resultSummaryMsg = entitiesCount + " items were found!"; + this.advancedPaginator.setCurrentPage(0); + this.advancedPaginator.resetNumberOfPages(entitiesCount); + this.updateAdvancedEntities(); + } else { + this.resultSummaryMsg = "No items were found!"; + } + logger.debug("Done searchByRelations."); + } /** * @return the sortAttributeName diff -r c9dec00f0f17 -r 0d31c8be7c31 src/main/java/de/mpiwg/itgroup/ismi/entry/beans/SessionBean.java --- a/src/main/java/de/mpiwg/itgroup/ismi/entry/beans/SessionBean.java Fri Jun 08 18:59:49 2018 +0200 +++ b/src/main/java/de/mpiwg/itgroup/ismi/entry/beans/SessionBean.java Wed Jun 13 14:57:13 2018 +0200 @@ -27,6 +27,7 @@ import de.mpiwg.itgroup.ismi.event.beans.TransferEvent; import de.mpiwg.itgroup.ismi.merge.GeneralMerge; import de.mpiwg.itgroup.ismi.merge.ImportMerge; +import de.mpiwg.itgroup.ismi.merge.MissingRelationsBean; import de.mpiwg.itgroup.ismi.merge.PublicByAuthorBean; import de.mpiwg.itgroup.ismi.merge.ReferenceMerge; import de.mpiwg.itgroup.ismi.publicView.DynamicPageEditor; @@ -49,6 +50,7 @@ private TransferEvent transferEventForm = new TransferEvent(); private transient AdvancedSearchBean advancedSearch = new AdvancedSearchBean(); private transient PublicByAuthorBean publicByAuthor = new PublicByAuthorBean(); + private transient MissingRelationsBean missingRelations = new MissingRelationsBean(); private EntityDetailsBean entDetailsForm = new EntityDetailsBean(); @@ -140,7 +142,7 @@ private String selectedEventTab = WITNESS_STUDY_EVENT_TAB; private String selectedAdvancedSearchTab = "01"; private String selectedPublicByAuthorTab = "aut"; - + private String selectedMissingRelationsTab = "aut"; private Long editFormCurrentEntId; @@ -663,6 +665,11 @@ this.redirect(null, url); } + public void listenerMissingRelationsTabChange(ItemChangeEvent event) { + String url = "?formIndex=" + this.selectedMissingRelationsTab; + this.redirect(null, url); + } + protected void redirect(String redirectPath, String parameters){ FacesContext fc = FacesContext.getCurrentInstance(); ExternalContext ec = fc.getExternalContext(); @@ -1135,6 +1142,22 @@ public void setSelectedPublicByAuthorTab(String selectedPublicByAuthorTab) { this.selectedPublicByAuthorTab = selectedPublicByAuthorTab; } + + public MissingRelationsBean getMissingRelations() { + return missingRelations; + } + + public void setMissingRelations(MissingRelationsBean missingRelations) { + this.missingRelations = missingRelations; + } + + public String getSelectedMissingRelationsTab() { + return selectedMissingRelationsTab; + } + + public void setSelectedMissingRelationsTab(String selectedMissingRelationsTab) { + this.selectedMissingRelationsTab = selectedMissingRelationsTab; + } diff -r c9dec00f0f17 -r 0d31c8be7c31 src/main/java/de/mpiwg/itgroup/ismi/merge/MissingRelationsBean.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/de/mpiwg/itgroup/ismi/merge/MissingRelationsBean.java Wed Jun 13 14:57:13 2018 +0200 @@ -0,0 +1,110 @@ +package de.mpiwg.itgroup.ismi.merge; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +import org.apache.log4j.Logger; +import org.mpi.openmind.repository.services.utils.RelationFilter; + +import de.mpiwg.itgroup.ismi.browse.EntityRepositoryBean; +import de.mpiwg.itgroup.ismi.browse.FullEntityRepositoryBean; +import de.mpiwg.itgroup.ismi.entry.beans.AbstractISMIBean; + +public class MissingRelationsBean extends AbstractISMIBean implements Serializable{ + + private static Logger logger = Logger.getLogger(MissingRelationsBean.class); + + private static final long serialVersionUID = 1L; + + private FullEntityRepositoryBean browseBean; + + + public MissingRelationsBean(){ + //logger.info("AdvancedSearchBean"); + this.reset(); + } + + public synchronized void reset(){ + logger.info("MissingRelationsBean.reset()"); + browseBean = new FullEntityRepositoryBean(); + browseBean.setObjectClass(TEXT); + + logger.info("MissingRelationsBean.reset() Done."); + } + + + public void actionReset() { + reset(); + } + + + public void actionFindMissingAuthors() { + logger.debug("Start findMissingAuthors..."); + List relFilters = new ArrayList(); + /* + * find TEXT without was_created_by PERSON relation + */ + browseBean.setObjectClass(TEXT); + RelationFilter relFilter = new RelationFilter(); + relFilter.relObjectClass = "was_created_by"; + relFilter.tarObjectClass = "PERSON"; + relFilter.relationMissing = true; + relFilters.add(relFilter); + try { + browseBean.searchByRelations(relFilters); + } catch (Exception e) { + logger.error(e); + } + logger.debug("Done findMissingAuthors."); + } + + public void actionFindMissingTexts() { + logger.debug("Start findMissingTexts..."); + List relFilters = new ArrayList(); + /* + * find WITNESS without is_exemplar_of TEXT relation + */ + browseBean.setObjectClass(WITNESS); + RelationFilter relFilter = new RelationFilter(); + relFilter.relObjectClass = "is_exemplar_of"; + relFilter.tarObjectClass = "TEXT"; + relFilter.relationMissing = true; + relFilters.add(relFilter); + try { + browseBean.searchByRelations(relFilters); + } catch (Exception e) { + logger.error(e); + } + logger.debug("Done findMissingTexts."); + } + + public void actionFindMissingCodices() { + logger.debug("Start findMissingCodices..."); + List relFilters = new ArrayList(); + /* + * find WITNESS without is_part_of CODEX relation + */ + browseBean.setObjectClass(WITNESS); + RelationFilter relFilter = new RelationFilter(); + relFilter.relObjectClass = "is_part_of"; + relFilter.tarObjectClass = "CODEX"; + relFilter.relationMissing = true; + relFilters.add(relFilter); + try { + browseBean.searchByRelations(relFilters); + } catch (Exception e) { + logger.error(e); + } + logger.debug("Done findMissingCodices."); + } + + /** + * @return the browseBean + */ + public EntityRepositoryBean getBrowseBean() { + return browseBean; + } + + +} diff -r c9dec00f0f17 -r 0d31c8be7c31 src/main/java/de/mpiwg/itgroup/ismi/merge/PublicByAuthorBean.java --- a/src/main/java/de/mpiwg/itgroup/ismi/merge/PublicByAuthorBean.java Fri Jun 08 18:59:49 2018 +0200 +++ b/src/main/java/de/mpiwg/itgroup/ismi/merge/PublicByAuthorBean.java Wed Jun 13 14:57:13 2018 +0200 @@ -46,7 +46,11 @@ public PublicByAuthorBean(){ //logger.info("AdvancedSearchBean"); - this.reset(); + browseBean = new FullEntityRepositoryBean(); + browseBean.setObjectClass(PERSON); + + selectedPersonTexts = new ArrayList(); + selectedPersonSubjectMap = new HashMap>(); } public synchronized void reset(){ @@ -69,6 +73,7 @@ * Also creates the subjectList List of subject names. */ protected void makeSubjectTree() { + logger.debug("Start makeSubjectTree..."); subjectList = new ArrayList(); subjectEntity = new HashMap(); subjectParents = new HashMap>(); @@ -107,6 +112,7 @@ } while (++cnt < 5); subjectParents.put(subjectName, parents); } + logger.debug("Done makeSubjectTree."); } /** @@ -114,6 +120,7 @@ * */ private void updateSubjectTexts() { + logger.debug("Start updateSubjectTexts..."); subjectTexts = new HashMap>(); subjectPublicTexts = new HashMap>(); subjectPrivateTexts = new HashMap>(); @@ -140,6 +147,7 @@ subjectPublicTexts.put(subjectName, pubTextList); subjectPrivateTexts.put(subjectName, privTextList); } + logger.debug("Done updateSubjectTexts..."); } public void actionReset() { @@ -418,6 +426,10 @@ * @return the subjectParents */ public Map> getSubjectParents() { + if (subjectParents == null) { + makeSubjectTree(); + updateSubjectTexts(); + } return subjectParents; } @@ -425,6 +437,10 @@ * @return the subjectList */ public List getSubjectList() { + if (subjectList == null) { + makeSubjectTree(); + updateSubjectTexts(); + } return subjectList; } @@ -446,6 +462,10 @@ * @return the subjectTexts */ public Map> getSubjectTexts() { + if (subjectTexts == null) { + makeSubjectTree(); + updateSubjectTexts(); + } return subjectTexts; } @@ -453,6 +473,10 @@ * @return the subjectPublicTexts */ public Map> getSubjectPublicTexts() { + if (subjectPublicTexts == null) { + makeSubjectTree(); + updateSubjectTexts(); + } return subjectPublicTexts; } @@ -460,6 +484,10 @@ * @return the subjectPrivateTexts */ public Map> getSubjectPrivateTexts() { + if (subjectPrivateTexts == null) { + makeSubjectTree(); + updateSubjectTexts(); + } return subjectPrivateTexts; } @@ -467,6 +495,10 @@ * @return the subjectEntity */ public Map getSubjectEntity() { + if (subjectEntity == null) { + makeSubjectTree(); + updateSubjectTexts(); + } return subjectEntity; } diff -r c9dec00f0f17 -r 0d31c8be7c31 src/main/webapp/browse/entityDetails.xhtml --- a/src/main/webapp/browse/entityDetails.xhtml Fri Jun 08 18:59:49 2018 +0200 +++ b/src/main/webapp/browse/entityDetails.xhtml Wed Jun 13 14:57:13 2018 +0200 @@ -82,13 +82,13 @@ onclick="if(!confirm('Do you really want to make this entity private?')){ return; };" action="#{Session.entDetailsForm.actionChangeEntityPrivacity}"/> - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Text + + + + + + + State + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r c9dec00f0f17 -r 0d31c8be7c31 src/main/webapp/clean/components/missingCodex.xhtml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/webapp/clean/components/missingCodex.xhtml Wed Jun 13 14:57:13 2018 +0200 @@ -0,0 +1,148 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Witness + + + + + + + State + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r c9dec00f0f17 -r 0d31c8be7c31 src/main/webapp/clean/components/missingText.xhtml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/webapp/clean/components/missingText.xhtml Wed Jun 13 14:57:13 2018 +0200 @@ -0,0 +1,148 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Witness + + + + + + + State + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r c9dec00f0f17 -r 0d31c8be7c31 src/main/webapp/clean/missingRelations.xhtml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/webapp/clean/missingRelations.xhtml Wed Jun 13 14:57:13 2018 +0200 @@ -0,0 +1,51 @@ + + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + \ No newline at end of file diff -r c9dec00f0f17 -r 0d31c8be7c31 src/main/webapp/templates/main_template.xhtml --- a/src/main/webapp/templates/main_template.xhtml Fri Jun 08 18:59:49 2018 +0200 +++ b/src/main/webapp/templates/main_template.xhtml Wed Jun 13 14:57:13 2018 +0200 @@ -177,6 +177,10 @@ + + +