First unfinished drafts for items editors
authorBruno Sinou <bsinou@argeo.org>
Sat, 9 Nov 2013 17:53:53 +0000 (17:53 +0000)
committerBruno Sinou <bsinou@argeo.org>
Sat, 9 Nov 2013 17:53:53 +0000 (17:53 +0000)
git-svn-id: https://svn.argeo.org/slc/trunk@6608 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

17 files changed:
plugins/org.argeo.slc.akb.ui/META-INF/spring/editors.xml
plugins/org.argeo.slc.akb.ui/plugin.xml
plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/AkbUiUtils.java
plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/commands/OpenAkbNodeEditor.java
plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/composites/ItemTemplateTitleComposite.java [new file with mode: 0644]
plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/composites/MixTitleComposite.java
plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/dialogs/AddItemDialog.java [new file with mode: 0644]
plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/editors/AbstractAkbNodeEditor.java
plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/editors/AkbConnectorAliasEditor.java [deleted file]
plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/editors/AkbEnvTemplateEditor.java [deleted file]
plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/editors/AkbItemTemplateEditor.java [new file with mode: 0644]
plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/editors/ConnectorAliasEditor.java [new file with mode: 0644]
plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/editors/EnvTemplateEditor.java [new file with mode: 0644]
plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/editors/JdbcQueryTemplateEditor.java [new file with mode: 0644]
plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/editors/SshCommandTemplateEditor.java [new file with mode: 0644]
plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/editors/SshFileTemplateEditor.java [new file with mode: 0644]
runtime/org.argeo.slc.akb/src/main/java/org/argeo/slc/akb/utils/AkbJcrUtils.java

index d9617fe698ff3067fa2c4413075931b2b945201e..52d1340188a650f1ca8a4540751640775702bbc1 100644 (file)
@@ -3,13 +3,28 @@
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
         http://www.springframework.org/schema/beans/spring-beans.xsd">
-       <bean id="akbEnvTemplateEditor" class="org.argeo.slc.akb.ui.editors.AkbEnvTemplateEditor"
+       <bean id="envTemplateEditor" class="org.argeo.slc.akb.ui.editors.EnvTemplateEditor"
                scope="prototype">
                <property name="repository" ref="repository" />
        </bean>
-       <bean id="akbConnectorAliasEditor" class="org.argeo.slc.akb.ui.editors.AkbConnectorAliasEditor"
+
+       <bean id="connectorAliasEditor" class="org.argeo.slc.akb.ui.editors.ConnectorAliasEditor"
                scope="prototype">
                <property name="repository" ref="repository" />
                <property name="akbService" ref="akbService" />
        </bean>
+
+       <!-- Various Items editors -->
+       <bean id="jdbcQueryTemplateEditor" class="org.argeo.slc.akb.ui.editors.JdbcQueryTemplateEditor"
+               scope="prototype">
+               <property name="repository" ref="repository" />
+       </bean>
+       <bean id="sshCommandTemplateEditor" class="org.argeo.slc.akb.ui.editors.SshCommandTemplateEditor"
+               scope="prototype">
+               <property name="repository" ref="repository" />
+       </bean>
+       <bean id="sshFileTemplateEditor" class="org.argeo.slc.akb.ui.editors.SshFileTemplateEditor"
+               scope="prototype">
+               <property name="repository" ref="repository" />
+       </bean>
 </beans>
\ No newline at end of file
index be04cd2f5a561c74ae5a385443b9a8d2dd4c6d3a..ab27bc70c9953115385adbe612a4c80697bed8de 100644 (file)
                <editor
                        class="org.argeo.eclipse.spring.SpringExtensionFactory"
                        icon="icons/akb.png"
-                       id="org.argeo.slc.akb.ui.akbConnectorAliasEditor"
+                       id="org.argeo.slc.akb.ui.envTemplateEditor"
+                       name="Environment Template Editor">
+               </editor>
+               <editor
+                       class="org.argeo.eclipse.spring.SpringExtensionFactory"
+                       icon="icons/akb.png"
+                       id="org.argeo.slc.akb.ui.connectorAliasEditor"
                        name="Connector Alias Editor">
                </editor>
+               <!-- ITEMS EDITORS --> 
                <editor
                        class="org.argeo.eclipse.spring.SpringExtensionFactory"
                        icon="icons/akb.png"
-                       id="org.argeo.slc.akb.ui.akbEnvTemplateEditor"
-                       name="Environment Template Editor">
+                       id="org.argeo.slc.akb.ui.jdbcQueryTemplateEditor"
+                       name="JDBC Query Template Editor">
+               </editor>
+               <editor
+                       class="org.argeo.eclipse.spring.SpringExtensionFactory"
+                       icon="icons/akb.png"
+                       id="org.argeo.slc.akb.ui.sshFileTemplateEditor"
+                       name="SSH File Template Editor">
+               </editor>
+               <editor
+                       class="org.argeo.eclipse.spring.SpringExtensionFactory"
+                       icon="icons/akb.png"
+                       id="org.argeo.slc.akb.ui.sshCommandTemplateEditor"
+                       name="SSH Command Template Editor">
                </editor>
-               
        </extension>
        <!-- Commands -->
        <extension
index c79b9378d128da8704865bef9929e35d9d27bc66..38ddcbffebbfa9d1a639e57f0b420c042393379c 100644 (file)
@@ -51,6 +51,19 @@ public class AkbUiUtils {
                text.setEnabled(AkbJcrUtils.isNodeCheckedOutByMe(entity));
                return tmpStr;
        }
