/**
* This file is part of Archiv-Editor.
*
* The software Archiv-Editor serves as a client user interface for working with
* the Person Data Repository. See: pdr.bbaw.de
*
* The software Archiv-Editor was developed at the Berlin-Brandenburg Academy
* of Sciences and Humanities, Jägerstr. 22/23, D-10117 Berlin.
* www.bbaw.de
*
* Copyright (C) 2010-2013 Berlin-Brandenburg Academy
* of Sciences and Humanities
*
* The software Archiv-Editor was developed by @author: Christoph Plutte.
*
* Archiv-Editor is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Archiv-Editor is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Archiv-Editor.
* If not, see <http://www.gnu.org/licenses/lgpl-3.0.html>.
*/
package org.bbaw.pdr.ae.view.control;
import java.lang.reflect.InvocationTargetException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Vector;
import org.bbaw.pdr.ae.common.NLMessages;
import org.bbaw.pdr.ae.common.icons.IconsInternal;
import org.bbaw.pdr.ae.common.interfaces.AEFilter;
import org.bbaw.pdr.ae.control.comparator.AspectsByCronComparator;
import org.bbaw.pdr.ae.control.comparator.ReferenceByAuthorTitleComparator;
import org.bbaw.pdr.ae.control.facade.Facade;
import org.bbaw.pdr.ae.control.interfaces.AMainSearcher;
import org.bbaw.pdr.ae.metamodel.PdrId;
import org.bbaw.pdr.ae.model.Aspect;
import org.bbaw.pdr.ae.model.Concurrence;
import org.bbaw.pdr.ae.model.PdrObject;
import org.bbaw.pdr.ae.model.Person;
import org.bbaw.pdr.ae.model.ReferenceMods;
import org.bbaw.pdr.ae.model.Relation;
import org.bbaw.pdr.ae.model.RelationStm;
import org.bbaw.pdr.ae.model.Time;
import org.bbaw.pdr.ae.model.TimeStm;
import org.bbaw.pdr.ae.model.ValidationStm;
import org.bbaw.pdr.ae.model.view.OrderingHead;
import org.bbaw.pdr.ae.view.control.filters.AspectPersonFilter;
import org.bbaw.pdr.ae.view.control.filters.AspectReferenceFilter;
import org.bbaw.pdr.ae.view.control.filters.AspectSearchTextFilter;
import org.bbaw.pdr.ae.view.control.filters.AspectSemanticFilter;
import org.bbaw.pdr.ae.view.control.filters.AspectYearFilter;
import org.bbaw.pdr.ae.view.control.filters.PdrObjectUserFilter;
import org.bbaw.pdr.ae.view.control.orderer.AspectsBySemanticOrderer;
import org.bbaw.pdr.ae.view.control.orderer.ReferencesOrderer;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.swt.widgets.Shell;
/**
* The Class PDRObjectsProvider.
* @author Christoph Plutte
*/
public class PDRObjectsProvider
{
// private final int GROUP_SIZE_MAX = 12;
// private final int ASPECT_SIZE_DEVISOR = 10;
/** The _facade. */
private Facade _facade = Facade.getInstanz();
/** The _main searcher. */
private AMainSearcher _mainSearcher = _facade.getMainSearcher();
/** The input. */
private Object _input;
/** The orderer. */
private PDRObjectsOrderer _orderer;
/** The ref orderer. */
private ReferencesOrderer _refOrderer;
/** The comparator. */
private Comparator<Aspect> _comparator;
/** The ref comparator. */
private Comparator<ReferenceMods> _refComparator;
/** The filters. */
private List<AEFilter> _filters;
/** The aspects. */
private Vector<Aspect> _aspects;
/** The filtered aspects. */
private Vector<Aspect> filteredAspects;
/** The ordered aspects. */
private Vector<OrderingHead> _orderedAspects;
/** The ordered aspects. */
private Vector<OrderingHead> _orderedPersonalHeads;
// private Vector<OrderingHead> reducedOrderedAspects;
/** The aspects references. */
private Vector<String> _aspectsReferences;
/** The aspects related objects. */
private Vector<String> _aspectsRelatedObjects;
/** The aspects semantics. */
private Vector<String> _aspectsSemantics;
/** The aspects users. */
private Vector<String> _aspectsUsers;
/** The aspect min year. */
private int _aspectMinYear;
/** The aspect max year. */
private int _aspectMaxYear;
/** The ordered by semantic. */
private boolean _orderedBySemantic;
/** The shown by person. */
private boolean _shownByPerson;
/** The references. */
private Vector<ReferenceMods> _references;
/** The person references. */
private Vector<ReferenceMods> _personReferences;
/** The hosted references. */
private Vector<ReferenceMods> _hostedReferences;
/** The reference ids. */
private Vector<String> _referenceIds;
/** The filtered references. */
private Vector<ReferenceMods> _filteredReferences;
/** The ordered references. */
private Vector<OrderingHead> _orderedReferences;
/** The ref filters. */
private List<AEFilter> _refFilters;
/** The references users. */
private Vector<String> _referencesUsers;
private boolean _lazySorting = false;
/**
* Adds the filter.
* @param filter the filter
*/
public final void addFilter(final AEFilter filter)
{
if (_filters == null)
{
_filters = new ArrayList<AEFilter>();
}
_filters.add(filter);
_orderedAspects = null;
_orderedReferences = null;
}
/**
* Adds the ref filter.
* @param refFilter the ref filter
*/
public final void addRefFilter(final AEFilter refFilter)
{
if (_refFilters == null)
{
_refFilters = new ArrayList<AEFilter>();
}
_refFilters.add(refFilter);
_orderedReferences = null;
}
/**
* Builds the ordered references on aspects.
* @param orderedAspects2 the ordered aspects2
* @return the vector
*/
private Vector<OrderingHead> buildOrderedReferencesOnAspects(final Vector<OrderingHead> orderedAspects2)
{
for (OrderingHead oh : orderedAspects2)
{
oh.setReferences(loadReferences(oh.getAspects(), null));
}
return orderedAspects2;
}
/**
* Filter aspects.
* @param monitor
* @return the vector
*/
private Vector<Aspect> filterAspects(IProgressMonitor monitor)
{
if (_filters != null)
{
Vector<Aspect> filtered = new Vector<Aspect>(_aspects.size());
for (int i = 0; i < _aspects.size(); i++)
{
boolean add = true;
for (int j = 0; j < _filters.size(); j++)
{
add = _filters.get(j).select(_aspects.get(i));
if (!add)
{
break;
}
}
if (add)
{
filtered.add(_aspects.get(i));
}
if (monitor != null)
{
monitor.worked(1);
if (monitor.isCanceled())
{
break;
}
}
}
return filtered;
}
return _aspects;
}
/**
* Filter references.
* @param filteredAspects2 the filtered aspects2
* @param monitor
* @return the vector
*/
private Vector<ReferenceMods> filterReferences(final Vector<Aspect> filteredAspects2, IProgressMonitor monitor)
{
if (_filters != null)
{
if (filteredAspects2.size() < _aspects.size())
{
Vector<ReferenceMods> refOfFilteredAspects = new Vector<ReferenceMods>(_references.size());
Vector<String> refOfFilteredAspectsId = new Vector<String>(_referenceIds.size());
for (Aspect a : filteredAspects2)
{
if (a.getValidation() != null)
{
for (ValidationStm vs : a.getValidation().getValidationStms())
{
if (vs.getReference() != null && vs.getReference().getSourceId() != null)
{
String id = vs.getReference().getSourceId().toString();
if (!refOfFilteredAspects.contains(id))
{
if (_facade.getReference(new PdrId(id)) != null)
{
refOfFilteredAspects.add(_facade.getReference(vs.getReference().getSourceId()));
refOfFilteredAspectsId.add(vs.getReference().getSourceId().toString());
}
}
}
}
}
}
if (_refFilters != null)
{
Vector<ReferenceMods> filtered = new Vector<ReferenceMods>(_references.size());
for (int i = 0; i < refOfFilteredAspects.size(); i++)
{
boolean add = true;
for (int j = 0; j < _refFilters.size(); j++)
{
add = _refFilters.get(j).select(refOfFilteredAspects.get(i));
if (!add)
{
break;
}
}
if (add)
{
filtered.add(refOfFilteredAspects.get(i));
}
if (monitor != null)
{
monitor.worked(1);
if (monitor.isCanceled())
{
break;
}
}
}
return filtered;
}
else
{
return refOfFilteredAspects;
}
}
else if (_refFilters != null)
{
Vector<ReferenceMods> filtered = new Vector<ReferenceMods>(_references.size());
for (int i = 0; i < _references.size(); i++)
{
boolean add = true;
for (int j = 0; j < _refFilters.size(); j++)
{
add = _refFilters.get(j).select(_references.get(i));
if (!add)
{
break;
}
}
if (add)
{
filtered.add(_references.get(i));
}
}
return filtered;
}
}
return _references;
}
/**
* Gets the arranged aspects.
* @return the arranged aspects
*/
public final Vector<OrderingHead> getArrangedAspects()
{
final ProgressMonitorDialog dialog = new ProgressMonitorDialog(new Shell());
dialog.setCancelable(true);
try
{
dialog.run(true, true, new IRunnableWithProgress()
{
@Override
public void run(final IProgressMonitor monitor)
{
if (_aspects == null)
{
loadAspects(monitor);
}
monitor.beginTask("Filter Aspects. Number of Aspects: " + _aspects.size(), _aspects.size());
filteredAspects = filterAspects(monitor);
if (_orderedAspects == null)
{
monitor.beginTask("Group Aspects. Number of Aspects: " + filteredAspects.size(),
filteredAspects.size());
if (_orderer != null)
{
_orderedAspects = _orderer.orderedObjects(filteredAspects, monitor);
}
else
{
_orderedAspects = new Vector<OrderingHead>(1);
OrderingHead oh = new OrderingHead();
oh.setLabel(NLMessages.getString("View_group_all"));
oh.setValue("ALL");
oh.setImageString(IconsInternal.ASPECTS);
oh.setAspects(filteredAspects);
_orderedAspects.add(oh);
}
}
monitor.beginTask("Sort Aspects. Number of Aspect Groups: " + _orderedAspects.size(),
_orderedAspects.size());
if (_lazySorting && !_orderedAspects.isEmpty())
{
if (_comparator != null)
{
Collections.sort(_orderedAspects.firstElement().getAspects(), _comparator);
}
else
{
Collections
.sort(_orderedAspects.firstElement().getAspects(), new AspectsByCronComparator());
}
_orderedAspects.firstElement().setSorted(true);
}
else
{
if (_comparator != null)
{
for (OrderingHead oh : _orderedAspects)
{
Collections.sort(oh.getAspects(), _comparator);
oh.setSorted(true);
monitor.worked(1);
}
}
else
{
AspectsByCronComparator cronComp = new AspectsByCronComparator();
for (OrderingHead oh : _orderedAspects)
{
Collections.sort(oh.getAspects(), cronComp);
oh.setSorted(true);
monitor.worked(1);
}
}
}
}
});
}
catch (InvocationTargetException e)
{
e.printStackTrace();
}
catch (InterruptedException e)
{
e.printStackTrace();
}
return _orderedAspects;
}
/**
* Computes a list of {@link OrderingHead}s that are representing a {@link PdrObject},
* (most likely a {@link Person}), all children of those ordering heads are related
* to as aspect_of, respectively. In other words, create and return an additional
* layer of classification built on top of the classification tree this {@link PDRObjectsProvider}
* provides.
* @return additional layer of classification s.t. all aspects are grouped by their aspect_of counterparts
* @see #getArrangedAspects()
*/
public Vector<OrderingHead> getArrangedAspectsByObjects() {
// generate new person -> group -> aspects structure only if cache is empty!
if (_orderedPersonalHeads == null) {
// TODO: generalize for all kinds of PdrObjects, not just Person
HashMap<Person, OrderingHead> people = new HashMap<Person, OrderingHead>();
Vector<OrderingHead> groups = this.getArrangedAspects();
Facade facade = Facade.getInstanz();
// output for debugging
/*for (OrderingHead group : groups) {
System.out.println(group.getLabel());
for (Aspect a : group.getAspects())
System.out.println(" "+a.getDisplayName());
}*/
// FIXME: groups == null if AspectsByReferenceOrderer is active!
for (OrderingHead group : groups)
for (Aspect aspect : group.getAspects()) {
PdrObject pobj = facade.getPdrObject(aspect.getOwningObjectId());
// derive additional layer of classification, assigning each aspect's
// class to the person the aspect belongs to
// TODO: generally, an aspect_of relation does not require a Person, but can
// link to any PdrObject instance.
// FIXME: so update this accordingly!
if (pobj instanceof Person) {
Person p = (Person)pobj;
// if owning person/object is not represented in a class yet, create one
if (!people.containsKey(p)) {
OrderingHead personalClass = new OrderingHead(p.getPdrId().toString());
personalClass.setLabel(p.getDisplayName());
personalClass.setImageString(IconsInternal.PERSON);
people.put(p, personalClass);
}
// retrieve class representing the person this aspect belongs to
OrderingHead byPerson = people.get(p);
// add aspect to retrieved class, maintaining original classification structure
if (!byPerson.contains(group)) {
// create a copy of this aspect's class
OrderingHead head = group.copy();
// remove child elements of copy and insert current aspect
head.clear();
head.addAspect(aspect);
// attach head to representation of owning person
byPerson.addSubCategory(head);
} else {
OrderingHead subcat = byPerson.findSubCategory(group);
if (subcat != null)
subcat.addAspect(aspect);
else {
//byPerson.addAspect(aspect);
System.out.println("WARNING: Head containing "+byPerson.getLabel()+
" does not have any sub-categories!!!");
}
}
}
}
// return newly created layer of ordering heads
// FIXME: currently active comparator must be applied to at least every
// aspect collection (owned by ordering heads), if not to ordering head
// children themselves (which would be still to be implemented, since comparators
// implement Comparator<Aspect> specifically..)
_orderedPersonalHeads = new Vector<OrderingHead>(people.values());
}
// regardless of whether new structure has been created right now:
// apply comparator -> sortiere aspekte in den untergruppen
if (_comparator != null)
System.out.println("Sort Aspects using: "+_comparator.getClass().getCanonicalName());
// TODO: dafür gibt es die hauseigene sort(oh) funktion!!!
for (OrderingHead byPerson : _orderedPersonalHeads)
for (OrderingHead cat : byPerson.getSubCategories()) {
Collections.sort(cat.getAspects(), _comparator);
cat.setSorted(true); //TODO: why do we even do this?
}
return _orderedPersonalHeads;
}
/**
* Gets the arranged references.
* @return the arranged references
*/
public final Vector<OrderingHead> getArrangedReferences()
{
final ProgressMonitorDialog dialog = new ProgressMonitorDialog(new Shell());
dialog.setCancelable(true);
try
{
dialog.run(true, true, new IRunnableWithProgress()
{
@Override
public void run(final IProgressMonitor monitor)
{
if (_aspects == null)
{
loadAspects(monitor);
}
if (_references == null)
{
loadReferences(monitor);
if (_input instanceof Person)
{
loadPersonReferences(monitor);
}
if (_input instanceof ReferenceMods)
{
loadHostedReferences(monitor);
if (!_references.contains(_input))
{
_references.add((ReferenceMods) _input);
}
}
}
// System.out.println("number of references " +
// references.size());
if (_aspects != null)
{
monitor.beginTask("Filter Aspects and References. Number of Aspects: " + _aspects.size()
+ " Number of Aspects: " + _references.size(), _aspects.size() + _references.size());
// System.out.println("number of filteredReferences " +
// filteredReferences.size());
}
filteredAspects = filterAspects(monitor);
_filteredReferences = filterReferences(filteredAspects, monitor);
if (_orderedReferences == null)
{
if (_orderer != null)
{
_orderedAspects = _orderer.orderedObjects(filteredAspects, monitor);
_orderedReferences = buildOrderedReferencesOnAspects(_orderedAspects);
if (_personReferences != null && _personReferences.size() > 0)
{
monitor.beginTask("Group Aspects. Number of Aspects: " + filteredAspects.size(),
filteredAspects.size());
OrderingHead oh = new OrderingHead();
if (_input instanceof Person)
{
oh.setLabel(((Person) _input).getDisplayName());
}
else
{
oh.setLabel("????");
}
oh.setValue("Person");
oh.setImageString(IconsInternal.PERSON);
oh.setReferences(_personReferences);
_orderedReferences.insertElementAt(oh, 0);
}
if (_hostedReferences != null && _hostedReferences.size() > 0)
{
OrderingHead oh = new OrderingHead();
oh.setLabel("contains");
oh.setValue("contains");
oh.setImageString(IconsInternal.REFERENCE);
oh.setReferences(_hostedReferences);
_orderedReferences.add(oh);
}
}
}
if (_orderedReferences == null)
{
monitor.beginTask("Group References. Number of References: " + _filteredReferences.size(),
_filteredReferences.size());
if (_refOrderer != null)
{
_orderedReferences = _refOrderer.orderedReferences(_filteredReferences, monitor);
}
else
{
_orderedReferences = new Vector<OrderingHead>(1);
OrderingHead oh = new OrderingHead();
oh.setLabel(NLMessages.getString("View_group_all"));
oh.setValue("ALL");
oh.setImageString(IconsInternal.REFERENCES);
oh.setReferences(_filteredReferences);
_orderedReferences.add(oh);
if (_hostedReferences != null && _hostedReferences.size() > 0)
{
oh = new OrderingHead();
oh.setLabel("contains");
oh.setValue("contains");
oh.setImageString(IconsInternal.REFERENCE);
oh.setReferences(_hostedReferences);
_orderedReferences.add(oh);
}
}
}
monitor.beginTask("Sort References. Number of References: " + _filteredReferences.size(),
_filteredReferences.size());
if (_lazySorting)
{
if (_refComparator != null)
{
Collections.sort(_orderedReferences.firstElement().getReferences(), _refComparator);
}
else
{
Collections.sort(_orderedReferences.firstElement().getReferences(),
new ReferenceByAuthorTitleComparator());
}
_orderedReferences.firstElement().setSorted(true);
}
else
{
if (_refComparator != null)
{
for (OrderingHead oh : _orderedReferences)
{
Collections.sort(oh.getReferences(), _refComparator);
oh.setSorted(true);
}
}
else
{
ReferenceByAuthorTitleComparator cronComp = new ReferenceByAuthorTitleComparator();
for (OrderingHead oh : _orderedReferences)
{
Collections.sort(oh.getReferences(), cronComp);
oh.setSorted(true);
}
}
}
}
});
}
catch (InvocationTargetException e)
{
e.printStackTrace();
}
catch (InterruptedException e)
{
e.printStackTrace();
}
return _orderedReferences;
}
/**
* Gets the aspect max year.
* @return the aspect max year
*/
public final int getAspectMaxYear()
{
return _aspectMaxYear;
}
/**
* Gets the aspect min year.
* @return the aspect min year
*/
public final int getAspectMinYear()
{
return _aspectMinYear;
}
/**
* Gets the aspects.
* @return the aspects
*/
public final Vector<Aspect> getAspects()
{
if (_aspects == null)
{
loadAspects(null);
}
return _aspects;
}
/**
* Gets the aspects references.
* @return the aspects references
*/
public final Vector<String> getAspectsReferences()
{
return _aspectsReferences;
}
/**
* Gets the aspects related objects.
* @return the aspects related objects
*/
public final Vector<String> getAspectsRelatedObjects()
{
return _aspectsRelatedObjects;
}
/**
* Gets the aspects semantics.
* @return the aspects semantics
*/
public final Vector<String> getAspectsSemantics()
{
return _aspectsSemantics;
}
/**
* Gets the aspects users.
* @return the aspects users
*/
public final Vector<String> getAspectsUsers()
{
return _aspectsUsers;
}
/**
* Gets the comparator.
* @return the comparator
*/
public final Comparator<Aspect> getComparator()
{
return _comparator;
}
/**
* Gets the filters.
* @return the filters
*/
public final List<AEFilter> getFilters()
{
return _filters;
}
/**
* For a given string identifier, return an instance of the corresponding
* {@link AEFilter} implementation, provided such a filter is currently
* active in this {@link PDRObjectsProvider}. Accepted identifiers are
* <i>person, reference, semantic, year</i> and <i>user</i>.
* @return
* @param type string identifier
*/
public AEFilter getFilter(String type) {
if (!new Vector<String>(Arrays.asList("person", "reference", "semantic", "year", "user")).contains(type))
return null;
//TODO: make class member?
HashMap<String, Class<? extends AEFilter>> types = new HashMap<String, Class<? extends AEFilter>>();
types.put("person", AspectPersonFilter.class);
types.put("reference", AspectReferenceFilter.class);
types.put("semantic", AspectSemanticFilter.class);
types.put("year", AspectYearFilter.class);
types.put("user", PdrObjectUserFilter.class);
if (_filters != null)
for (AEFilter f : _filters)
if (f.getClass().equals(types.get(type)))
return f;
return null;
}
/**
* Gets the input.
* @return the input
*/
public final Object getInput()
{
return _input;
}
/**
* Gets the number of aspects.
* @return the number of aspects
*/
public final int getNumberOfAspects()
{
if (_aspects == null)
{
loadAspects(null);
}
if (_filters != null && !_filters.isEmpty())
{
if (filteredAspects == null)
{
filteredAspects = filterAspects(null);
}
return filteredAspects.size();
}
return _aspects.size();
}
/**
* Gets the number of aspects.
* @return the number of aspects
*/
public final int getNumberOfReferences()
{
if (_aspects == null)
{
loadAspects(null);
}
if (_references == null)
{
loadReferences(null);
}
if (_filters != null && !_filters.isEmpty())
{
if (filteredAspects == null)
{
filteredAspects = filterAspects(null);
}
}
if (_refFilters != null && !_refFilters.isEmpty())
{
if (_filteredReferences == null)
{
_filteredReferences = filterReferences(filteredAspects, null);
}
return _filteredReferences.size();
}
return _references.size();
}
/**
* Gets the orderer.
* @return the orderer
*/
public final PDRObjectsOrderer getOrderer()
{
return _orderer;
}
/**
* Gets the ref comparator.
* @return the ref comparator
*/
public final Comparator<ReferenceMods> getRefComparator()
{
return _refComparator;
}
/**
* Gets the references.
* @return the references
*/
public final Vector<ReferenceMods> getReferences()
{
final ProgressMonitorDialog dialog = new ProgressMonitorDialog(new Shell());
dialog.setCancelable(true);
try
{
dialog.run(true, true, new IRunnableWithProgress()
{
@Override
public void run(final IProgressMonitor monitor)
{
if (_aspects == null)
{
loadAspects(monitor);
}
if (_references == null)
{
loadReferences(monitor);
if (_input instanceof Person)
{
loadPersonReferences(monitor);
}
if (_input instanceof ReferenceMods)
{
loadHostedReferences(monitor);
if (!_references.contains(_input))
{
_references.add((ReferenceMods) _input);
}
}
}
}
});
}
catch (InvocationTargetException e)
{
e.printStackTrace();
}
catch (InterruptedException e)
{
e.printStackTrace();
}
return _references;
}
/**
* Gets the references users.
* @return the references users
*/
public final Vector<String> getReferencesUsers()
{
return _referencesUsers;
}
/**
* Gets the ref filters.
* @return the ref filters
*/
public final List<AEFilter> getRefFilters()
{
return _refFilters;
}
/**
* Gets the ref orderer.
* @return the ref orderer
*/
public final ReferencesOrderer getRefOrderer()
{
return _refOrderer;
}
/**
* Gets the search filter.
* @return the search filter
*/
public final AspectSearchTextFilter getSearchFilter()
{
if (_filters != null)
{
for (AEFilter f : _filters)
{
if (f instanceof AspectSearchTextFilter)
{
return (AspectSearchTextFilter) f;
}
}
}
return null;
}
/**
* Checks for person filter.
* @return true, if successful
*/
public final boolean hasPersonFilter()
{
if (_filters != null)
{
for (AEFilter f : _filters)
{
if (f instanceof AspectPersonFilter)
{
return true;
}
}
return false;
}
else
{
return false;
}
}
/**
* Checks for reference filter.
* @return true, if successful
*/
public final boolean hasReferenceFilter()
{
if (_filters != null)
{
for (AEFilter f : _filters)
{
if (f instanceof AspectReferenceFilter)
{
return true;
}
}
return false;
}
else
{
return false;
}
}
/**
* Checks for semantic filter.
* @return true, if successful
*/
public final boolean hasSemanticFilter()
{
if (_filters != null)
{
for (AEFilter f : _filters)
{
if (f instanceof AspectSemanticFilter)
{
return true;
}
}
return false;
}
else
{
return false;
}
}
/**
* Checks for user filter.
* @return true, if successful
*/
public final boolean hasUserFilter()
{
if (_filters != null && _refFilters == null)
{
for (AEFilter f : _filters)
{
if (f instanceof PdrObjectUserFilter)
{
return true;
}
}
return false;
}
else if (_refFilters != null)
{
for (AEFilter f : _refFilters)
{
if (f instanceof PdrObjectUserFilter)
{
return true;
}
}
return false;
}
else
{
return false;
}
}
/**
* Checks for year filter.
* @return true, if successful
*/
public final boolean hasYearFilter()
{
if (_filters != null)
{
for (AEFilter f : _filters)
{
if (f instanceof AspectYearFilter)
{
return true;
}
}
return false;
}
else
{
return false;
}
}
/**
* Checks if is ordered by semantic.
* @return true, if is ordered by semantic
*/
public final boolean isOrderedBySemantic()
{
return _orderedBySemantic;
}
/**
* Checks if is shown by person.
* @return true, if is shown by person
*/
public final boolean isShownByPerson()
{
return _shownByPerson;
}
/**
* Updates this {@link PDRObjectsProvider}'s internal collection of {@link Aspect}s, by
* calling {@link #loadAspectsByObjects(PdrObject[], IProgressMonitor)} for every
* {@link PdrObject} that has been passed with the latest call of {@link #setInput(Object)}.
* In order to retrieve those {@link Aspect}s that fit this requirement, search methods
* of the internal {@link AMainSearcher} instance are called.
* @param monitor {@link IProgressMonitor} to indicate progress made during retrieval
* @see AMainSearcher
*/
private void loadAspects(IProgressMonitor monitor)
{
_aspectsReferences = new Vector<String>();
_aspectsUsers = new Vector<String>();
_aspectsSemantics = new Vector<String>();
_aspectsRelatedObjects = new Vector<String>();
_aspectMinYear = 2100;
_aspectMaxYear = 1000;
if (_input != null && _input instanceof PdrObject[])
{
final PdrObject[] pdrObjs = (PdrObject[]) _input;
_aspects = new Vector<Aspect>();
loadAspectsByObjects(pdrObjs, monitor);
_shownByPerson = pdrObjs instanceof Person[];
if (monitor != null)
{
monitor.worked(1);
if (monitor.isCanceled())
{
return;
}
}
if (pdrObjs.length > 1)
{
_shownByPerson = false;
}
}
else if (_input != null && _input instanceof PdrObject)
{
PdrObject pdrObj = (PdrObject) _input;
_aspects = new Vector<Aspect>();
loadAspectsByObjects(new PdrObject[]
{pdrObj}, monitor);
_shownByPerson = (pdrObj instanceof Person);
}
}
/**
* Load aspects by object.
* @param o the o
* @param monitor
*/
private void loadAspectsByObjects(final PdrObject[] objects, IProgressMonitor monitor)
{
ArrayList<PdrObject> l = new ArrayList<PdrObject>(objects.length);
for (PdrObject o : objects)
{
if (!o.isAspectsLoaded())
{
l.add(o);
}
}
final PdrObject[] unloadedObjs = (PdrObject[]) l.toArray(new PdrObject[l.size()]);
if (monitor != null && unloadedObjs != null)
{
monitor.beginTask("Loading Aspects of selected Objects. Number of Objects: " + unloadedObjs.length,
unloadedObjs.length);
}
if (objects.length > 0 && objects[0] instanceof ReferenceMods)
{
try
{
_mainSearcher.searchAspectsByReferences(unloadedObjs, monitor);
}
catch (Exception e)
{
e.printStackTrace();
}
}
else
{
try
{
_mainSearcher.searchAspectsByRelatedObjects(unloadedObjs, monitor);
}
catch (ParseException e)
{
e.printStackTrace();
}
catch (Exception e)
{
e.printStackTrace();
}
}
if (monitor != null && objects != null)
{
monitor.beginTask("Processing Aspects", objects.length);
}
HashSet<PdrId> aspectIDs = new HashSet<PdrId>();
for (PdrObject o : objects)
{
// if selected objects are Aspects, add these seleceted aspects to the loaded aspects.
if (o instanceof Aspect)
{
if (!aspectIDs.contains(o.getPdrId()))
{
Aspect a = (Aspect) o;
_aspects.add(a);
aspectIDs.add(a.getPdrId());
processAspectReferences(a);
processAspectSemantics(a);
processAspectUser(a);
processAspectRelatedObjects(a);
processAspectTimeDim(a);
}
}
for (PdrId id : o.getAspectIds())
{
Aspect a = _facade.getAspect(id);
if (a != null)
{
if (!aspectIDs.contains(a.getPdrId()))
{
_aspects.add(a);
aspectIDs.add(a.getPdrId());
processAspectReferences(a);
processAspectSemantics(a);
processAspectUser(a);
processAspectRelatedObjects(a);
processAspectTimeDim(a);
}
}
if (monitor != null)
{
monitor.worked(1);
if (monitor.isCanceled())
{
break;
}
}
}
if (monitor != null)
{
monitor.worked(1);
if (monitor.isCanceled())
{
break;
}
}
}
aspectIDs = null;
if (_aspectMinYear == 2100)
{
_aspectMinYear = 1000;
}
if (_aspectMaxYear == 1000)
{
_aspectMaxYear = 2100;
}
}
/**
* Load hosted references.
* @param monitor
*/
private void loadHostedReferences(IProgressMonitor monitor)
{
_hostedReferences = new Vector<ReferenceMods>();
ReferenceMods host = (ReferenceMods) _input;
if (host.getHostedReferences() != null)
{
for (String id : host.getHostedReferences())
{
ReferenceMods hosted = _facade.getReference(new PdrId(id));
if (hosted != null && !_hostedReferences.contains(hosted))
{
_hostedReferences.add(hosted);
}
if (monitor != null)
{
monitor.worked(1);
if (monitor.isCanceled())
{
break;
}
}
}
}
}
/**
* Load person references.
* @param monitor
*/
private void loadPersonReferences(IProgressMonitor monitor)
{
_personReferences = new Vector<ReferenceMods>(4);
Vector<String> refIds = new Vector<String>(4);
if (_input instanceof Person)
{
Person p = (Person) _input;
ReferenceMods reference;
if (p.getConcurrences() != null && !p.getConcurrences().getConcurrences().isEmpty())
{
for (Concurrence c : p.getConcurrences().getConcurrences())
{
if (c.getReferences() != null && !c.getReferences().isEmpty())
{
for (ValidationStm cRef : c.getReferences())
{
if (cRef.getReference() != null && cRef.getReference().getSourceId() != null)
{
String id = cRef.getReference().getSourceId().toString();
if (!refIds.contains(id))
{
if (_facade.getReference(new PdrId(id)) != null)
{
reference = _facade.getReference(cRef.getReference().getSourceId());
_personReferences.add(reference);
refIds.add(id);
if (!_references.contains(reference))
{
_references.add(reference);
}
}
}
}
}
}
}
if (monitor != null)
{
monitor.worked(1);
if (monitor.isCanceled())
{
return;
}
}
}
}
}
/**
* Load references.
* @param monitor
*/
private void loadReferences(IProgressMonitor monitor)
{
if (_aspects == null)
{
loadAspects(monitor);
}
_references = new Vector<ReferenceMods>();
_referenceIds = new Vector<String>();
_referencesUsers = new Vector<String>();
ReferenceMods reference;
String id = null;
if (_aspects != null)
{
for (Aspect a : _aspects)
{
if (a.getValidation() != null)
{
for (ValidationStm vs : a.getValidation().getValidationStms())
{
if (vs.getReference() != null && vs.getReference().getSourceId() != null)
{
id = vs.getReference().getSourceId().toString();
if (!_referenceIds.contains(id))
{
if (_facade.getReference(new PdrId(id)) != null)
{
reference = _facade.getReference(vs.getReference().getSourceId());
_references.add(reference);
_referenceIds.add(vs.getReference().getSourceId().toString());
processReferencesUsers(reference);
}
}
}
}
}
if (monitor != null)
{
monitor.worked(1);
if (monitor.isCanceled())
{
break;
}
}
}
}
}
/**
* Load references.
* @param aspects2 the aspects2
* @return the vector
*/
private Vector<ReferenceMods> loadReferences(final Vector<Aspect> aspects2, IProgressMonitor monitor)
{
Vector<ReferenceMods> refs = new Vector<ReferenceMods>(_references.size());
Vector<String> refIds = new Vector<String>(_referenceIds.size());
for (Aspect a : aspects2)
{
if (a.getValidation() != null)
{
for (ValidationStm vs : a.getValidation().getValidationStms())
{
if (vs.getReference() != null && vs.getReference().getSourceId() != null)
{
String id = vs.getReference().getSourceId().toString();
if (!refIds.contains(id))
{
if (_facade.getReference(new PdrId(id)) != null)
{
refs.add(_facade.getReference(vs.getReference().getSourceId()));
refIds.add(vs.getReference().getSourceId().toString());
}
}
}
}
}
}
return refs;
}
/**
* Process aspect references.
* @param a the a
*/
private void processAspectReferences(final Aspect a)
{
String reference = null;
ValidationStm valStm;
if (a.getValidation() != null && a.getValidation().getValidationStms() != null
&& !a.getValidation().getValidationStms().isEmpty())
{
for (int j = 0; j < a.getValidation().getValidationStms().size(); j++)
{
valStm = a.getValidation().getValidationStms().get(j);
if (valStm.getReference() != null && valStm.getReference().getSourceId() != null)
{
reference = valStm.getReference().getSourceId().toString();
}
else
{
reference = "undefined";
}
if (!_aspectsReferences.contains(reference))
{
_aspectsReferences.add(reference);
}
}
}
}
/**
* Process aspect related objects.
* @param a the a
*/
private void processAspectRelatedObjects(final Aspect a)
{
RelationStm relationStm;
if (a.getRelationDim() != null && !a.getRelationDim().getRelationStms().isEmpty())
{
for (int j = 0; j < a.getRelationDim().getRelationStms().size(); j++)
{
relationStm = a.getRelationDim().getRelationStms().get(j);
if (relationStm.getSubject() != null && !relationStm.getSubject().equals(a.getPdrId()))
{
if (!_aspectsRelatedObjects.contains(relationStm.getSubject().toString()))
{
_aspectsRelatedObjects.add(relationStm.getSubject().toString());
}
}
if (relationStm.getRelations() != null)
{
for (Relation rel : relationStm.getRelations())
{
if (rel.getObject() != null)
{
if (!_aspectsRelatedObjects.contains(rel.getObject().toString()))
{
_aspectsRelatedObjects.add(rel.getObject().toString());
}
}
}
}
}
}
}
/**
* Process aspect semantics.
* @param a the a
*/
private void processAspectSemantics(final Aspect a)
{
String semantic;
for (int j = 0; j < a.getSemanticDim().getSemanticStms().size(); j++)
{
semantic = a.getSemanticDim().getSemanticStms().get(j).getLabel();
if (!_aspectsSemantics.contains(semantic))
{
_aspectsSemantics.add(semantic);
}
}
}
/**
* Process aspect time dim.
* @param a the a
*/
private void processAspectTimeDim(final Aspect a)
{
TimeStm timeStm;
if (a.getTimeDim() != null && !a.getTimeDim().getTimeStms().isEmpty())
{
for (int j = 0; j < a.getTimeDim().getTimeStms().size(); j++)
{
timeStm = a.getTimeDim().getTimeStms().get(j);
if (timeStm.getTimes() != null && !timeStm.getTimes().isEmpty())
{
for (Time t : timeStm.getTimes())
{
if (t.getTimeStamp() != null)
{
if (t.getTimeStamp().getYear() > _aspectMaxYear)
{
_aspectMaxYear = t.getTimeStamp().getYear();
}
if (t.getTimeStamp().getYear() < _aspectMinYear)
{
_aspectMinYear = t.getTimeStamp().getYear();
}
}
}
}
}
}
}
/**
* Process aspect user.
* @param a the a
*/
private void processAspectUser(final Aspect a)
{
String userId = a.getRecord().getRevisions().firstElement().getAuthority().toString();
if (!_aspectsUsers.contains(userId))
{
_aspectsUsers.add(userId);
}
}
/**
* Process references users.
* @param reference the reference
*/
private void processReferencesUsers(final ReferenceMods reference)
{
if (reference.getRecord() != null && reference.getRecord().getRevisions() != null
&& !reference.getRecord().getRevisions().isEmpty()
&& reference.getRecord().getRevisions().firstElement().getAuthority() != null)
{
String userId = reference.getRecord().getRevisions().firstElement().getAuthority().toString();
if (!_referencesUsers.contains(userId))
{
// System.out.println("process ref users id " + userId);
_referencesUsers.add(userId);
}
}
}
// private OrderingHead mergeOrderingHeads(OrderingHead targetHead,
// OrderingHead objectHead)
// {
//
// String label = targetHead.getLabel();
// String label2 = objectHead.getLabel();
// // System.out.println("merge targetlabel " + label);
// // System.out.println("merge objectLabel " + label2);
//
// if (orderer instanceof AspectByYearOrderer)
// {
// label = label.substring(0, Math.min(4, label.length()));
// label2 = label2.substring(0, Math.min(4, label.length()));
// }
// else
// {
// if (label.length() > 10)
// {
// label = label.substring(0, 7) + "...";
// }
// if (label2.length() > 10)
// {
// label2 = label2.substring(0, 7) + "...";
// }
// }
// label += "-";
//
// label += label2;
// targetHead.setLabel(label);
// targetHead.setValue(targetHead.getValue() + " " + objectHead.getValue());
// targetHead.getAspects().addAll(objectHead.getAspects());
// return targetHead;
// }
/**
* Removes the all filters.
*/
public final void removeAllFilters()
{
_filters = null;
_orderedAspects = null;
_orderedPersonalHeads = null;
_orderedReferences = null;
}
/**
* Removes the all ref filters.
*/
public final void removeAllRefFilters()
{
_refFilters = null;
_orderedAspects = null;
_orderedPersonalHeads = null;
_orderedReferences = null;
}
/**
* Removes the filter.
* @param filter the filter
*/
public final void removeFilter(final AEFilter filter)
{
if (_filters != null)
{
_filters.remove(filter);
}
_orderedAspects = null;
_orderedPersonalHeads = null;
_orderedReferences = null;
}
/**
* Removes the ref filter.
* @param refFilter the ref filter
*/
public final void removeRefFilter(final AEFilter refFilter)
{
if (_refFilters != null)
{
_refFilters.remove(refFilter);
}
_orderedReferences = null;
}
/**
* Sets the comparator.
* @param comparator the new comparator
*/
public final void setComparator(final Comparator<Aspect> comparator)
{
this._comparator = comparator;
}
/**
* Sets the filters.
* @param filters the new filters
*/
public final void setFilters(final List<AEFilter> filters)
{
this._filters = filters;
_orderedAspects = null;
_orderedPersonalHeads = null;
_orderedReferences = null;
}
/**
* Sets the input. Depending on what is intended to be done with that, the
* argument can be an instance of {@link PdrObject}[], a {@link Person},
* or {@link ReferenceMods}.
* @param input the new input
*/
public final void setInput(final Object input)
{
this._input = input;
_aspects = null;
_orderedAspects = null;
_orderedPersonalHeads = null;
_references = null;
_personReferences = null;
_hostedReferences = null;
_orderedReferences = null;
if (input instanceof Person)
{
_shownByPerson = true;
}
else
{
_shownByPerson = false;
}
}
/**
* Sets the orderer. Resetting the Orderer will set orderedAspects and
* orderedReferences to null.
* @param orderer the new orderer
*/
public final void setOrderer(final PDRObjectsOrderer orderer)
{
// System.out.println("3 orderer " + orderer);
this._orderer = orderer;
_orderedAspects = null;
_orderedPersonalHeads = null;
_orderedReferences = null;
if (orderer instanceof AspectsBySemanticOrderer)
{
_orderedBySemantic = true;
}
else
{
_orderedBySemantic = false;
}
}
/**
* Sets the ref comparator.
* @param refComparator the new ref comparator
*/
public final void setRefComparator(final Comparator<ReferenceMods> refComparator)
{
this._refComparator = refComparator;
}
/**
* Sets the ref filters.
* @param refFilters the new ref filters
*/
public final void setRefFilters(final List<AEFilter> refFilters)
{
this._refFilters = refFilters;
_orderedReferences = null;
}
/**
* Sets the ref orderer.
* @param refOrderer the new ref orderer
*/
public final void setRefOrderer(final ReferencesOrderer refOrderer)
{
this._refOrderer = refOrderer;
}
public void setLazySorting(boolean lazySorting)
{
this._lazySorting = lazySorting;
}
/**
* Sort aspects and references within given {@link OrderingHead} by sorting criteria previously set
* by {@link #setComparator(Comparator)}, without accessing the db.
* Default comparators are {@link AspectsByCronComparator} and {@link ReferenceByAuthorTitleComparator},
* respectively.
* @param orderingHead
*/
public void sort(OrderingHead orderingHead)
{
if (orderingHead != null && !orderingHead.isSorted())
{
System.out.println("Sort " + orderingHead.getLabel());
if (orderingHead.getAspects() != null && !orderingHead.getAspects().isEmpty())
{
if (_comparator != null)
{
Collections.sort(orderingHead.getAspects(), _comparator);
}
else
{
Collections.sort(orderingHead.getAspects(), new AspectsByCronComparator());
}
orderingHead.setSorted(true);
}
else if (orderingHead.getReferences() != null && !orderingHead.getReferences().isEmpty())
{
if (_refComparator != null)
{
Collections.sort(orderingHead.getReferences(), _refComparator);
}
else
{
Collections.sort(orderingHead.getReferences(), new ReferenceByAuthorTitleComparator());
}
orderingHead.setSorted(true);
}
}
}
}