package com.constellio.model.services.search; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import org.apache.commons.lang3.builder.EqualsBuilder; import com.constellio.model.entities.records.Record; import com.constellio.model.services.records.RecordServicesRuntimeException; import com.constellio.model.services.records.SchemasRecordsServices; import com.constellio.model.services.search.Elevations.QueryElevation.DocElevation; @XmlRootElement public class Elevations { public void addOrUpdate(QueryElevation queryElevation) { boolean updated = false; for (QueryElevation currentQueryElevation : this.queryElevations) { if (currentQueryElevation.getQuery().equals(queryElevation.getQuery())) { currentQueryElevation.addUpdate(queryElevation.getDocElevations()); updated = true; break; } } if (!updated) { this.queryElevations.add(queryElevation); } } public void removeCollectionElevations(SchemasRecordsServices schemas) { for (Iterator<QueryElevation> iterator = this.queryElevations.iterator(); iterator.hasNext(); ) { QueryElevation queryElevation = iterator.next(); queryElevation.removeCollectionElevations(schemas); if (queryElevation.getDocElevations().isEmpty()) { iterator.remove(); } } } public void removeCollectionElevation(SchemasRecordsServices schemas, String query) { for (Iterator<QueryElevation> iterator = this.queryElevations.iterator(); iterator.hasNext(); ) { QueryElevation queryElevation = iterator.next(); if (queryElevation.getQuery().equals(query)) { queryElevation.removeCollectionElevations(schemas); if (queryElevation.getDocElevations().isEmpty()) { iterator.remove(); } } } } public void removeElevation(String query) { for (Iterator<QueryElevation> iterator = this.queryElevations.iterator(); iterator.hasNext(); ) { QueryElevation queryElevation = iterator.next(); if (queryElevation.getQuery().equals(query)) { iterator.remove(); } } } public Elevations getCollectionElevations(SchemasRecordsServices schemas) { Elevations returnElevation = new Elevations(); for (QueryElevation queryElevation : this.queryElevations) { List<DocElevation> currentDocElevation = getCollectionElevation(schemas, queryElevation.getQuery()); returnElevation.addQueryElevation(queryElevation.getQuery(), currentDocElevation); } return returnElevation; } private void addQueryElevation(String query, List<DocElevation> docElevations) { this.queryElevations.add(new QueryElevation().setQuery(query).setDocElevations(docElevations)); } public List<DocElevation> getCollectionElevation(SchemasRecordsServices schemas, String query) { List<DocElevation> returnList = new ArrayList<>(); QueryElevation queryElevation = getQueryElevation(query); if (queryElevation != null) { for (DocElevation docElevation : queryElevation.getDocElevations()) { if (docElevation.isInCollection(schemas)) { returnList.add(docElevation); } } } return returnList; } public static class QueryElevation { private String query; public void addUpdate(List<DocElevation> newDocElevations) { for (DocElevation newDocElevation : newDocElevations) { for (Iterator<DocElevation> iterator = this.docElevations.iterator(); iterator.hasNext(); ) { DocElevation oldDocElevation = iterator.next(); if (oldDocElevation.getId().equals(newDocElevation.getId())) { iterator.remove(); } } } this.docElevations.addAll(newDocElevations); } public QueryElevation addDocElevation(DocElevation docElevation) { this.docElevations.add(docElevation); return this; } public void removeCollectionElevations(SchemasRecordsServices schemas) { for (Iterator<DocElevation> iterator = this.docElevations.iterator(); iterator.hasNext(); ) { DocElevation docElevation = iterator.next(); if (docElevation.isInCollection(schemas)) { iterator.remove(); } } } public QueryElevation setDocElevations(List<DocElevation> docElevations) { this.docElevations = docElevations; return this; } public static class DocElevation { private String id; private boolean exclude; public DocElevation() { } public DocElevation(String id, boolean exclude) { this.id = id; this.exclude = exclude; } @XmlAttribute(name = "id") public String getId() { return id; } @XmlAttribute(name = "exclude") public boolean isExclude() { return exclude; } public void setExclude(boolean exclude) { this.exclude = exclude; } public void setId(String id) { this.id = id; } public boolean equals(Object obj) { return EqualsBuilder.reflectionEquals(this, obj); } public boolean isInCollection(SchemasRecordsServices schemas) { try { //FIXME Francis (1) on ne devrait pas retouner un record d une autre collection vu que l on passe par schema et (2)ca devrait etre le cas aussi avec la cache Record record = schemas.get(this.id); if (record.getCollection().equals(schemas.getCollection())) { return true; } } catch (RecordServicesRuntimeException.NoSuchRecordWithId e) { //record not in collection } return false; } } private List<DocElevation> docElevations = new ArrayList<>(); public QueryElevation() { } public QueryElevation(String query) { this.query = query; } @XmlElement(name = "doc") public List<DocElevation> getDocElevations() { return docElevations; } @XmlAttribute(name = "text") public String getQuery() { return query; } public QueryElevation setQuery(String query) { this.query = query; return this; } public boolean equals(Object obj) { return EqualsBuilder.reflectionEquals(this, obj); } } private List<QueryElevation> queryElevations = new ArrayList<>(); @XmlElement(name = "query") public List<QueryElevation> getQueryElevations() { return queryElevations; } public QueryElevation getQueryElevation(String query) { for (QueryElevation queryElevation : queryElevations) { if (queryElevation.getQuery().equals(query)) { return queryElevation; } } return null; } public boolean equals(Object obj) { return EqualsBuilder.reflectionEquals(this, obj); } }