+       
+       
+       /**
+        * Shortcut to refresh a <code>Text</code> widget given a Node in a form and
+        * a property Name. Also manages its enable state and set a default message if corresponding Text value is empty 
+        */
+       public static String refreshFormTextWidget(Text text, Node entity,
+                       String propName, String defaultMsg) {
+               String tmpStr = refreshFormTextWidget(text, entity, propName);
+               if (AkbJcrUtils.isEmptyString(tmpStr) && AkbJcrUtils.checkNotEmptyString(defaultMsg))
+                       text.setMessage(defaultMsg);
+               return tmpStr;
+       }
 
        /**
         * Shortcut to refresh a Check box <code>Button</code> widget given a Node
index c77565d423c9d7f98bbd18ec37ce49cae9b79b14..527033e191aa0750ba9a4b2ad80433202d5d8ef8 100644 (file)
@@ -12,12 +12,17 @@ import org.argeo.slc.akb.AkbException;
 import org.argeo.slc.akb.AkbService;
 import org.argeo.slc.akb.AkbTypes;
 import org.argeo.slc.akb.ui.AkbUiPlugin;
-import org.argeo.slc.akb.ui.editors.AkbConnectorAliasEditor;
-import org.argeo.slc.akb.ui.editors.AkbEnvTemplateEditor;
+import org.argeo.slc.akb.ui.dialogs.AddItemDialog;
 import org.argeo.slc.akb.ui.editors.AkbNodeEditorInput;
+import org.argeo.slc.akb.ui.editors.ConnectorAliasEditor;
+import org.argeo.slc.akb.ui.editors.EnvTemplateEditor;
+import org.argeo.slc.akb.ui.editors.JdbcQueryTemplateEditor;
+import org.argeo.slc.akb.ui.editors.SshCommandTemplateEditor;
+import org.argeo.slc.akb.ui.editors.SshFileTemplateEditor;
 import org.eclipse.core.commands.AbstractHandler;
 import org.eclipse.core.commands.ExecutionEvent;
 import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.swt.widgets.Display;
 import org.eclipse.ui.IWorkbenchPage;
 import org.eclipse.ui.PartInitException;
 import org.eclipse.ui.handlers.HandlerUtil;
@@ -99,17 +104,25 @@ public class OpenAkbNodeEditor extends AbstractHandler {
        private Node createNewNode(Session session, String nodeType,
                        String parentNodeJcrId) throws RepositoryException {
                Node node = null;
-               String name = SingleValue.ask("New name", "Create AKB item");
 
-               if (name == null)
-                       return null;
-               if (AkbTypes.AKB_ENV_TEMPLATE.equals(nodeType)) {
-                       node = akbService.createAkbTemplate(
-                                       session.getNodeByIdentifier(parentNodeJcrId), name);
+               if (AkbTypes.AKB_ITEM.equals(nodeType)) {
+                       Node parNode = session.getNodeByIdentifier(parentNodeJcrId);
+                       AddItemDialog dialog = new AddItemDialog(Display.getDefault()
+                                       .getActiveShell(), "Add new item", parNode);
+                       dialog.open();
+                       node = dialog.getNewNode();
                } else {
-                       Node parentNode = session.getNodeByIdentifier(parentNodeJcrId);
-                       node = parentNode.addNode(name, nodeType);
-                       node.setProperty(Property.JCR_TITLE, name);
+                       String name = SingleValue.ask("New name", "Create AKB item");
+                       if (name == null)
+                               return null;
+                       if (AkbTypes.AKB_ENV_TEMPLATE.equals(nodeType)) {
+                               node = akbService.createAkbTemplate(
+                                               session.getNodeByIdentifier(parentNodeJcrId), name);
+                       } else {
+                               Node parentNode = session.getNodeByIdentifier(parentNodeJcrId);
+                               node = parentNode.addNode(name, nodeType);
+                               node.setProperty(Property.JCR_TITLE, name);
+                       }
                }
                // corresponding node is saved but not checked in, in order to ease
                // cancel actions.
@@ -120,9 +133,15 @@ public class OpenAkbNodeEditor extends AbstractHandler {
        private String getEditorForNode(Node node) throws RepositoryException {
                String editorId = null;
                if (node.isNodeType(AkbTypes.AKB_CONNECTOR_ALIAS))
-                       editorId = AkbConnectorAliasEditor.ID;
+                       editorId = ConnectorAliasEditor.ID;
                else if (node.isNodeType(AkbTypes.AKB_ENV_TEMPLATE))
-                       editorId = AkbEnvTemplateEditor.ID;
+                       editorId = EnvTemplateEditor.ID;
+               else if (node.isNodeType(AkbTypes.AKB_SSH_FILE))
+                       editorId = SshFileTemplateEditor.ID;
+               else if (node.isNodeType(AkbTypes.AKB_SSH_COMMAND))
+                       editorId = SshCommandTemplateEditor.ID;
+               else if (node.isNodeType(AkbTypes.AKB_JDBC_QUERY))
+                       editorId = JdbcQueryTemplateEditor.ID;
                // else
                // throw new AkbException("Editor is undefined for node " + node);
                return editorId;
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
new file mode 100644 (file)
index 0000000..86b5b23
--- /dev/null
@@ -0,0 +1,145 @@
+package org.argeo.slc.akb.ui.composites;
+
+import java.util.List;
+
+import javax.jcr.Node;
+import javax.jcr.Property;
+
+import org.argeo.slc.akb.ui.AkbUiUtils;
+import org.argeo.slc.akb.utils.AkbJcrUtils;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.forms.AbstractFormPart;
+import org.eclipse.ui.forms.IManagedForm;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+
+public class ItemTemplateTitleComposite extends Composite {
+       // private final static Log log =
+       // LogFactory.getLog(MixTitleComposite.class);
+
+       private final Node akbNode;
+       private final FormToolkit toolkit;
+       private final IManagedForm form;
+       // Don't forget to unregister on dispose
+       private AbstractFormPart formPart;
+
+       // To enable set focus
+       private Text titleTxt;
+
+       public ItemTemplateTitleComposite(Composite parent, int style,
+                       FormToolkit toolkit, IManagedForm form, Node akbNode) {
+               super(parent, style);
+               this.akbNode = akbNode;
+               this.toolkit = toolkit;
+               this.form = form;
+               populate();
+               toolkit.adapt(this);
+       }
+
+       private void populate() {
+               // Initialization
+               Composite parent = this;
+
+               parent.setLayout(new GridLayout(4, false));
+
+               // first line: Item name
+               toolkit.createLabel(parent, "Name");
+               titleTxt = toolkit.createText(parent, "", SWT.BORDER);
+               GridData gd = new GridData(SWT.FILL, SWT.TOP, true, false, 3, 1);
+               titleTxt.setLayoutData(gd);
+
+               // Second line: alias management
+               toolkit.createLabel(parent, "Alias");
+               final Combo typeCmb = new Combo(parent, SWT.READ_ONLY);
+
+               // TODO enable live refresh
+               final List<Node> definedAliases = AkbJcrUtils
+                               .getDefinedAliasForNode(akbNode);
+
+               final String[] names = new String[definedAliases.size()];
+               int i = 0;
+               for (Node node : definedAliases)
+                       names[i++] = AkbJcrUtils.get(node, Property.JCR_TITLE);
+               typeCmb.setItems(names);
+
+               gd = new GridData(SWT.FILL, SWT.TOP, true, false, 3, 1);
+               typeCmb.setLayoutData(gd);
+
+               // 3rd line: description
+               Label lbl = toolkit.createLabel(parent, "Description");
+               lbl.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false));
+               final Text descTxt = toolkit.createText(parent, "", SWT.BORDER
+                               | SWT.MULTI | SWT.WRAP);
+               gd = new GridData(SWT.FILL, SWT.FILL, true, true, 3, 1);
+               descTxt.setLayoutData(gd);
+
+               // Part Management
+               final AbstractFormPart part = new AbstractFormPart() {
+                       public void refresh() {
+                               super.refresh();
+                               // update display value
+                               AkbUiUtils.refreshFormTextWidget(titleTxt, akbNode,
+                                               Property.JCR_TITLE);
+                               AkbUiUtils.refreshFormTextWidget(descTxt, akbNode,
+                                               Property.JCR_DESCRIPTION);
+
+                               // TODO implement this
+                               // typeCmb.select(getCurrTypeIndex());
+                               typeCmb.setEnabled(AkbJcrUtils.isNodeCheckedOutByMe(akbNode));
+                       }
+               };
+
+               // Listeners
+               AkbUiUtils.addTextModifyListener(titleTxt, akbNode, Property.JCR_TITLE,
+                               part);
+               AkbUiUtils.addTextModifyListener(descTxt, akbNode,
+                               Property.JCR_DESCRIPTION, part);
+
+               typeCmb.addModifyListener(new ModifyListener() {
+                       @Override
+                       public void modifyText(ModifyEvent event) {
+                               // try {
+                               int oldIndex = -1; // getCurrTypeIndex();
+                               int selIndex = typeCmb.getSelectionIndex();
+
+                               // insure something has really been modified
+                               if (selIndex < 0 || oldIndex == selIndex)
+                                       return;
+
+                               // TODO set new alias
+                               part.markDirty();
+                               // } catch (RepositoryException e) {
+                               // throw new AkbException(
+                               // "Error while updating connector alias", e);
+                               // }
+                       }
+               });
+
+               form.addPart(part);
+       }
+
+       @Override
+       public boolean setFocus() {
+               return titleTxt.setFocus();
+       }
+
+       protected void disposePart(AbstractFormPart part) {
+               if (part != null) {
+                       form.removePart(part);
+                       part.dispose();
+               }
+       }
+
+       @Override
+       public void dispose() {
+               disposePart(formPart);
+               super.dispose();
+       }
+}
index 39564832500fa3a5c498b10d240cc9f0f1dbe5ec..5aa64239fa607f55e3d10ce5c896423b0752dc4c 100644 (file)
@@ -43,7 +43,7 @@ public class MixTitleComposite extends Composite {
 
                parent.setLayout(new GridLayout(2, false));
 
-               // first line: connector type and name
+               // first line: connector name
                toolkit.createLabel(parent, "Name");
                titleTxt = toolkit.createText(parent, "", SWT.BORDER);
                GridData gd = new GridData(SWT.FILL, SWT.TOP, true, false);
diff --git a/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/dialogs/AddItemDialog.java b/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/dialogs/AddItemDialog.java
new file mode 100644 (file)
index 0000000..00d0b43
--- /dev/null
@@ -0,0 +1,97 @@
+package org.argeo.slc.akb.ui.dialogs;
+
+import javax.jcr.Node;
+import javax.jcr.Property;
+import javax.jcr.RepositoryException;
+
+import org.argeo.slc.akb.AkbException;
+import org.argeo.slc.akb.AkbTypes;
+import org.eclipse.jface.dialogs.TrayDialog;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * Dialog to create a new Item Template
+ */
+public class AddItemDialog extends TrayDialog {
+
+       // this page widgets and UI objects
+       private final String title;
+
+       private String[] itemTypesLbl = new String[] { "SSH File", "SSH Command",
+                       "JDBC Connection" };
+       private String[] itemTypes = new String[] { AkbTypes.AKB_SSH_FILE,
+                       AkbTypes.AKB_SSH_COMMAND, AkbTypes.AKB_JDBC_QUERY };
+
+       // business objects
+       private Node parentNode;
+       private Node newNode;
+
+       // widget objects
+       private Combo typeCmb;
+       private Text titleTxt;
+
+       public AddItemDialog(Shell parentShell, String title, Node parentNode) {
+               super(parentShell);
+               this.title = title;
+               this.parentNode = parentNode;
+       }
+
+       protected Point getInitialSize() {
+               return new Point(400, 300);
+       }
+
+       protected Control createDialogArea(Composite parent) {
+               Composite dialogArea = (Composite) super.createDialogArea(parent);
+               dialogArea.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+               dialogArea.setLayout(new GridLayout(2, false));
+               // type
+               Label lbl = new Label(dialogArea, SWT.NONE);
+               lbl.setText("Item type");
+               typeCmb = new Combo(dialogArea, SWT.READ_ONLY);
+               typeCmb.setItems(itemTypesLbl);
+               // name
+               titleTxt = createLT(dialogArea, "Item Name");
+
+               parent.pack();
+               return dialogArea;
+       }
+
+       @Override
+       protected void okPressed() {
+               try {
+                       newNode = parentNode.addNode(titleTxt.getText(),
+                                       itemTypes[typeCmb.getSelectionIndex()]);
+                       newNode.setProperty(Property.JCR_TITLE, titleTxt.getText());
+               } catch (RepositoryException e) {
+                       throw new AkbException("unable to create Item", e);
+               }
+               super.okPressed();
+       }
+
+       public Node getNewNode() {
+               return newNode;
+       }
+
+       /** Creates label and text. */
+       protected Text createLT(Composite parent, String label) {
+               new Label(parent, SWT.NONE).setText(label);
+               Text text = new Text(parent, SWT.SINGLE | SWT.LEAD | SWT.BORDER);
+               text.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
+               return text;
+       }
+
+       protected void configureShell(Shell shell) {
+               super.configureShell(shell);
+               shell.setText(title);
+       }
+}
\ No newline at end of file
index 7eb74bb5ee3a84c998ccf64a43f9e3c248a9c7fa..572e5230144af4f49dd0d6c5bc2001c8fd04e0ee 100644 (file)
@@ -81,6 +81,10 @@ public abstract class AbstractAkbNodeEditor extends FormEditor {
                setTitleToolTip("Display and edit " + name);
        }
 
