From: Bruno Sinou Date: Sat, 9 Nov 2013 17:53:53 +0000 (+0000) Subject: First unfinished drafts for items editors X-Git-Tag: argeo-slc-2.1.7~290 X-Git-Url: http://git.argeo.org/?a=commitdiff_plain;h=da17a59fb316462126c56099d3670a7cd38a8906;p=gpl%2Fargeo-slc.git First unfinished drafts for items editors git-svn-id: https://svn.argeo.org/slc/trunk@6608 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- diff --git a/plugins/org.argeo.slc.akb.ui/META-INF/spring/editors.xml b/plugins/org.argeo.slc.akb.ui/META-INF/spring/editors.xml index d9617fe69..52d134018 100644 --- a/plugins/org.argeo.slc.akb.ui/META-INF/spring/editors.xml +++ b/plugins/org.argeo.slc.akb.ui/META-INF/spring/editors.xml @@ -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"> - - + + + + + + + + + + + \ No newline at end of file diff --git a/plugins/org.argeo.slc.akb.ui/plugin.xml b/plugins/org.argeo.slc.akb.ui/plugin.xml index be04cd2f5..ab27bc70c 100644 --- a/plugins/org.argeo.slc.akb.ui/plugin.xml +++ b/plugins/org.argeo.slc.akb.ui/plugin.xml @@ -41,16 +41,34 @@ + + + + id="org.argeo.slc.akb.ui.jdbcQueryTemplateEditor" + name="JDBC Query Template Editor"> + + + + - Text 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 Button widget given a Node diff --git a/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/commands/OpenAkbNodeEditor.java b/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/commands/OpenAkbNodeEditor.java index c77565d42..527033e19 100644 --- a/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/commands/OpenAkbNodeEditor.java +++ b/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/commands/OpenAkbNodeEditor.java @@ -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 index 000000000..86b5b23f4 --- /dev/null +++ b/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/composites/ItemTemplateTitleComposite.java @@ -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 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(); + } +} diff --git a/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/composites/MixTitleComposite.java b/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/composites/MixTitleComposite.java index 395648325..5aa64239f 100644 --- a/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/composites/MixTitleComposite.java +++ b/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/composites/MixTitleComposite.java @@ -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 index 000000000..00d0b43c5 --- /dev/null +++ b/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/dialogs/AddItemDialog.java @@ -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 diff --git a/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/editors/AbstractAkbNodeEditor.java b/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/editors/AbstractAkbNodeEditor.java index 7eb74bb5e..572e52301 100644 --- a/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/editors/AbstractAkbNodeEditor.java +++ b/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/editors/AbstractAkbNodeEditor.java @@ -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 index a3b776c81..000000000 --- a/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/editors/AkbConnectorAliasEditor.java +++ /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 index 49f443a97..000000000 --- a/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/editors/AkbEnvTemplateEditor.java +++ /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 index 000000000..272a88f45 --- /dev/null +++ b/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/editors/AkbItemTemplateEditor.java @@ -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 index 000000000..b272a38f4 --- /dev/null +++ b/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/editors/ConnectorAliasEditor.java @@ -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 index 000000000..f7cfa438f --- /dev/null +++ b/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/editors/EnvTemplateEditor.java @@ -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 index 000000000..e8e445bfe --- /dev/null +++ b/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/editors/JdbcQueryTemplateEditor.java @@ -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 index 000000000..2e45cdc70 --- /dev/null +++ b/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/editors/SshCommandTemplateEditor.java @@ -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 index 000000000..7d47de854 --- /dev/null +++ b/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/editors/SshFileTemplateEditor.java @@ -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 diff --git a/runtime/org.argeo.slc.akb/src/main/java/org/argeo/slc/akb/utils/AkbJcrUtils.java b/runtime/org.argeo.slc.akb/src/main/java/org/argeo/slc/akb/utils/AkbJcrUtils.java index b0c8353d8..844c3a1cd 100644 --- a/runtime/org.argeo.slc.akb/src/main/java/org/argeo/slc/akb/utils/AkbJcrUtils.java +++ b/runtime/org.argeo.slc.akb/src/main/java/org/argeo/slc/akb/utils/AkbJcrUtils.java @@ -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 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).