Use alias path as key to manage connectors.
authorBruno Sinou <bsinou@argeo.org>
Fri, 15 Nov 2013 12:06:03 +0000 (12:06 +0000)
committerBruno Sinou <bsinou@argeo.org>
Fri, 15 Nov 2013 12:06:03 +0000 (12:06 +0000)
git-svn-id: https://svn.argeo.org/slc/trunk@6615 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/commands/DeleteAkbNodes.java
plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/composites/ConnectorAliasSmallComposite.java
plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/composites/ItemTemplateTitleComposite.java
plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/editors/EnvTemplateEditor.java
plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/editors/JdbcTestPage.java
plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/providers/TemplatesTreeContentProvider.java
runtime/org.argeo.slc.akb/src/main/java/org/argeo/slc/akb/AkbNames.java
runtime/org.argeo.slc.akb/src/main/java/org/argeo/slc/akb/AkbService.java
runtime/org.argeo.slc.akb/src/main/java/org/argeo/slc/akb/core/AkbServiceImpl.java
runtime/org.argeo.slc.akb/src/main/resources/org/argeo/slc/akb/akb.cnd

index 2faafa38b7ba88937d1ff8893058afffd5950437..76d8cdb5085c3ce5180c061833d1334bb1b3463f 100644 (file)
@@ -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();
                                }
index 3c0726face0eeabc7422f3db16997375ec3a9e20..8717df5b51a4a146f9ce6baed746e81f6512dc41 100644 (file)
@@ -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);
        }
 
index d52b6ed1a76e92c00c5afced4a6ae9a17377eb6b..0c21c7e7cef557c86dc45286eecfdd404a2bc356 100644 (file)
@@ -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) {
index c7908f5fbaaa1805452cf8b4ff1e83b3945cf1a0..577c9d9e7cfac583cce2843f3dba681908279042 100644 (file)
@@ -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<Event> events)
                                throws RepositoryException {
                        try {
-                               formPart.refresh();
+                               for (IFormPart part : managedForm.getParts())
+                                       part.refresh();
                        } catch (Exception e) {
                                // silently fail
                                e.printStackTrace();
index c9f74b0a52603effc2059ef02d07880b400d46bb..b988335edb1a63122fc6b60fd5e7b52692311a15 100644 (file)
@@ -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
                }
index e35302864bb041c85f8dabbfe184b314bb8d5a3e..14a8a63d008b89cec59b22d0c63ffa84af9daca4 100644 (file)
@@ -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);
                }
index 7be2b114823c46a2424f89cb6f82a1fa8fb6a843..db52ca7bc826d4986f365e7913fdda23f3427188 100644 (file)
@@ -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";
index 5c806d1591bcfd823a4ee9ca442f47a2c956fb9e..1f5d998c6483cbcc8230cc25af8648b1bc17da6e 100644 (file)
@@ -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;
 
        /**
index 0bb86c103e08c4f3162b97471acb2d1a7cbf21a2..b28437028384e27ea9877f3b7bc59f92ee4ab2b4 100644 (file)
@@ -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
index 25c4e726a1377bf430e97000f6a5a0050e28359f..cf1960d64ddd2a1706fa18660c66cfd4c2f8326d 100644 (file)
@@ -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