+       /** Overwrite to provide supplementary pages between main and history page */
+       protected void addOtherPages() throws PartInitException {
+       }
+
        /* Pages management */
        @Override
        protected void addPages() {
diff --git a/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/editors/AkbConnectorAliasEditor.java b/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/editors/AkbConnectorAliasEditor.java
deleted file mode 100644 (file)
index a3b776c..0000000
+++ /dev/null
@@ -1,201 +0,0 @@
-package org.argeo.slc.akb.ui.editors;
-
-import javax.jcr.Property;
-import javax.jcr.RepositoryException;
-
-import org.argeo.slc.akb.AkbException;
-import org.argeo.slc.akb.AkbNames;
-import org.argeo.slc.akb.AkbTypes;
-import org.argeo.slc.akb.ui.AkbUiPlugin;
-import org.argeo.slc.akb.ui.AkbUiUtils;
-import org.argeo.slc.akb.utils.AkbJcrUtils;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.forms.AbstractFormPart;
-import org.eclipse.ui.forms.IManagedForm;
-
-/**
- * Display and edit a connector Alias
- */
-public class AkbConnectorAliasEditor extends AbstractAkbNodeEditor {
-       // private final static Log log = LogFactory
-       // .getLog(AkbConnectorAliasEditor.class);
-
-       public final static String ID = AkbUiPlugin.PLUGIN_ID
-                       + ".akbConnectorAliasEditor";
-
-       private String[] connectorTypesLbl = new String[] { "JDBC", "SSH", "JCR" };
-       private String[] connectorTypes = new String[] {
-                       AkbTypes.AKB_JDBC_CONNECTOR, AkbTypes.AKB_SSH_CONNECTOR,
-                       AkbTypes.AKB_JCR_CONNECTOR };
-
-       private IManagedForm managedForm;
-
-       /* CONTENT CREATION */
-       @Override
-       public void populateMainPage(Composite parent, IManagedForm managedForm) {
-               parent.setLayout(AkbUiUtils.gridLayoutNoBorder());
-               this.managedForm = managedForm;
-
-               // First line main info
-               Composite firstLine = getToolkit()
-                               .createComposite(parent, SWT.NO_FOCUS);
-               firstLine.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
-               createConnectorAliasInfoCmp(firstLine);
-
-               // Second line define defaut connector and test abilities
-               Composite secondLine = getToolkit().createComposite(parent,
-                               SWT.NO_FOCUS);
-               secondLine.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
-               createDefaultTestConnectorCmp(secondLine);
-
-       }
-
-       private void createConnectorAliasInfoCmp(Composite parent) {
-               parent.setLayout(new GridLayout(4, false));
-
-               // first line: connector type and name
-               getToolkit().createLabel(parent, "Connector Type");
-               final Combo typeCmb = new Combo(parent, SWT.READ_ONLY);
-               typeCmb.setItems(connectorTypesLbl);
-
-               getToolkit().createLabel(parent, "Name");
-               final Text titleTxt = getToolkit().createText(parent, "", SWT.BORDER);
-               GridData gd = new GridData(SWT.FILL, SWT.TOP, true, false);
-               titleTxt.setLayoutData(gd);
-
-               // 2nd line: description
-               getToolkit().createLabel(parent, "Short Description");
-               final Text descTxt = getToolkit().createText(parent, "", SWT.BORDER);
-               gd = new GridData(SWT.FILL, SWT.TOP, true, false, 3, 1);
-               descTxt.setLayoutData(gd);
-
-               // Part Management
-               final AbstractFormPart part = new AbstractFormPart() {
-                       public void refresh() {
-                               super.refresh();
-                               // update display value
-                               AkbUiUtils.refreshFormTextWidget(titleTxt, getAkbNode(),
-                                               Property.JCR_TITLE);
-                               AkbUiUtils.refreshFormTextWidget(descTxt, getAkbNode(),
-                                               Property.JCR_DESCRIPTION);
-                       }
-               };
-               // Listeners
-               AkbUiUtils.addTextModifyListener(titleTxt, getAkbNode(),
-                               Property.JCR_TITLE, part);
-               AkbUiUtils.addTextModifyListener(descTxt, getAkbNode(),
-                               Property.JCR_DESCRIPTION, part);
-
-               typeCmb.addModifyListener(new ModifyListener() {
-                       @Override
-                       public void modifyText(ModifyEvent event) {
-
-                               try { // TODO enhance this
-
-                                       // retrieve old and new node type
-                                       int oldIndex = -1;
-                                       for (int i = 0; i < connectorTypes.length; i++) {
-                                               if (getAkbNode().isNodeType(connectorTypes[i])) {
-                                                       oldIndex = i;
-                                                       break;
-                                               }
-                                       }
-                                       int selIndex = typeCmb.getSelectionIndex();
-
-                                       // insure something has really been modified
-                                       if (selIndex < 0 || oldIndex == selIndex)
-                                               return;
-
-                                       // remove old mixin, add new and notify form
-                                       if (oldIndex > -1)
-                                               getAkbNode().removeMixin(connectorTypes[oldIndex]);
-                                       getAkbNode().addMixin(connectorTypes[selIndex]);
-                                       part.markDirty();
-                               } catch (RepositoryException e) {
-                                       throw new AkbException(
-                                                       "Error while updating connector type", e);
-                               }
-                       }
-               });
-
-               managedForm.addPart(part);
-       }
-
-       private void createDefaultTestConnectorCmp(Composite parent) {
-               String groupTitle = "Default test instance";
-               parent.setLayout(new GridLayout());
-               Group group = new Group(parent, SWT.NONE);
-               group.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
-               getToolkit().adapt(group, false, false);
-
-               group.setText(groupTitle);
-               group.setLayout(AkbUiUtils.gridLayoutNoBorder());
-               // 1st line: the URL
-
-               Composite firstLine = getToolkit().createComposite(group);
-               firstLine.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
-               firstLine.setLayout(new GridLayout(3, false));
-
-               getToolkit().createLabel(firstLine, "URL");
-               final Text urlTxt = getToolkit().createText(firstLine, "", SWT.BORDER);
-               urlTxt.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
-
-               final Button testBtn = getToolkit().createButton(firstLine,
-                               "Test connection", SWT.PUSH);
-               // testBtn.setLayoutData(new GridData(SWT.RIGHT, SWT.TOP, false,
-               // false));
-
-               // Part Management
-               final AbstractFormPart part = new AbstractFormPart() {
-                       public void refresh() {
-                               super.refresh();
-                               // update display value
-                               AkbUiUtils.refreshFormTextWidget(urlTxt, getAkbNode(),
-                                               AkbNames.AKB_CONNECTOR_URL);
-                       }
-               };
-               // Listeners
-               AkbUiUtils.addTextModifyListener(urlTxt, getAkbNode(),
-                               AkbNames.AKB_CONNECTOR_URL, part);
-
-               testBtn.addSelectionListener(new SelectionAdapter() {
-                       @Override
-                       public void widgetSelected(SelectionEvent e) {
-                               boolean testSuccesfull = getAkbService().testConnector(
-                                               getAkbNode());
-
-                               String name = AkbJcrUtils.get(getAkbNode(), Property.JCR_TITLE);
-                               String url = AkbJcrUtils.get(getAkbNode(),
-                                               AkbNames.AKB_CONNECTOR_URL);
-
-                               String msg = "to " + name + " (" + url + ")";
-                               if (testSuccesfull)
-                                       MessageDialog.openInformation(getSite().getShell(),
-                                                       "Test successful", "Successfully connected " + msg);
-                               else
-                                       MessageDialog.openError(getSite().getShell(),
-                                                       "Test failure", "Unable to connect" + msg);
-                       }
-               });
-
-               managedForm.addPart(part);
-
-       }
-
-       @Override
-       protected String getEditorId() {
-               return ID;
-       }
-}
\ No newline at end of file
diff --git a/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/editors/AkbEnvTemplateEditor.java b/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/editors/AkbEnvTemplateEditor.java
deleted file mode 100644 (file)
index 49f443a..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-package org.argeo.slc.akb.ui.editors;
-
-import org.argeo.slc.akb.ui.AkbUiPlugin;
-import org.argeo.slc.akb.ui.AkbUiUtils;
-import org.argeo.slc.akb.ui.composites.MixTitleComposite;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IManagedForm;
-
-/**
- * Display and edit a connector Alias
- */
-public class AkbEnvTemplateEditor extends AbstractAkbNodeEditor {
-
-       public final static String ID = AkbUiPlugin.PLUGIN_ID
-                       + ".akbEnvTemplateEditor";
-
-       /* CONTENT CREATION */
-       @Override
-       public void populateMainPage(Composite parent, IManagedForm managedForm) {
-               parent.setLayout(AkbUiUtils.gridLayoutNoBorder());
-               // First line main info
-               MixTitleComposite mixTitleCmp = new MixTitleComposite(parent,
-                               SWT.NO_FOCUS, getToolkit(), managedForm, getAkbNode());
-               mixTitleCmp.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
-       }
-
-       @Override
-       protected String getEditorId() {
-               return ID;
-       }
-}
\ No newline at end of file
diff --git a/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/editors/AkbItemTemplateEditor.java b/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/editors/AkbItemTemplateEditor.java
new file mode 100644 (file)
index 0000000..272a88f
--- /dev/null
@@ -0,0 +1,40 @@
+package org.argeo.slc.akb.ui.editors;
+
+import org.argeo.slc.akb.ui.AkbUiUtils;
+import org.argeo.slc.akb.ui.composites.ItemTemplateTitleComposite;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.forms.IManagedForm;
+
+/**
+ * Display and edit a connector Alias
+ */
+public abstract class AkbItemTemplateEditor extends AbstractAkbNodeEditor {
+
+       /* CONTENT CREATION */
+       @Override
+       public void populateMainPage(Composite parent, IManagedForm managedForm) {
+               parent.setLayout(AkbUiUtils.gridLayoutNoBorder());
+               // First line main info
+               ItemTemplateTitleComposite ittCmp = new ItemTemplateTitleComposite(
+                               parent, SWT.NO_FOCUS, getToolkit(), managedForm, getAkbNode());
+               GridData gd = new GridData(SWT.FILL, SWT.TOP, true, false);
+               gd.minimumHeight = 250;
+               ittCmp.setLayoutData(gd);
+
+               Composite bottomCmp = getToolkit().createComposite(parent);
+               gd = new GridData(SWT.FILL, SWT.FILL, true, true);
+               bottomCmp.setLayoutData(gd);
+               populateBottomPart(bottomCmp);
+       }
+
+       @Override
+       protected void addOtherPages() throws PartInitException {
+               // TODO implement addition of the test page
+       }
+
+       /** Overwrite to add specific bottom part depending on the item type */
+       abstract protected void populateBottomPart(Composite parent);
+}
\ No newline at end of file
diff --git a/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/editors/ConnectorAliasEditor.java b/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/editors/ConnectorAliasEditor.java
new file mode 100644 (file)
index 0000000..b272a38
--- /dev/null
@@ -0,0 +1,213 @@
+package org.argeo.slc.akb.ui.editors;
+
+import javax.jcr.Property;
+import javax.jcr.RepositoryException;
+
+import org.argeo.slc.akb.AkbException;
+import org.argeo.slc.akb.AkbNames;
+import org.argeo.slc.akb.AkbTypes;
+import org.argeo.slc.akb.ui.AkbUiPlugin;
+import org.argeo.slc.akb.ui.AkbUiUtils;
+import org.argeo.slc.akb.utils.AkbJcrUtils;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.forms.AbstractFormPart;
+import org.eclipse.ui.forms.IManagedForm;
+
+/**
+ * Display and edit a connector Alias
+ */
+public class ConnectorAliasEditor extends AbstractAkbNodeEditor {
+       // private final static Log log = LogFactory
+       // .getLog(AkbConnectorAliasEditor.class);
+
+       public final static String ID = AkbUiPlugin.PLUGIN_ID
+                       + ".connectorAliasEditor";
+
+       private String[] connectorTypesLbl = new String[] { "JDBC", "SSH", "JCR" };
+       private String[] connectorTypes = new String[] {
+                       AkbTypes.AKB_JDBC_CONNECTOR, AkbTypes.AKB_SSH_CONNECTOR,
+                       AkbTypes.AKB_JCR_CONNECTOR };
+
+       private IManagedForm managedForm;
+
+       /* CONTENT CREATION */
+       @Override
+       public void populateMainPage(Composite parent, IManagedForm managedForm) {
+               parent.setLayout(AkbUiUtils.gridLayoutNoBorder());
+               this.managedForm = managedForm;
+
+               // First line main info
+               Composite firstLine = getToolkit()
+                               .createComposite(parent, SWT.NO_FOCUS);
+               firstLine.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
+               createConnectorAliasInfoCmp(firstLine);
+
+               // Second line define defaut connector and test abilities
+               Composite secondLine = getToolkit().createComposite(parent,
+                               SWT.NO_FOCUS);
+               secondLine.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+               createDefaultTestConnectorCmp(secondLine);
+
+       }
+
+       private void createConnectorAliasInfoCmp(Composite parent) {
+               parent.setLayout(new GridLayout(4, false));
+
+               // first line: connector type and name
+               getToolkit().createLabel(parent, "Connector Type");
+               final Combo typeCmb = new Combo(parent, SWT.READ_ONLY);
+               typeCmb.setItems(connectorTypesLbl);
+
+               getToolkit().createLabel(parent, "Name");
+               final Text titleTxt = getToolkit().createText(parent, "", SWT.BORDER);
+               GridData gd = new GridData(SWT.FILL, SWT.TOP, true, false);
+               titleTxt.setLayoutData(gd);
+
+               // 2nd line: description
+               getToolkit().createLabel(parent, "Short Description");
+               final Text descTxt = getToolkit().createText(parent, "", SWT.BORDER);
+               gd = new GridData(SWT.FILL, SWT.TOP, true, false, 3, 1);
+               descTxt.setLayoutData(gd);
+
+               // Part Management
+               final AbstractFormPart part = new AbstractFormPart() {
+                       public void refresh() {
+                               super.refresh();
+                               // update display value
+                               AkbUiUtils.refreshFormTextWidget(titleTxt, getAkbNode(),
+                                               Property.JCR_TITLE);
+                               AkbUiUtils.refreshFormTextWidget(descTxt, getAkbNode(),
+                                               Property.JCR_DESCRIPTION);
+                               typeCmb.select(getCurrTypeIndex());
+                               typeCmb.setEnabled(AkbJcrUtils
+                                               .isNodeCheckedOutByMe(getAkbNode()));
+                       }
+               };
+               // Listeners
+               AkbUiUtils.addTextModifyListener(titleTxt, getAkbNode(),
+                               Property.JCR_TITLE, part);
+               AkbUiUtils.addTextModifyListener(descTxt, getAkbNode(),
+                               Property.JCR_DESCRIPTION, part);
+
+               typeCmb.addModifyListener(new ModifyListener() {
+                       @Override
+                       public void modifyText(ModifyEvent event) {
+
+                               try { // TODO enhance this
+                                       // retrieve old and new node type
+                                       int oldIndex = getCurrTypeIndex();
+                                       int selIndex = typeCmb.getSelectionIndex();
+
+                                       // insure something has really been modified
+                                       if (selIndex < 0 || oldIndex == selIndex)
+                                               return;
+
+                                       // remove old mixin, add new and notify form
+                                       if (oldIndex > -1)
+                                               getAkbNode().removeMixin(connectorTypes[oldIndex]);
+                                       getAkbNode().addMixin(connectorTypes[selIndex]);
+                                       part.markDirty();
+                               } catch (RepositoryException e) {
+                                       throw new AkbException(
+                                                       "Error while updating connector type", e);
+                               }
+                       }
+               });
+               managedForm.addPart(part);
+       }
+
+       private int getCurrTypeIndex() {
+               try {
+                       int oldIndex = -1;
+                       for (int i = 0; i < connectorTypes.length; i++) {
+                               if (getAkbNode().isNodeType(connectorTypes[i])) {
+                                       oldIndex = i;
+                                       break;
+
+                               }
+                       }
+                       return oldIndex;
+               } catch (RepositoryException e) {
+                       throw new AkbException("Error while getting connector type", e);
+               }
+
+       }
+
+       private void createDefaultTestConnectorCmp(Composite parent) {
+               String groupTitle = "Default test instance";
+               parent.setLayout(new GridLayout());
+               Group group = new Group(parent, SWT.NONE);
+               group.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+               getToolkit().adapt(group, false, false);
+
+               group.setText(groupTitle);
+               group.setLayout(AkbUiUtils.gridLayoutNoBorder());
+               // 1st line: the URL
+
+               Composite firstLine = getToolkit().createComposite(group);
+               firstLine.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+               firstLine.setLayout(new GridLayout(3, false));
+
+               getToolkit().createLabel(firstLine, "URL");
+               final Text urlTxt = getToolkit().createText(firstLine, "", SWT.BORDER);
+               urlTxt.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
+
+               final Button testBtn = getToolkit().createButton(firstLine,
+                               "Test connection", SWT.PUSH);
+               // testBtn.setLayoutData(new GridData(SWT.RIGHT, SWT.TOP, false,
+               // false));
+
+               // Part Management
+               final AbstractFormPart part = new AbstractFormPart() {
+                       public void refresh() {
+                               super.refresh();
+                               // update display value
+                               AkbUiUtils.refreshFormTextWidget(urlTxt, getAkbNode(),
+                                               AkbNames.AKB_CONNECTOR_URL);
+                       }
+               };
+               // Listeners
+               AkbUiUtils.addTextModifyListener(urlTxt, getAkbNode(),
+                               AkbNames.AKB_CONNECTOR_URL, part);
+
+               testBtn.addSelectionListener(new SelectionAdapter() {
+                       @Override
+                       public void widgetSelected(SelectionEvent e) {
+                               boolean testSuccesfull = getAkbService().testConnector(
+                                               getAkbNode());
+
+                               String name = AkbJcrUtils.get(getAkbNode(), Property.JCR_TITLE);
+                               String url = AkbJcrUtils.get(getAkbNode(),
+                                               AkbNames.AKB_CONNECTOR_URL);
+
+                               String msg = "to " + name + " (" + url + ")";
+                               if (testSuccesfull)
+                                       MessageDialog.openInformation(getSite().getShell(),
+                                                       "Test successful", "Successfully connected " + msg);
+                               else
+                                       MessageDialog.openError(getSite().getShell(),
+                                                       "Test failure", "Unable to connect" + msg);
+                       }
+               });
+
+               managedForm.addPart(part);
+
+       }
+
+       @Override
+       protected String getEditorId() {
+               return ID;
+       }
+}
\ No newline at end of file
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
new file mode 100644 (file)
index 0000000..f7cfa43
--- /dev/null
@@ -0,0 +1,33 @@
+package org.argeo.slc.akb.ui.editors;
+
+import org.argeo.slc.akb.ui.AkbUiPlugin;
+import org.argeo.slc.akb.ui.AkbUiUtils;
+import org.argeo.slc.akb.ui.composites.MixTitleComposite;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.forms.IManagedForm;
+
+/**
+ * Display and edit a connector Alias
+ */
+public class EnvTemplateEditor extends AbstractAkbNodeEditor {
+
+       public final static String ID = AkbUiPlugin.PLUGIN_ID
+                       + ".envTemplateEditor";
+
+       /* CONTENT CREATION */
+       @Override
+       public void populateMainPage(Composite parent, IManagedForm managedForm) {
+               parent.setLayout(AkbUiUtils.gridLayoutNoBorder());
+               // First line main info
+               MixTitleComposite mixTitleCmp = new MixTitleComposite(parent,
+                               SWT.NO_FOCUS, getToolkit(), managedForm, getAkbNode());
+               mixTitleCmp.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+       }
+
+       @Override
+       protected String getEditorId() {
+               return ID;
+       }
+}
\ No newline at end of file
diff --git a/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/editors/JdbcQueryTemplateEditor.java b/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/editors/JdbcQueryTemplateEditor.java
new file mode 100644 (file)
index 0000000..e8e445b
--- /dev/null
@@ -0,0 +1,25 @@
+package org.argeo.slc.akb.ui.editors;
+
+import org.argeo.slc.akb.ui.AkbUiPlugin;
+import org.argeo.slc.akb.ui.AkbUiUtils;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Display and edit a connector Alias
+ */
+public class JdbcQueryTemplateEditor extends AkbItemTemplateEditor {
+
+       public final static String ID = AkbUiPlugin.PLUGIN_ID
+                       + ".jdbcQueryTemplateEditor";
+
+       @Override
+       protected String getEditorId() {
+               return ID;
+       }
+
+       @Override
+       protected void populateBottomPart(Composite parent) {
+               parent.setLayout(AkbUiUtils.gridLayoutNoBorder());
+               getToolkit().createLabel(parent, "Implement this");
+       }
+}
\ No newline at end of file
diff --git a/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/editors/SshCommandTemplateEditor.java b/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/editors/SshCommandTemplateEditor.java
new file mode 100644 (file)
index 0000000..2e45cdc
--- /dev/null
@@ -0,0 +1,25 @@
+package org.argeo.slc.akb.ui.editors;
+
+import org.argeo.slc.akb.ui.AkbUiPlugin;
+import org.argeo.slc.akb.ui.AkbUiUtils;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Display and edit a connector Alias
+ */
+public class SshCommandTemplateEditor extends AkbItemTemplateEditor {
+
+       public final static String ID = AkbUiPlugin.PLUGIN_ID
+                       + ".sshCommandTemplateEditor";
+
+       @Override
+       protected String getEditorId() {
+               return ID;
+       }
+
+       @Override
+       protected void populateBottomPart(Composite parent) {
+               parent.setLayout(AkbUiUtils.gridLayoutNoBorder());
+               getToolkit().createLabel(parent, "Implement this");
+       }
+}
\ No newline at end of file
diff --git a/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/editors/SshFileTemplateEditor.java b/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/editors/SshFileTemplateEditor.java
new file mode 100644 (file)
index 0000000..7d47de8
--- /dev/null
@@ -0,0 +1,25 @@
+package org.argeo.slc.akb.ui.editors;
+
+import org.argeo.slc.akb.ui.AkbUiPlugin;
+import org.argeo.slc.akb.ui.AkbUiUtils;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Display and edit a connector Alias
+ */
+public class SshFileTemplateEditor extends AkbItemTemplateEditor {
+
+       public final static String ID = AkbUiPlugin.PLUGIN_ID
+                       + ".sshFileTemplateEditor";
+
+       @Override
+       protected String getEditorId() {
+               return ID;
+       }
+
+       @Override
+       protected void populateBottomPart(Composite parent) {
+               parent.setLayout(AkbUiUtils.gridLayoutNoBorder());
+               getToolkit().createLabel(parent, "Implement this");
+       }
+}
\ No newline at end of file
index b0c8353d810f9df4504652a18edc750577b4bb24..844c3a1cd857c2e963151c78a052bd91cf8b7ff8 100644 (file)
@@ -6,22 +6,117 @@ import java.util.Map;
 import java.util.TreeMap;
 
 import javax.jcr.Node;
+import javax.jcr.NodeIterator;
 import javax.jcr.Property;
 import javax.jcr.PropertyIterator;
 import javax.jcr.Repository;
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
 import javax.jcr.Value;
+import javax.jcr.query.QueryManager;
+import javax.jcr.query.QueryResult;
 import javax.jcr.query.Row;
 import javax.jcr.query.RowIterator;
+import javax.jcr.query.qom.Constraint;
+import javax.jcr.query.qom.Ordering;
+import javax.jcr.query.qom.QueryObjectModel;
+import javax.jcr.query.qom.QueryObjectModelFactory;
+import javax.jcr.query.qom.Selector;
 
 import org.argeo.jcr.JcrUtils;
 import org.argeo.jcr.PropertyDiff;
 import org.argeo.slc.akb.AkbException;
+import org.argeo.slc.akb.AkbTypes;
 
 /** Some static utils methods that might be factorized in a near future */
 public class AkbJcrUtils {
 
+       // /////////////////////////
+       // SPECIFIC METHOS
+       /**
+        * Return the type of alias that must be used given current item type
+        */
+       public static String getAliasTypeForNode(Node itemTemplate) {
+               try {
+                       if (itemTemplate.isNodeType(AkbTypes.AKB_JDBC_QUERY))
+                               return AkbTypes.AKB_JDBC_CONNECTOR;
+                       else if (itemTemplate.isNodeType(AkbTypes.AKB_SSH_COMMAND)
+                                       || itemTemplate.isNodeType(AkbTypes.AKB_SSH_FILE))
+                               return AkbTypes.AKB_SSH_CONNECTOR;
+                       else
+                               throw new AkbException("No connector type define for node "
+                                               + itemTemplate);
+               } catch (RepositoryException re) {
+                       throw new AkbException("Unable to login", re);
+               }
+       }
+
+       /**
+        * Return defined alias in the current environment given current item type
+        */
+       public static List<Node> getDefinedAliasForNode(Node itemTemplate) {
+               try {
+                       Session session = itemTemplate.getSession();
+                       QueryManager queryManager = session.getWorkspace()
+                                       .getQueryManager();
+                       QueryObjectModelFactory factory = queryManager.getQOMFactory();
+                       String nodeType = getAliasTypeForNode(itemTemplate);
+
+                       Selector source = factory.selector(nodeType, nodeType);
+                       String basePath = getCurrentEnvBasePath(itemTemplate);
+                       Constraint defaultC = factory.descendantNode(
+                                       source.getSelectorName(), basePath);
+
+                       // Order by default by JCR TITLE
+                       // TODO check if node definition has MIX_TITLE mixin
+                       // TODO Apparently case insensitive ordering is not implemented in
+                       // current used JCR implementation
+                       Ordering order = factory
+                                       .ascending(factory.upperCase(factory.propertyValue(
+                                                       source.getSelectorName(), Property.JCR_TITLE)));
+                       QueryObjectModel query;
+                       query = factory.createQuery(source, defaultC,
+                                       new Ordering[] { order }, null);
+                       QueryResult result = query.execute();
+
+                       NodeIterator ni = result.getNodes();
+
+                       return JcrUtils.nodeIteratorToList(ni);
+               } catch (RepositoryException e) {
+                       throw new AkbException("Unable to list connector", e);
+               }
+       }
+
+       /**
+        * Return the current env base path
+        */
+       public static String getCurrentEnvBasePath(Node akbNode) {
+               try {
+                       if (akbNode.getDepth() == 0)
+                               // no base path for root node
+                               return null;
+
+                       Node parNode = akbNode.getParent();
+
+                       while (parNode != null)
+                               if (akbNode.isNodeType(AkbTypes.AKB_ENV)
+                                               || akbNode.isNodeType(AkbTypes.AKB_ENV_TEMPLATE))
+                                       return akbNode.getPath();
+                               else if (parNode.getDepth() == 0)
+                                       // we found not fitting node
+                                       return null;
+                               else {
+                                       akbNode = parNode;
+                                       parNode = parNode.getParent();
+                               }
+                       return null;
+               } catch (RepositoryException re) {
+                       throw new AkbException("Unable to login", re);
+               }
+       }
+
+       // //////////////////////////////////
+       // METHODS THAT CAN BE FACTORIZED
        /**
         * Call {@link Repository#login()} without exceptions (useful in super
         * constructors and dependency injection).