-/**
- *
- */
-package eu.etaxonomy.taxeditor.editor.name;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
-import eu.etaxonomy.cdm.model.name.HomotypicalGroup;
-import eu.etaxonomy.cdm.model.taxon.Synonym;
-import eu.etaxonomy.cdm.model.taxon.Taxon;
-import eu.etaxonomy.cdm.model.taxon.TaxonBase;
-import eu.etaxonomy.cdm.model.taxon.TaxonRelationship;
-import eu.etaxonomy.cdm.model.taxon.TaxonRelationshipType;
-
-/**
- * <p>ContainerFactory class.</p>
- *
- * @author n.hoffmann
- * @version $Id: $
- */
-public class ContainerFactory {
-
- /** Constant <code>ACCEPTED=1</code> */
- public static final int ACCEPTED = 1;
- /** Constant <code>SYNONYM=2</code> */
- public static final int SYNONYM = 2;
- /** Constant <code>MISAPPLICATION=3</code> */
- public static final int MISAPPLICATION = 3;
- /** Constant <code>CONCEPT=4</code> */
- public static final int CONCEPT = 4;
-
- private static ContainerFactory instance = new ContainerFactory();
-
- private ContainerFactory(){}
-
- /**
- * <p>Getter for the field <code>instance</code>.</p>
- *
- * @return a {@link eu.etaxonomy.taxeditor.editor.name.ContainerFactory} object.
- */
- public static synchronized ContainerFactory getInstance(){
- return instance;
- }
-
- /**
- * <p>createAcceptedTaxonsHomotypicGroup</p>
- *
- * @param taxonNameEditor a {@link eu.etaxonomy.taxeditor.editor.name.TaxonNameEditor} object.
- */
- public void createAcceptedTaxonsHomotypicGroup(TaxonNameEditor taxonNameEditor) {
- Taxon taxon = taxonNameEditor.getTaxon();
-
- // Draw homotypic group synonyms
- HomotypicalGroup homotypicGroup = (HomotypicalGroup) HibernateProxyHelper.deproxy(taxon.getHomotypicGroup());
- List<Synonym> homotypicSynonyms = homotypicGroup.getSynonymsInGroup(taxon.getSec());
-
- HomotypicalSynonymGroup group = taxonNameEditor.getHomotypicSynonymGroup();
-
- // check if the taxon has changed
- if(group != null && ! taxon.getHomotypicGroup().equals(group.getGroup()) ){
- group.removeAllContainers();
- group.clear();
- group = null;
- }
-
- // first run
- if(group == null){
- HomotypicalSynonymGroup homotypicalSynonymGroup = new HomotypicalSynonymGroup(taxonNameEditor, homotypicGroup);
- taxonNameEditor.setHomotypicSynonymGroup(homotypicalSynonymGroup);
- AcceptedNameContainer acceptedNameContainer = new AcceptedNameContainer(taxonNameEditor, homotypicalSynonymGroup);
-
- taxonNameEditor.setAcceptedNameContainer(acceptedNameContainer);
- for(Synonym synonym : homotypicSynonyms){
- createContainerFactoryMethod(SYNONYM, homotypicalSynonymGroup, synonym, taxonNameEditor);
- }
- }
- // subsequent runs
- else{
- fillGroup(group, homotypicSynonyms, ACCEPTED, taxonNameEditor);
- }
- }
-
- /**
- * <p>createHeterotypicSynonymGroups</p>
- *
- * @param taxonNameEditor a {@link eu.etaxonomy.taxeditor.editor.name.TaxonNameEditor} object.
- */
- public void createHeterotypicSynonymGroups(TaxonNameEditor taxonNameEditor) {
- Taxon taxon = taxonNameEditor.getTaxon();
-
- List<HomotypicalGroup> homotypicalGroups = taxon.getHeterotypicSynonymyGroups();
-
- // reatins a reference to the homotypical group widgets
- Map<HomotypicalGroup, HomotypicalSynonymGroup> retainedGroups = taxonNameEditor.getHeterotypicSynonymGroupsMap();
-
- taxonNameEditor.clearHeterotypicSynonymGroups();
-
- // iterate over taxas synonymy groups
- for (HomotypicalGroup homotypicalGroup : homotypicalGroups) {
- HomotypicalGroup homotypicalGroupDeproxied = (HomotypicalGroup) HibernateProxyHelper.deproxy(homotypicalGroup);
-
- HomotypicalSynonymGroup group;
- if(retainedGroups.containsKey(homotypicalGroupDeproxied)){
- group = retainedGroups.get(homotypicalGroupDeproxied);
- retainedGroups.remove(homotypicalGroupDeproxied);
- }else{
- group = new HomotypicalSynonymGroup(taxonNameEditor, homotypicalGroupDeproxied);
- }
-
- createHeterotypicSynonymGroup(taxonNameEditor, group);
- taxonNameEditor.addHeterotypicSynonymGroup(group);
- }
-
- // remove all groups that did not match
- for(AbstractGroup group : retainedGroups.values()){
- group.clear();
- }
- }
-
- /**
- * <p>createMisapplicationGroup</p>
- *
- * @param taxonNameEditor a {@link eu.etaxonomy.taxeditor.editor.name.TaxonNameEditor} object.
- */
- public void createMisapplicationGroup(TaxonNameEditor taxonNameEditor) {
- Taxon taxon = taxonNameEditor.getTaxon();
-
- List<TaxonBase> content = new ArrayList<TaxonBase>(taxon.getMisappliedNames());
-
- if(content.size() == 0 && taxonNameEditor.getMisappliedGroup() != null){
- taxonNameEditor.getMisappliedGroup().clear();
- taxonNameEditor.setMisapplicationsGroup(null);
- }else{
- AbstractGroup group = getMisappliedGroup(taxonNameEditor);
- fillGroup(group, content, MISAPPLICATION, taxonNameEditor);
- }
- }
-
- /**
- * <p>createConceptGroup</p>
- *
- * @param taxonNameEditor a {@link eu.etaxonomy.taxeditor.editor.name.TaxonNameEditor} object.
- */
- public void createConceptGroup(TaxonNameEditor taxonNameEditor) {
- Taxon taxon = taxonNameEditor.getTaxon();
-
- Set<TaxonRelationship> filteredTaxonRelations = new HashSet<TaxonRelationship>();
-
- for (TaxonRelationship relationship : taxon.getTaxonRelations()) {
- if (! relationship.getType().equals(TaxonRelationshipType.MISAPPLIED_NAME_FOR()) ||
- relationship.getType().equals(TaxonRelationshipType.TAXONOMICALLY_INCLUDED_IN())) {
- filteredTaxonRelations.add(relationship);
- }
- }
-
- if(filteredTaxonRelations.size() == 0 && taxonNameEditor.getConceptGroup() != null){
- taxonNameEditor.getConceptGroup().clear();
- taxonNameEditor.setConceptGroup(null);
- }else{
- ConceptGroup group = getConceptGroup(taxonNameEditor);
-
- // reatain old container
- List<AbstractGroupedContainer<Taxon>> groupedContainers = group.getGroupedContainers();
-
- group.removeAllContainers();
-
- // Draw concept relation elements
- for (TaxonRelationship relationship : filteredTaxonRelations) {
- ConceptContainer.getNewInstance(group.getNameEditor(), group, relationship);
- }
- }
- }
-
-
- /**
- * <p>fillGroup</p>
- *
- * @param group a {@link eu.etaxonomy.taxeditor.editor.name.AbstractGroup} object.
- * @param content a {@link java.util.List} object.
- * @param mode a int.
- * @param taxonNameEditor
- */
- public void fillGroup(AbstractGroup group, List<? extends TaxonBase> content, int mode, TaxonNameEditor taxonNameEditor){
- if(content == null || (mode != ACCEPTED && content.size() == 0)){
- return;
- }
-
- AbstractGroupedContainer[] retainedContainers = (AbstractGroupedContainer[]) group.getGroupedContainers().toArray(new AbstractGroupedContainer[0]);
-
- group.clearContainers();
-
- if(retainedContainers.length > 0 && retainedContainers[0] instanceof AcceptedNameContainer){
- group.add(retainedContainers[0]);
- retainedContainers[0] = null;
- }
-
- for(TaxonBase taxonBase : content){
- AbstractGroupedContainer existingContainer = null;
- int i = 0;
- for(AbstractGroupedContainer container : retainedContainers){
- if(container != null && taxonBase.equals(container.getData())){
- existingContainer = container;
- retainedContainers[i] = null;
- }
- i++;
- }
- if(existingContainer != null){
- group.add(existingContainer);
- }else{
- createContainerFactoryMethod(mode == ACCEPTED ? SYNONYM : mode, group, taxonBase, taxonNameEditor);
- }
- }
-
- // delete all container that were not used
- for(AbstractGroupedContainer container : retainedContainers){
- if(container != null){
- group.deleteContainer(container);
- }
- }
- }
-
- /**
- * <p>createContainerFactoryMethod</p>
- *
- * @param mode a int.
- * @param group a {@link eu.etaxonomy.taxeditor.editor.name.AbstractGroup} object.
- * @param taxonBase a {@link eu.etaxonomy.cdm.model.taxon.TaxonBase} object.
- * @param taxonNameEditor
- * @return a {@link eu.etaxonomy.taxeditor.editor.name.AbstractGroupedContainer} object.
- */
- public AbstractGroupedContainer createContainerFactoryMethod(int mode, AbstractGroup group, TaxonBase taxonBase, TaxonNameEditor taxonNameEditor){
- AbstractGroupedContainer container = null;
-
- switch(mode){
- case ACCEPTED:
- container = new AcceptedNameContainer(group.getNameEditor(), group);
- break;
- case SYNONYM:
- container = new SynonymContainer(group.getNameEditor(), group, (Synonym) taxonBase);
- break;
- case MISAPPLICATION:
- container = new MisapplicationContainer(group.getNameEditor(), group, (Taxon) taxonBase);
- break;
- case CONCEPT:
- container = null;
- }
-
- taxonNameEditor.getManagedForm().addPart(container);
-
- return container;
- }
-
- /**
- * <p>createHeterotypicSynonymGroup</p>
- *
- * @param taxonNameEditor a {@link eu.etaxonomy.taxeditor.editor.name.TaxonNameEditor} object.
- * @param group a {@link eu.etaxonomy.taxeditor.editor.name.HomotypicalSynonymGroup} object.
- */
- public void createHeterotypicSynonymGroup(TaxonNameEditor taxonNameEditor, HomotypicalSynonymGroup group) {
- Taxon taxon = taxonNameEditor.getTaxon();
-
- List<AbstractGroupedContainer<Synonym>> groupedContainers = group.getGroupedContainers();
-
- List<Synonym> heterotypicSynonyms = group.getGroup().getSynonymsInGroup(taxon.getSec());
-
- fillGroup(group, heterotypicSynonyms, SYNONYM, taxonNameEditor);
- }
-
-
- private MisappliedGroup getMisappliedGroup(TaxonNameEditor editor) {
- if(editor.getMisappliedGroup() == null){
- // Create the group composite
- editor.setMisapplicationsGroup(new MisappliedGroup(editor));
- }
-
- MisappliedGroup misappliedGroup = editor.getMisappliedGroup();
-
- // Put the group composite before concept group composite, if any
- if (editor.getConceptGroup() != null) {
- editor.getMisappliedGroup().getControl().moveAbove(editor.getConceptGroup().getControl());
- }
-
- return misappliedGroup;
- }
-
-
- private ConceptGroup getConceptGroup(TaxonNameEditor editor) {
- if(editor.getConceptGroup() == null){
- // Create the group composite
- editor.setConceptGroup(new ConceptGroup(editor));
- }
-
- ConceptGroup conceptGroup = editor.getConceptGroup();
-
- // Put the group composite after misapplied group composite, if any
- if (editor.getMisappliedGroup() != null) {
- editor.getConceptGroup().getControl().moveBelow(editor.getMisappliedGroup().getControl());
- }
-
- return conceptGroup;
-
- }
-}