From 11f74d096c83b5a40bfc438266c8fe3ae318c8d7 Mon Sep 17 00:00:00 2001 From: Bruno Sinou Date: Fri, 15 Nov 2013 12:06:03 +0000 Subject: [PATCH] Use alias path as key to manage connectors. git-svn-id: https://svn.argeo.org/slc/trunk@6615 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- .../slc/akb/ui/commands/DeleteAkbNodes.java | 12 ++++----- .../ConnectorAliasSmallComposite.java | 25 ++++++++++++++----- .../ItemTemplateTitleComposite.java | 9 ++++--- .../slc/akb/ui/editors/EnvTemplateEditor.java | 12 +++++---- .../slc/akb/ui/editors/JdbcTestPage.java | 6 +++-- .../TemplatesTreeContentProvider.java | 16 ++++++++++++ .../main/java/org/argeo/slc/akb/AkbNames.java | 2 +- .../java/org/argeo/slc/akb/AkbService.java | 9 ++++--- .../argeo/slc/akb/core/AkbServiceImpl.java | 18 ++++++------- .../main/resources/org/argeo/slc/akb/akb.cnd | 4 +-- 10 files changed, 74 insertions(+), 39 deletions(-) diff --git a/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/commands/DeleteAkbNodes.java b/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/commands/DeleteAkbNodes.java index 2faafa38b..76d8cdb50 100644 --- a/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/commands/DeleteAkbNodes.java +++ b/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/commands/DeleteAkbNodes.java @@ -51,18 +51,18 @@ public class DeleteAkbNodes extends AbstractHandler { // We must be in a template to delete nodes... Node template = AkbJcrUtils.getCurrentTemplate(node); - IEditorPart currPart = currentPage - .findEditor(new AkbNodeEditorInput( - template.getIdentifier(), nodeJcrId)); - if (currPart != null) - currPart.dispose(); - if (node != null) { Boolean ok = MessageDialog.openConfirm( HandlerUtil.getActiveShell(event), "Confirm deletion", "Do you want to delete this item?"); if (ok) { + IEditorPart currPart = currentPage + .findEditor(new AkbNodeEditorInput(template + .getIdentifier(), nodeJcrId)); + if (currPart != null) + currentPage.closeEditor(currPart, false); + node.remove(); session.save(); } diff --git a/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/composites/ConnectorAliasSmallComposite.java b/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/composites/ConnectorAliasSmallComposite.java index 3c0726fac..8717df5b5 100644 --- a/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/composites/ConnectorAliasSmallComposite.java +++ b/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/composites/ConnectorAliasSmallComposite.java @@ -3,6 +3,7 @@ package org.argeo.slc.akb.ui.composites; import javax.jcr.Node; import javax.jcr.Property; import javax.jcr.RepositoryException; +import javax.jcr.Session; import org.argeo.eclipse.ui.ErrorFeedback; import org.argeo.eclipse.ui.utils.CommandUtils; @@ -170,14 +171,26 @@ public class ConnectorAliasSmallComposite extends Composite { removeBtn.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { - CommandUtils.CallCommandWithOneParameter(DeleteAkbNodes.ID, - DeleteAkbNodes.PARAM_NODE_JCR_ID, - AkbJcrUtils.getIdentifierQuietly(connectorAlias)); - // for (IFormPart part : form.getParts()) - // if (!formPart.equals(part)) - // part.refresh(); + try { + // Manually check if corresponding node was really removed + Session session = connectorAlias.getSession(); + String absPath = connectorAlias.getPath(); + + CommandUtils.CallCommandWithOneParameter(DeleteAkbNodes.ID, + DeleteAkbNodes.PARAM_NODE_JCR_ID, + AkbJcrUtils.getIdentifierQuietly(connectorAlias)); + + if (!session.nodeExists(absPath)) + form.removePart(formPart); + + } catch (RepositoryException re) { + throw new AkbException( + "Error while removing connector Alias ", re); + } } }); + // force refresh to initialize various fields on creation + formPart.refresh(); form.addPart(formPart); } diff --git a/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/composites/ItemTemplateTitleComposite.java b/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/composites/ItemTemplateTitleComposite.java index d52b6ed1a..0c21c7e7c 100644 --- a/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/composites/ItemTemplateTitleComposite.java +++ b/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/composites/ItemTemplateTitleComposite.java @@ -160,8 +160,8 @@ public class ItemTemplateTitleComposite extends Composite { Node newAlias = definedAliases.get(selIndex); // Only relies on the alias - itemNode.setProperty(AkbNames.AKB_USED_CONNECTOR, newAlias - .getProperty(Property.JCR_TITLE).getString()); + itemNode.setProperty(AkbNames.AKB_USED_CONNECTOR, + newAlias.getPath()); part.markDirty(); } catch (RepositoryException e) { throw new AkbException( @@ -217,9 +217,10 @@ public class ItemTemplateTitleComposite extends Composite { private int getCurrAliasIndex() { try { if (itemNode.hasProperty(AkbNames.AKB_USED_CONNECTOR)) { - String aliasName = itemNode.getProperty( + String aliasPath = itemNode.getProperty( AkbNames.AKB_USED_CONNECTOR).getString(); - return aliasCmb.indexOf(aliasName); + Node alias = itemNode.getSession().getNode(aliasPath); + return aliasCmb.indexOf(alias.getProperty(Property.JCR_TITLE).getString()); } else return -1; } catch (RepositoryException re) { diff --git a/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/editors/EnvTemplateEditor.java b/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/editors/EnvTemplateEditor.java index c7908f5fb..577c9d9e7 100644 --- a/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/editors/EnvTemplateEditor.java +++ b/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/editors/EnvTemplateEditor.java @@ -33,6 +33,7 @@ import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Menu; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.forms.AbstractFormPart; +import org.eclipse.ui.forms.IFormPart; import org.eclipse.ui.forms.IManagedForm; /** @@ -181,7 +182,7 @@ public class EnvTemplateEditor extends AbstractAkbNodeEditor { ObservationManager observationManager = getSession().getWorkspace() .getObservationManager(); connectorObserver = new ConnectorObserver(panel.getDisplay(), - formPart); + managedForm); // observe tree changes under All results observationManager.addEventListener(connectorObserver, Event.NODE_ADDED | Event.NODE_REMOVED, getAkbNode() @@ -195,11 +196,11 @@ public class EnvTemplateEditor extends AbstractAkbNodeEditor { class ConnectorObserver extends AsyncUiEventListener { - private AbstractFormPart formPart; + private IManagedForm managedForm; - public ConnectorObserver(Display display, AbstractFormPart formPart) { + public ConnectorObserver(Display display, IManagedForm managedForm) { super(display); - this.formPart = formPart; + this.managedForm = managedForm; } @Override @@ -211,7 +212,8 @@ public class EnvTemplateEditor extends AbstractAkbNodeEditor { protected void onEventInUiThread(List events) throws RepositoryException { try { - formPart.refresh(); + for (IFormPart part : managedForm.getParts()) + part.refresh(); } catch (Exception e) { // silently fail e.printStackTrace(); diff --git a/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/editors/JdbcTestPage.java b/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/editors/JdbcTestPage.java index c9f74b0a5..b988335ed 100644 --- a/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/editors/JdbcTestPage.java +++ b/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/editors/JdbcTestPage.java @@ -97,8 +97,10 @@ public class JdbcTestPage extends FormPage implements AkbNames { @Override public void dispose() { try { - statement.close(); - statement.getConnection().close(); + if (statement != null) { + statement.close(); + statement.getConnection().close(); + } } catch (SQLException e) { // silent } diff --git a/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/providers/TemplatesTreeContentProvider.java b/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/providers/TemplatesTreeContentProvider.java index e35302864..14a8a63d0 100644 --- a/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/providers/TemplatesTreeContentProvider.java +++ b/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/providers/TemplatesTreeContentProvider.java @@ -22,6 +22,8 @@ import javax.jcr.Node; import javax.jcr.NodeIterator; import javax.jcr.RepositoryException; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.argeo.slc.akb.AkbException; import org.argeo.slc.akb.AkbTypes; import org.eclipse.jface.viewers.ITreeContentProvider; @@ -29,6 +31,8 @@ import org.eclipse.jface.viewers.Viewer; /** Basic content provider for a tree of AKB environment templates */ public class TemplatesTreeContentProvider implements ITreeContentProvider { + private final static Log log = LogFactory + .getLog(TemplatesTreeContentProvider.class); /** * @param parent @@ -45,10 +49,22 @@ public class TemplatesTreeContentProvider implements ITreeContentProvider { public Object getParent(Object child) { try { Node node = (Node) child; + + // Manual sanity check to avoid exception when tryin to refresh an + // element that displays a node which has been removed + try { + String id = node.getIdentifier(); + node.getSession().getNodeByIdentifier(id); + } catch (Exception e) { + log.warn("Trying to refresh an unexisting node"); + return null; + } + if (node.getDepth() == 0) return null; else return node.getParent(); + } catch (RepositoryException e) { throw new AkbException("Error while getting parent node", e); } diff --git a/runtime/org.argeo.slc.akb/src/main/java/org/argeo/slc/akb/AkbNames.java b/runtime/org.argeo.slc.akb/src/main/java/org/argeo/slc/akb/AkbNames.java index 7be2b1148..db52ca7bc 100644 --- a/runtime/org.argeo.slc.akb/src/main/java/org/argeo/slc/akb/AkbNames.java +++ b/runtime/org.argeo.slc.akb/src/main/java/org/argeo/slc/akb/AkbNames.java @@ -17,7 +17,7 @@ public interface AkbNames { /* CONNECTOR PROPERTIES */ public final static String AKB_CONNECTOR_URL = "akb:connectorUrl"; - public final static String AKB_CONNECTOR_ALIAS_NAME = "akb:connectorName"; + public final static String AKB_CONNECTOR_ALIAS_PATH = "akb:connectorAliasPath"; public final static String AKB_CONNECTOR_USER = "akb:connectorUser"; // Alias specific public final static String AKB_DEFAULT_TEST_CONNECTOR = "defaultTestConnector"; diff --git a/runtime/org.argeo.slc.akb/src/main/java/org/argeo/slc/akb/AkbService.java b/runtime/org.argeo.slc.akb/src/main/java/org/argeo/slc/akb/AkbService.java index 5c806d159..1f5d998c6 100644 --- a/runtime/org.argeo.slc.akb/src/main/java/org/argeo/slc/akb/AkbService.java +++ b/runtime/org.argeo.slc.akb/src/main/java/org/argeo/slc/akb/AkbService.java @@ -30,12 +30,13 @@ public interface AkbService { /** * @param envNode * an environment or a template - * @param aliasName - * the alias of the node to get - * @return + * @param aliasPath + * the path of the parent alias in the corresponding template + * environment used as key + * @return the corresponding active connector if found * @throws RepositoryException */ - public Node getConnectorByAlias(Node envNode, String aliasName) + public Node getActiveConnectorByAlias(Node envNode, String aliasPath) throws RepositoryException; /** diff --git a/runtime/org.argeo.slc.akb/src/main/java/org/argeo/slc/akb/core/AkbServiceImpl.java b/runtime/org.argeo.slc.akb/src/main/java/org/argeo/slc/akb/core/AkbServiceImpl.java index 0bb86c103..b28437028 100644 --- a/runtime/org.argeo.slc.akb/src/main/java/org/argeo/slc/akb/core/AkbServiceImpl.java +++ b/runtime/org.argeo.slc.akb/src/main/java/org/argeo/slc/akb/core/AkbServiceImpl.java @@ -139,7 +139,7 @@ public class AkbServiceImpl implements AkbService, AkbNames { // Node defaultConnector = Node defaultConn = newConnector.addNode( AkbNames.AKB_DEFAULT_TEST_CONNECTOR, connectorType); - defaultConn.setProperty(AkbNames.AKB_CONNECTOR_ALIAS_NAME, name); + defaultConn.setProperty(AkbNames.AKB_CONNECTOR_ALIAS_PATH, newConnector.getPath()); return newConnector; } @@ -184,7 +184,7 @@ public class AkbServiceImpl implements AkbService, AkbNames { } @Override - public Node getConnectorByAlias(Node envNode, String aliasName) + public Node getActiveConnectorByAlias(Node envNode, String aliasPath) throws RepositoryException { try { Session session = envNode.getSession(); @@ -199,10 +199,10 @@ public class AkbServiceImpl implements AkbService, AkbNames { Constraint connType = factory.comparison( factory.propertyValue(source.getSelectorName(), - AkbNames.AKB_CONNECTOR_ALIAS_NAME), + AkbNames.AKB_CONNECTOR_ALIAS_PATH), QueryObjectModelConstants.JCR_OPERATOR_EQUAL_TO, factory .literal(session.getValueFactory().createValue( - aliasName))); + aliasPath))); defaultC = factory.and(defaultC, connType); QueryObjectModel query; @@ -216,13 +216,13 @@ public class AkbServiceImpl implements AkbService, AkbNames { Node connector = ni.nextNode(); if (ni.hasNext()) throw new AkbException("More than one alias with name " - + aliasName + " has been defined for environment " + + aliasPath + " has been defined for environment " + envNode); else return connector; } } catch (RepositoryException e) { - throw new AkbException("Unable to get connector " + aliasName + throw new AkbException("Unable to get connector " + aliasPath + " in " + envNode, e); } } @@ -289,7 +289,7 @@ public class AkbServiceImpl implements AkbService, AkbNames { if (activeEnv == null) { activeEnv = AkbJcrUtils.getCurrentTemplate(node); } - Node connectorNode = getConnectorByAlias(activeEnv, + Node connectorNode = getActiveConnectorByAlias(activeEnv, connectorAliasStr); String sqlQuery = node.getProperty(AKB_QUERY_TEXT).getString(); @@ -332,7 +332,7 @@ public class AkbServiceImpl implements AkbService, AkbNames { if (activeEnv == null) { activeEnv = AkbJcrUtils.getCurrentTemplate(node); } - Node connectorNode = getConnectorByAlias(activeEnv, + Node connectorNode = getActiveConnectorByAlias(activeEnv, connectorAliasStr); String command = node.getProperty(AkbNames.AKB_COMMAND_TEXT) .getString(); @@ -392,7 +392,7 @@ public class AkbServiceImpl implements AkbService, AkbNames { if (activeEnv == null) { activeEnv = AkbJcrUtils.getCurrentTemplate(node); } - Node connectorNode = getConnectorByAlias(activeEnv, + Node connectorNode = getActiveConnectorByAlias(activeEnv, connectorAliasStr); // TODO do a proper scp diff --git a/runtime/org.argeo.slc.akb/src/main/resources/org/argeo/slc/akb/akb.cnd b/runtime/org.argeo.slc.akb/src/main/resources/org/argeo/slc/akb/akb.cnd index 25c4e726a..cf1960d64 100644 --- a/runtime/org.argeo.slc.akb/src/main/resources/org/argeo/slc/akb/akb.cnd +++ b/runtime/org.argeo.slc.akb/src/main/resources/org/argeo/slc/akb/akb.cnd @@ -25,8 +25,8 @@ mixin // GENERIC TYPE FOR A CONNECTOR [akb:connector] > nt:unstructured, mix:title - akb:connectorUrl (STRING) -// the name of the corresponding alias. We assume it is unique. -- akb:connectorName (STRING) +// the path to the corresponding alias +- akb:connectorAliasPath (STRING) // add argeo keyring -- 2.39.2