*/
package eu.etaxonomy.taxeditor.newWizard;
+import java.util.HashSet;
+import java.util.Set;
import java.util.UUID;
import org.apache.commons.lang.StringUtils;
import eu.etaxonomy.cdm.api.service.IClassificationService;
import eu.etaxonomy.cdm.api.service.ITaxonNodeService;
+import eu.etaxonomy.cdm.model.common.CdmBase;
import eu.etaxonomy.cdm.model.taxon.Classification;
import eu.etaxonomy.cdm.model.taxon.ITaxonTreeNode;
import eu.etaxonomy.cdm.model.taxon.Taxon;
TaxonNode taxonNode = parent.addChildTaxon(taxon, parent.getReference(), parent.getMicroReference());
taxonNode = CdmStore.getService(ITaxonNodeService.class).merge(taxonNode);
generatedTaxonNodeUuid = taxonNode.getUuid();
- CdmStore.getCurrentSessionManager().getActiveSession().addEvent(taxonNode, EventType.INSERT);
+ Set<CdmBase> affectedObjects = new HashSet<CdmBase>();
+ affectedObjects.add((TaxonNode)parent);
+ CdmStore.getCurrentSessionManager().getActiveSession().addEvent(taxonNode, affectedObjects, EventType.INSERT);
+ CdmStore.getCurrentSessionManager().getActiveSession().fireNotifications();
}catch(IllegalArgumentException e){
MessagingUtils.warningDialog("Taxon already exists in classfication", getClass(), e.getMessage());
}
*/
public abstract class AbstractPersistentPostOperation extends AbstractPostTaxonOperation {
private final IConversationEnabled conversationEnabled;
- private final ICdmEntitySessionEnabled cdmEntitySessionEnabled;
+
protected ITaxonTreeNode parentNode;
/**
IPostOperationEnabled postOperationEnabled,
IConversationEnabled conversationEnabled,
ICdmEntitySessionEnabled cdmEntitySessionEnabled) {
- super(label, undoContext, postOperationEnabled);
+ super(label, undoContext, postOperationEnabled, cdmEntitySessionEnabled);
this.conversationEnabled = conversationEnabled;
- this.cdmEntitySessionEnabled = cdmEntitySessionEnabled;
}
/**
IPostOperationEnabled postOperationEnabled,
IConversationEnabled conversationEnabled,
ICdmEntitySessionEnabled cdmEntitySessionEnabled) {
- super(label, undoContext, taxonNode, postOperationEnabled);
+ super(label, undoContext, taxonNode, postOperationEnabled, cdmEntitySessionEnabled);
this.conversationEnabled = conversationEnabled;
- this.cdmEntitySessionEnabled = cdmEntitySessionEnabled;
+
}
/**
IPostOperationEnabled postOperationEnabled,
IConversationEnabled conversationEnabled,
ICdmEntitySessionEnabled cdmEntitySessionEnabled) {
- super(label, undoContext, postOperationEnabled);
+ super(label, undoContext, postOperationEnabled, cdmEntitySessionEnabled);
this.parentNode = parentNode;
this.conversationEnabled = conversationEnabled;
- this.cdmEntitySessionEnabled = cdmEntitySessionEnabled;
+
}
/* (non-Javadoc)
conversationEnabled.getConversationHolder().bind();
conversationEnabled.getConversationHolder().commit(true);
}
- if(cdmEntitySessionEnabled != null) {
- cdmEntitySessionEnabled.getCdmEntitySession().fireNotifications();
+ if(getCdmEntitySessionEnabled() != null) {
+ getCdmEntitySessionEnabled().getCdmEntitySession().fireNotifications();
}
IStatus status = super.postExecute(objectAffectedByOperation);
*/
public void bind(){
conversationEnabled.getConversationHolder().bind();
+ if(getCdmEntitySessionEnabled() != null) {
+ getCdmEntitySessionEnabled().getCdmEntitySession().bind();
+ }
}
}
import eu.etaxonomy.cdm.model.common.CdmBase;
import eu.etaxonomy.cdm.model.common.ICdmBase;
+import eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled;
/**
* @author pplitzner
*/
protected IPostOperationEnabled postOperationEnabled;
+ private ICdmEntitySessionEnabled cdmEntitySessionEnabled;
+
/**
* <p>Constructor for AbstractPostOperation.</p>
this.postOperationEnabled = postOperationEnabled;
}
+ public AbstractPostOperation(String label, IUndoContext undoContext,
+ T element, IPostOperationEnabled postOperationEnabled,
+ ICdmEntitySessionEnabled cdmEntitySessionEnabled) {
+ this(label, undoContext);
+ this.element = element;
+ this.postOperationEnabled = postOperationEnabled;
+ this.cdmEntitySessionEnabled = cdmEntitySessionEnabled;
+ }
+
/**
* This method will try to call the post operation on a possibly registered
* IPostOperationEnabled implementor. Objects that were affected by the operation
* @return a {@link org.eclipse.core.runtime.IStatus} object.
*/
protected IStatus postExecute(CdmBase objectAffectedByOperation) {
- if(postOperationEnabled != null){
- return postOperationEnabled.postOperation(objectAffectedByOperation) ? Status.OK_STATUS : Status.CANCEL_STATUS;
- }
- return Status.OK_STATUS;
+
+ if(postOperationEnabled != null){
+ return postOperationEnabled.postOperation(objectAffectedByOperation) ? Status.OK_STATUS : Status.CANCEL_STATUS;
+ }
+ return Status.OK_STATUS;
}
/**
* @return a {@link eu.etaxonomy.taxeditor.operation.IPostOperationEnabled} object.
*/
public IPostOperationEnabled getPostOperationEnabled() {
- return postOperationEnabled;
+ return postOperationEnabled;
+ }
+
+// protected IStatus updateSession(CdmBase clientObjectAffectedByOperation, UpdateResult updateResult) {
+// Set<CdmBase> affectedObjects;
+// if(updateResult == null) {
+// affectedObjects = new HashSet<CdmBase>();
+// } else {
+// affectedObjects = updateResult.getUpdatedObjects();
+// }
+//
+// if(cdmEntitySessionEnabled != null) {
+// cdmEntitySessionEnabled.getCdmEntitySession().update(clientObjectAffectedByOperation, affectedObjects);
+// }
+// return Status.OK_STATUS;
+// }
+//
+// protected IStatus updateSession(UUID uuid) {
+//
+// if(cdmEntitySessionEnabled != null) {
+// CdmBase cdmBase = cdmEntitySessionEnabled.getCdmEntitySession().remoteLoad(CdmStore.getService(IService.class),uuid);
+// cdmEntitySessionEnabled.getCdmEntitySession().update(null, cdmBase);
+// }
+// return Status.OK_STATUS;
+// }
+
+ public ICdmEntitySessionEnabled getCdmEntitySessionEnabled() {
+ return cdmEntitySessionEnabled;
}
}
\ No newline at end of file
/**
-* Copyright (C) 2007 EDIT
-* European Distributed Institute of Taxonomy
-* http://www.e-taxonomy.eu
-*
-* The contents of this file are subject to the Mozilla Public License Version 1.1
-* See LICENSE.TXT at the top of this package for the full license terms.
-*/
+ * Copyright (C) 2007 EDIT
+ * European Distributed Institute of Taxonomy
+ * http://www.e-taxonomy.eu
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * See LICENSE.TXT at the top of this package for the full license terms.
+ */
package eu.etaxonomy.taxeditor.operation;
import eu.etaxonomy.cdm.model.taxon.ITaxonTreeNode;
import eu.etaxonomy.cdm.model.taxon.Taxon;
import eu.etaxonomy.cdm.model.taxon.TaxonNode;
+import eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled;
/**
* <p>Abstract AbstractPostOperation class.</p>
*/
public abstract class AbstractPostTaxonOperation extends AbstractPostOperation<Taxon> {
- /**
- * A reference to the taxons TaxonNode
- */
- protected ITaxonTreeNode taxonNode;
-
- protected UUID parentNodeUuid;
-
-
- /**
- * <p>Constructor for AbstractPostOperation.</p>
- *
- * @param label a {@link java.lang.String} object.
- * @param undoContext a {@link org.eclipse.core.commands.operations.IUndoContext} object.
- * @param taxon a {@link eu.etaxonomy.cdm.model.taxon.Taxon} object.
- * @param postOperationEnabled a {@link eu.etaxonomy.taxeditor.operation.IPostOperationEnabled} object.
- */
- public AbstractPostTaxonOperation(String label, IUndoContext undoContext,
- Taxon taxon, IPostOperationEnabled postOperationEnabled) {
- super(label, undoContext, taxon, postOperationEnabled);
- }
-
- /**
- * <p>Constructor for AbstractPostOperation.</p>
- *
- * @param label a {@link java.lang.String} object.
- * @param undoContext a {@link org.eclipse.core.commands.operations.IUndoContext} object.
- * @param taxonNode a {@link eu.etaxonomy.cdm.model.taxon.TaxonNode} object.
- * @param postOperationEnabled a {@link eu.etaxonomy.taxeditor.operation.IPostOperationEnabled} object.
- */
- public AbstractPostTaxonOperation(String label, IUndoContext undoContext, TaxonNode taxonNode, IPostOperationEnabled postOperationEnabled){
- this(label, undoContext, taxonNode.getTaxon(), postOperationEnabled);
- this.taxonNode = taxonNode;
- }
-
- /**
- * <p>Constructor for AbstractPostOperation.</p>
- *
- * @param label a {@link java.lang.String} object.
- * @param undoContext a {@link org.eclipse.core.commands.operations.IUndoContext} object.
- * @param parentNodeUuid a {@link java.util.UUID} object.
- * @param postOperationEnabled a {@link eu.etaxonomy.taxeditor.operation.IPostOperationEnabled} object.
- */
- public AbstractPostTaxonOperation(String label, IUndoContext undoContext, UUID parentNodeUuid, IPostOperationEnabled postOperationEnabled){
- super(label, undoContext, null, postOperationEnabled);
- this.parentNodeUuid = parentNodeUuid;
- }
-
- /**
- * <p>Constructor for AbstractPostOperation.</p>
- *
- * @param label a {@link java.lang.String} object.
- * @param undoContext a {@link org.eclipse.core.commands.operations.IUndoContext} object.
- * @param postOperationEnabled a {@link eu.etaxonomy.taxeditor.operation.IPostOperationEnabled} object.
- */
- public AbstractPostTaxonOperation(String label, IUndoContext undoContext,
- IPostOperationEnabled postOperationEnabled) {
- super(label, undoContext, null, postOperationEnabled);
- }
+ /**
+ * A reference to the taxons TaxonNode
+ */
+ protected ITaxonTreeNode taxonNode;
+
+ protected UUID parentNodeUuid;
+
+
+ /**
+ * <p>Constructor for AbstractPostOperation.</p>
+ *
+ * @param label a {@link java.lang.String} object.
+ * @param undoContext a {@link org.eclipse.core.commands.operations.IUndoContext} object.
+ * @param taxon a {@link eu.etaxonomy.cdm.model.taxon.Taxon} object.
+ * @param postOperationEnabled a {@link eu.etaxonomy.taxeditor.operation.IPostOperationEnabled} object.
+ */
+ public AbstractPostTaxonOperation(String label, IUndoContext undoContext,
+ Taxon taxon, IPostOperationEnabled postOperationEnabled) {
+ super(label, undoContext, taxon, postOperationEnabled, null);
+ }
+
+ public AbstractPostTaxonOperation(String label, IUndoContext undoContext,
+ Taxon taxon, IPostOperationEnabled postOperationEnabled, ICdmEntitySessionEnabled cdmEntitySessionEnabled) {
+ super(label, undoContext, taxon, postOperationEnabled, cdmEntitySessionEnabled);
+ }
+
+ /**
+ * <p>Constructor for AbstractPostOperation.</p>
+ *
+ * @param label a {@link java.lang.String} object.
+ * @param undoContext a {@link org.eclipse.core.commands.operations.IUndoContext} object.
+ * @param taxonNode a {@link eu.etaxonomy.cdm.model.taxon.TaxonNode} object.
+ * @param postOperationEnabled a {@link eu.etaxonomy.taxeditor.operation.IPostOperationEnabled} object.
+ */
+ public AbstractPostTaxonOperation(String label, IUndoContext undoContext, TaxonNode taxonNode, IPostOperationEnabled postOperationEnabled){
+ this(label, undoContext, taxonNode, postOperationEnabled, null);
+ }
+
+ public AbstractPostTaxonOperation(String label, IUndoContext undoContext, TaxonNode taxonNode, IPostOperationEnabled postOperationEnabled, ICdmEntitySessionEnabled cdmEntitySessionEnabled){
+ this(label, undoContext, taxonNode.getTaxon(), postOperationEnabled, cdmEntitySessionEnabled);
+ this.taxonNode = taxonNode;
+ }
+
+ /**
+ * <p>Constructor for AbstractPostOperation.</p>
+ *
+ * @param label a {@link java.lang.String} object.
+ * @param undoContext a {@link org.eclipse.core.commands.operations.IUndoContext} object.
+ * @param parentNodeUuid a {@link java.util.UUID} object.
+ * @param postOperationEnabled a {@link eu.etaxonomy.taxeditor.operation.IPostOperationEnabled} object.
+ */
+ public AbstractPostTaxonOperation(String label, IUndoContext undoContext, UUID parentNodeUuid, IPostOperationEnabled postOperationEnabled){
+ super(label, undoContext, null, postOperationEnabled, null);
+ this.parentNodeUuid = parentNodeUuid;
+ }
+
+ /**
+ * <p>Constructor for AbstractPostOperation.</p>
+ *
+ * @param label a {@link java.lang.String} object.
+ * @param undoContext a {@link org.eclipse.core.commands.operations.IUndoContext} object.
+ * @param postOperationEnabled a {@link eu.etaxonomy.taxeditor.operation.IPostOperationEnabled} object.
+ */
+ public AbstractPostTaxonOperation(String label, IUndoContext undoContext,
+ IPostOperationEnabled postOperationEnabled) {
+ super(label, undoContext, null, postOperationEnabled, null);
+ }
+
+ public AbstractPostTaxonOperation(String label, IUndoContext undoContext,
+ IPostOperationEnabled postOperationEnabled, ICdmEntitySessionEnabled cdmEntitySessionEnabled) {
+ super(label, undoContext, null, postOperationEnabled, cdmEntitySessionEnabled);
+ }
/**
* @param text
* @param unparsedNameString a {@link java.lang.String} object.
* @return a {@link eu.etaxonomy.cdm.model.name.TaxonNameBase} object.
*/
- public static TaxonNameBase parseReferencedName(String unparsedNameString, Rank rank){
- TaxonNameBase name = nonViralNameParser.parseReferencedName(unparsedNameString,
+ public static NonViralName parseReferencedName(String unparsedNameString, Rank rank){
+ NonViralName name = nonViralNameParser.parseReferencedName(unparsedNameString,
PreferencesUtil.getPreferredNomenclaturalCode(), rank);
// if (name.hasProblem()) {
return name;
}
- public static TaxonNameBase parseName(String unparsedNameString, Rank rank){
- TaxonNameBase name = nonViralNameParser.parseFullName(unparsedNameString,
+ public static NonViralName parseName(String unparsedNameString, Rank rank){
+ NonViralName name = nonViralNameParser.parseFullName(unparsedNameString,
PreferencesUtil.getPreferredNomenclaturalCode(), rank);
return name;
*
* @return a {@link eu.etaxonomy.cdm.model.name.TaxonNameBase} object.
*/
- public static TaxonNameBase createEmptyName(){
+ public static NonViralName createEmptyName(){
return nonViralNameParser.getNonViralNameInstance("", PreferencesUtil.getPreferredNomenclaturalCode());
}
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
-
-import eu.etaxonomy.cdm.api.application.CdmApplicationRemoteConfiguration;
import eu.etaxonomy.cdm.api.application.CdmApplicationRemoteController;
import eu.etaxonomy.cdm.api.application.ICdmApplicationConfiguration;
import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
import eu.etaxonomy.taxeditor.model.AbstractUtility;
import eu.etaxonomy.taxeditor.model.MessagingUtils;
import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
-
+import eu.etaxonomy.taxeditor.remoting.cache.CdmRemoteCacheManager;
import eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager;
import eu.etaxonomy.taxeditor.session.mock.MockCdmEntitySessionManager;
import eu.etaxonomy.taxeditor.store.internal.TaxeditorStorePlugin;
private ICdmSource cdmSource;
private boolean isConnected;
-
+
/**
ICdmSource cdmSource;
try {
+
cdmSource = CdmDataSourceRepository.getCurrentCdmSource();
connect(cdmSource);
} catch (Exception e) {
private static void connect(final ICdmSource cdmSource,
final DbSchemaValidation dbSchemaValidation,
final Resource applicationContextBean) {
+ if(isActive()) {
+ // before we connect we clear the caches and the sessions
+ CdmRemoteCacheManager.getInstance().getDefaultCacheManager().removalAll();
+ if(getCurrentSessionManager() != null) {
+ getCurrentSessionManager().disposeAll();
+ }
+ }
MessagingUtils.info("Connecting to datasource: " + cdmSource);
job = new CdmStoreConnector(Display.getDefault(), cdmSource,
}
return conversation;
}
-
+
//FIXME:Remoting should be removed after moving completely to remoting
private MockCdmEntitySessionManager mockCdmEntitySessionManager;
-
+
private ICdmEntitySessionManager getSessionManager() {
//FIXME:Remoting we should only have CdmApplicationRemoteConfiguration after move to remoting
// bad hack which should be finally removed
if(mockCdmEntitySessionManager == null) {
mockCdmEntitySessionManager = new MockCdmEntitySessionManager();
}
- return mockCdmEntitySessionManager;
+ return mockCdmEntitySessionManager;
}
}
-
+
public static ICdmEntitySessionManager getCurrentSessionManager() {
if (getDefault() != null) {
return getDefault().getSessionManager();
// $Id$
/**
-* Copyright (C) 2015 EDIT
-* European Distributed Institute of Taxonomy
-* http://www.e-taxonomy.eu
-*
-* The contents of this file are subject to the Mozilla Public License Version 1.1
-* See LICENSE.TXT at the top of this package for the full license terms.
-*/
+ * Copyright (C) 2015 EDIT
+ * European Distributed Institute of Taxonomy
+ * http://www.e-taxonomy.eu
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * See LICENSE.TXT at the top of this package for the full license terms.
+ */
package eu.etaxonomy.taxeditor.view.sessions;
import java.util.List;
import net.sf.ehcache.Cache;
import net.sf.ehcache.Element;
+import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.StyledCellLabelProvider;
import org.eclipse.jface.viewers.StyledString;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
-import org.eclipse.swt.widgets.Tree;
+import org.eclipse.ui.dialogs.FilteredTree;
+import org.eclipse.ui.dialogs.PatternFilter;
import org.eclipse.wb.swt.SWTResourceManager;
import eu.etaxonomy.taxeditor.remoting.cache.CdmModelFieldPropertyFromClass;
sashForm = new SashForm(shlInspectSessions, SWT.VERTICAL);
sashForm.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
- treeViewer = new TreeViewer(sashForm, SWT.BORDER);
- Tree tree = treeViewer.getTree();
+ PatternFilter filter = new PatternFilter();
+ FilteredTree tree = new FilteredTree(sashForm, SWT.MULTI | SWT.H_SCROLL | SWT.BORDER
+ | SWT.V_SCROLL, filter, true);
+ treeViewer = tree.getViewer();
+ //treeViewer = new TreeViewer(sashForm, SWT.BORDER);
+ //Tree tree = treeViewer.getTree();
- compositeDebug = new Composite(sashForm, SWT.NONE);
- compositeDebug.setLayout(new GridLayout(1, false));
+ compositeDebug = new Composite(sashForm, SWT.NONE);
+ compositeDebug.setLayout(new GridLayout(1, false));
- lblDebugInformation = new Label(compositeDebug, SWT.NONE);
- lblDebugInformation.setAlignment(SWT.CENTER);
- lblDebugInformation.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, true, false, 1, 1));
- lblDebugInformation.setFont(SWTResourceManager.getFont("Ubuntu", 10, SWT.NORMAL));
- lblDebugInformation.setText("Debug Information");
+ lblDebugInformation = new Label(compositeDebug, SWT.NONE);
+ lblDebugInformation.setAlignment(SWT.CENTER);
+ lblDebugInformation.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, true, false, 1, 1));
+ lblDebugInformation.setFont(SWTResourceManager.getFont("Ubuntu", 10, SWT.NORMAL));
+ lblDebugInformation.setText("Debug Information");
- txtDebugInfo = new Text(compositeDebug, SWT.BORDER | SWT.READ_ONLY | SWT.H_SCROLL | SWT.V_SCROLL | SWT.CANCEL | SWT.MULTI);
- txtDebugInfo.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
- sashForm.setWeights(new int[] {338, 184});
+ txtDebugInfo = new Text(compositeDebug, SWT.BORDER | SWT.READ_ONLY | SWT.H_SCROLL | SWT.V_SCROLL | SWT.CANCEL | SWT.MULTI);
+ txtDebugInfo.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
+ sashForm.setWeights(new int[] {338, 184});
btnClose = new Button(shlInspectSessions, SWT.NONE);
btnClose.addSelectionListener(new SelectionAdapter() {
}
- class SessionsTreeLabelProvider extends StyledCellLabelProvider {
+ class SessionsTreeLabelProvider extends StyledCellLabelProvider implements ILabelProvider {
@Override
public void update(ViewerCell cell) {
cell.setStyleRanges(text.getStyleRanges());
super.update(cell);
}
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object)
+ */
+ @Override
+ public Image getImage(Object element) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
+ */
+ @Override
+ public String getText(Object element) {
+ CdmEntityInfo cei = (CdmEntityInfo)element;
+ return cei.getLabel();
+ }
}
}
// $Id$
/**
* Copyright (C) 2007 EDIT
-* European Distributed Institute of Taxonomy
+* European Distributed Institute of Taxonomy
* http://www.e-taxonomy.eu
-*
+*
* The contents of this file are subject to the Mozilla Public License Version 1.1
* See LICENSE.TXT at the top of this package for the full license terms.
*/
import eu.etaxonomy.cdm.model.taxon.Taxon;
import eu.etaxonomy.taxeditor.operation.AbstractPostOperation;
import eu.etaxonomy.taxeditor.operation.IPostOperationEnabled;
+import eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled;
/**
* @author n.hoffmann
* @version 1.0
*/
public abstract class AbstractTaxeditorOperationTestBase {
-
+
public static final IUndoContext undoContext = null;
-
+
public static final IProgressMonitor monitor = null;
- public static final IAdaptable info = null;
+ public static final IAdaptable info = null;
public static final IPostOperationEnabled postOperation = null;
-
+ public static final ICdmEntitySessionEnabled cdmEntitySessionEnabled = null;
+
protected static AbstractPostOperation operation;
protected static Taxon taxon;
}