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
<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
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
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;
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.
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;
--- /dev/null
+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();
+ }
+}
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);
--- /dev/null
+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
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() {
+++ /dev/null
-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
+++ /dev/null
-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
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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
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).