From: Bruno Sinou Date: Sat, 16 Nov 2013 08:26:04 +0000 (+0000) Subject: work on active environments X-Git-Tag: argeo-slc-2.1.7~281 X-Git-Url: http://git.argeo.org/?a=commitdiff_plain;h=44b4c78e6a082d51d0410c3995b5edf353d417b9;hp=83ab33f078ffc1e8d8bd8a34743090eff5d3b051;p=gpl%2Fargeo-slc.git work on active environments git-svn-id: https://svn.argeo.org/slc/trunk@6617 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- diff --git a/plugins/org.argeo.slc.akb.ui/META-INF/spring/commands.xml b/plugins/org.argeo.slc.akb.ui/META-INF/spring/commands.xml index 1ed12f648..e5ebc9a76 100644 --- a/plugins/org.argeo.slc.akb.ui/META-INF/spring/commands.xml +++ b/plugins/org.argeo.slc.akb.ui/META-INF/spring/commands.xml @@ -11,7 +11,13 @@ - + + + + + + diff --git a/plugins/org.argeo.slc.akb.ui/META-INF/spring/views.xml b/plugins/org.argeo.slc.akb.ui/META-INF/spring/views.xml index 8b2565f84..e00fec8c2 100644 --- a/plugins/org.argeo.slc.akb.ui/META-INF/spring/views.xml +++ b/plugins/org.argeo.slc.akb.ui/META-INF/spring/views.xml @@ -10,6 +10,10 @@ scope="prototype"> + + + diff --git a/plugins/org.argeo.slc.akb.ui/plugin.xml b/plugins/org.argeo.slc.akb.ui/plugin.xml index 10574a853..a6a9a741f 100644 --- a/plugins/org.argeo.slc.akb.ui/plugin.xml +++ b/plugins/org.argeo.slc.akb.ui/plugin.xml @@ -34,6 +34,13 @@ name="Akb Templates" restorable="true"> + + + + + + + + + + + + diff --git a/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/AkbEnvPerspective.java b/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/AkbEnvPerspective.java index 7a899d2e7..987039d74 100644 --- a/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/AkbEnvPerspective.java +++ b/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/AkbEnvPerspective.java @@ -1,14 +1,15 @@ package org.argeo.slc.akb.ui; import org.argeo.slc.akb.ui.views.AkbDefaultView; -import org.argeo.slc.akb.ui.views.AkbTemplatesTreeView; +import org.argeo.slc.akb.ui.views.EnvironmentsTreeView; import org.eclipse.ui.IFolderLayout; import org.eclipse.ui.IPageLayout; import org.eclipse.ui.IPerspectiveFactory; public class AkbEnvPerspective implements IPerspectiveFactory { - public static final String ID = AkbUiPlugin.PLUGIN_ID + ".akbEnvPerspective"; - + public static final String ID = AkbUiPlugin.PLUGIN_ID + + ".akbEnvPerspective"; + @Override public void createInitialLayout(IPageLayout layout) { String editorArea = layout.getEditorArea(); @@ -17,6 +18,7 @@ public class AkbEnvPerspective implements IPerspectiveFactory { IFolderLayout left = layout.createFolder("left", IPageLayout.LEFT, 0.3f, editorArea); + left.addView(EnvironmentsTreeView.ID); left.addView(AkbDefaultView.ID); } } diff --git a/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/commands/CreateAkbNode.java b/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/commands/CreateAkbNode.java new file mode 100644 index 000000000..19de92819 --- /dev/null +++ b/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/commands/CreateAkbNode.java @@ -0,0 +1,106 @@ +package org.argeo.slc.akb.ui.commands; + +import javax.jcr.Node; +import javax.jcr.RepositoryException; +import javax.jcr.Session; + +import org.argeo.jcr.JcrUtils; +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.dialogs.AddItemDialog; +import org.argeo.slc.akb.ui.wizards.CreateEnvInstanceWizard; +import org.eclipse.core.commands.AbstractHandler; +import org.eclipse.core.commands.ExecutionEvent; +import org.eclipse.core.commands.ExecutionException; +import org.eclipse.jface.wizard.WizardDialog; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.ui.handlers.HandlerUtil; + +/** + * Opens corresponding wizard to create a new AKB Node + */ +public class CreateAkbNode extends AbstractHandler { + public final static String ID = AkbUiPlugin.PLUGIN_ID + ".createAkbNode"; + + /* DEPENDENCY INJECTION */ + private AkbService akbService; + + public final static String PARAM_PARENT_NODE_JCR_ID = "param.parentNodeJcrId"; + public final static String PARAM_NODE_TYPE = "param.nodeType"; + + public Object execute(ExecutionEvent event) throws ExecutionException { + + String parentNodeJcrId = event.getParameter(PARAM_PARENT_NODE_JCR_ID); + String nodeType = event.getParameter(PARAM_NODE_TYPE); + Session session = null; + try { + session = akbService.getRepository().login(); + Node node = createNewNode(HandlerUtil.getActiveShell(event), + session, nodeType, parentNodeJcrId); + // no node has been created, return + if (node == null) + return null; + } catch (RepositoryException e) { + throw new AkbException("unexpected JCR error while opening " + + nodeType + " editor", e); + } finally { + JcrUtils.logoutQuietly(session); + } + return null; + } + + private Node createNewNode(Shell shell, Session session, String nodeType, + String parentNodeJcrId) throws RepositoryException { + Node node = null; + if (AkbTypes.AKB_ITEM.equals(nodeType)) { + Node parNode = session.getNodeByIdentifier(parentNodeJcrId); + AddItemDialog dialog = new AddItemDialog(shell, "Add new item", + parNode); + dialog.open(); + node = dialog.getNewNode(); + } else if (AkbTypes.AKB_ENV.equals(nodeType)) { + CreateEnvInstanceWizard wizard = new CreateEnvInstanceWizard( + akbService, session); + WizardDialog dialog = new WizardDialog(shell, wizard); + dialog.open(); + node = wizard.getCreatedNode(); + } else + return null; + // { + // String name = SingleValue + // .ask("Create " + // + AkbMessages + // .getLabelForType(nodeSubtype == null ? nodeType + // : nodeSubtype), + // "Please enter a name for the corresponding " + // + AkbMessages + // .getLabelForType(nodeSubtype == null ? nodeType + // : nodeSubtype)); + // if (name == null) + // return null; + // if (AkbTypes.AKB_ENV_TEMPLATE.equals(nodeType)) { + // node = akbService.createAkbTemplate( + // session.getNodeByIdentifier(parentNodeJcrId), name); + // } else if (AkbTypes.AKB_CONNECTOR_ALIAS.equals(nodeType)) { + // // the Jcr ID of the corresponding template must be passed to + // // create a new alias + // node = session.getNodeByIdentifier(parentNodeJcrId); + // akbService.createConnectorAlias(node, name, nodeSubtype); + // } 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. + session.save(); + return node; + } + + public void setAkbService(AkbService akbService) { + this.akbService = akbService; + } +} \ No newline at end of file diff --git a/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/commands/DeleteAkbNodes.java b/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/commands/DeleteAkbNodes.java index 76d8cdb50..3a3e9a0a9 100644 --- a/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/commands/DeleteAkbNodes.java +++ b/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/commands/DeleteAkbNodes.java @@ -7,6 +7,7 @@ import javax.jcr.Session; import org.argeo.jcr.JcrUtils; import org.argeo.slc.akb.AkbException; +import org.argeo.slc.akb.AkbTypes; import org.argeo.slc.akb.ui.AkbUiPlugin; import org.argeo.slc.akb.ui.editors.AkbNodeEditorInput; import org.argeo.slc.akb.utils.AkbJcrUtils; @@ -48,8 +49,10 @@ public class DeleteAkbNodes extends AbstractHandler { if (nodeJcrId != null) node = session.getNodeByIdentifier(nodeJcrId); - // We must be in a template to delete nodes... - Node template = AkbJcrUtils.getCurrentTemplate(node); + // We must be in a template or on the root of an env instance to + // delete nodes. + Node template = node.isNodeType(AkbTypes.AKB_ENV) ? node + : AkbJcrUtils.getCurrentTemplate(node); if (node != null) { Boolean ok = MessageDialog.openConfirm( diff --git a/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/composites/ActiveItemHeaderComposite.java b/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/composites/ActiveItemHeaderComposite.java new file mode 100644 index 000000000..b067a66ce --- /dev/null +++ b/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/composites/ActiveItemHeaderComposite.java @@ -0,0 +1,156 @@ +package org.argeo.slc.akb.ui.composites; + +import java.util.HashMap; +import java.util.Map; + +import javax.jcr.Node; +import javax.jcr.Property; +import javax.jcr.RepositoryException; + +import org.argeo.eclipse.ui.utils.CommandUtils; +import org.argeo.slc.akb.AkbException; +import org.argeo.slc.akb.AkbNames; +import org.argeo.slc.akb.AkbService; +import org.argeo.slc.akb.ui.commands.ForceRefresh; +import org.argeo.slc.akb.ui.commands.OpenAkbNodeEditor; +import org.argeo.slc.akb.utils.AkbJcrUtils; +import org.eclipse.swt.SWT; +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.Composite; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Link; +import org.eclipse.ui.forms.AbstractFormPart; +import org.eclipse.ui.forms.IManagedForm; +import org.eclipse.ui.forms.widgets.FormToolkit; + +public class ActiveItemHeaderComposite extends Composite { + + private final AkbService akbService; + private final Node envNode; + private final Node itemNode; + private final FormToolkit toolkit; + private final IManagedForm form; + // Don't forget to unregister on dispose + private AbstractFormPart formPart; + + /** + * + * @param parent + * @param style + * @param toolkit + * @param form + * @param envNode + * @param itemNode + * @param akbService + */ + public ActiveItemHeaderComposite(Composite parent, int style, + FormToolkit toolkit, IManagedForm form, Node envNode, + Node itemNode, AkbService akbService) { + super(parent, style); + this.envNode = envNode; + this.itemNode = itemNode; + this.toolkit = toolkit; + this.form = form; + this.akbService = akbService; + populate(); + toolkit.adapt(this); + } + + private void populate() { + // Initialization + Composite parent = this; + + parent.setLayout(new GridLayout(3, false)); + + final Label envLbl = toolkit.createLabel(parent, ""); + + final Link editActiveConnLk = new Link(parent, SWT.NONE); + toolkit.adapt(editActiveConnLk, false, false); + editActiveConnLk.setText("Edit Connector"); + editActiveConnLk.setLayoutData(new GridData(SWT.RIGHT, SWT.TOP, true, + false)); + + final Link refreshLk = new Link(parent, SWT.NONE); + toolkit.adapt(refreshLk, false, false); + refreshLk.setText("Refresh"); + + new Label(parent, SWT.SEPARATOR | SWT.SHADOW_OUT | SWT.HORIZONTAL) + .setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false, + 3, 1)); + + // Part Management + final AbstractFormPart part = new AbstractFormPart() { + public void refresh() { + super.refresh(); + // update display value + envLbl.setText("Environment: " + + AkbJcrUtils.get(envNode, Property.JCR_TITLE) + + " - Connector:" + + AkbJcrUtils.get(itemNode, Property.JCR_TITLE)); + + // Node activeConnector = + // akbService.getActiveConnectorByAlias(envNode, + // AkbJcrUtils.get(itemNode, + // AkbNames.AKB_CONNECTOR_ALIAS_PATH)); + // if + // (AkbJcrUtils.isEmptyString(AkbJcrUtils.get(activeConnector, + // AkbNames.AKB_CONNECTOR_URL))) + // conLbl.setImage(SWT.); + } + }; + + // Listeners + editActiveConnLk.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(final SelectionEvent event) { + try { + String pathId = AkbJcrUtils.get(itemNode, + AkbNames.AKB_USED_CONNECTOR); + + Node activeConnector = akbService + .getActiveConnectorByAlias(envNode, pathId); + + String id = AkbJcrUtils + .getIdentifierQuietly(activeConnector); + Map params = new HashMap(); + params.put(OpenAkbNodeEditor.PARAM_NODE_JCR_ID, id); + params.put(OpenAkbNodeEditor.PARAM_CURR_ENV_JCR_ID, + AkbJcrUtils.getIdentifierQuietly(envNode)); + + CommandUtils.callCommand(OpenAkbNodeEditor.ID, params); + } catch (RepositoryException e) { + throw new AkbException("Error opening active connector", e); + } + } + }); + + refreshLk.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(final SelectionEvent event) { + CommandUtils.callCommand(ForceRefresh.ID); + } + }); + form.addPart(part); + } + + @Override + public boolean setFocus() { + return true; + } + + protected void disposePart(AbstractFormPart part) { + if (part != null) { + form.removePart(part); + part.dispose(); + } + } + + @Override + public void dispose() { + disposePart(formPart); + super.dispose(); + } +} \ 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 index bab2bb81c..ba71a3de2 100644 --- 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 @@ -58,11 +58,11 @@ public abstract class AkbItemTemplateEditor extends AbstractAkbNodeEditor { ScrolledForm form = managedForm.getForm(); form.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); Composite parent = form.getBody(); - populateTestPage(parent); + populateTestPage(parent, managedForm); } } - protected void populateTestPage(Composite parent) { + protected void populateTestPage(Composite parent, IManagedForm managedForm) { parent.setLayout(AkbUiUtils.gridLayoutNoBorder()); getToolkit().createLabel( parent, diff --git a/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/editors/JdbcTestPage.java b/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/editors/JdbcTestPage.java index b988335ed..f159195b3 100644 --- a/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/editors/JdbcTestPage.java +++ b/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/editors/JdbcTestPage.java @@ -14,6 +14,8 @@ import org.argeo.slc.SlcException; import org.argeo.slc.akb.AkbNames; import org.argeo.slc.akb.AkbService; import org.argeo.slc.akb.ui.AkbUiUtils; +import org.argeo.slc.akb.ui.composites.ActiveItemHeaderComposite; +import org.argeo.slc.akb.ui.utils.Refreshable; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; @@ -34,7 +36,7 @@ import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.ScrolledForm; /** Test JDBC. */ -public class JdbcTestPage extends FormPage implements AkbNames { +public class JdbcTestPage extends FormPage implements AkbNames, Refreshable { private Node currItem; // A template or an active environment private Node currEnv; @@ -61,6 +63,14 @@ public class JdbcTestPage extends FormPage implements AkbNames { parent.setLayout(AkbUiUtils.gridLayoutNoBorder()); FormToolkit toolkit = getEditor().getToolkit(); + + // the header + ActiveItemHeaderComposite header = new ActiveItemHeaderComposite( + parent, SWT.NONE, toolkit, managedForm, currEnv, currItem, + akbService); + header.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false)); + + // the table Table table = toolkit.createTable(parent, SWT.VIRTUAL); table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); table.setHeaderVisible(true); @@ -70,32 +80,39 @@ public class JdbcTestPage extends FormPage implements AkbNames { viewer.setContentProvider(contentProvider); // viewer.setLabelProvider(new ColumnLabelProvider(){}); + forceRefresh(null); + } + + public void forceRefresh(Object object) { + silentlyCloseStatement(); statement = akbService.prepareJdbcQuery(currEnv, currItem); - PrivilegedJob job = new PrivilegedJob("Execute query on " + currItem) { - - @Override - protected IStatus doRun(IProgressMonitor progressMonitor) { - try { - final ResultSet resultSet = statement.executeQuery(); - getEditorSite().getWorkbenchWindow().getShell() - .getDisplay().syncExec(new Runnable() { - - @Override - public void run() { - viewer.setInput(resultSet); - } - }); - return Status.OK_STATUS; - } catch (SQLException e) { - throw new SlcException("Cannot execute " + currItem, e); + if (statement != null) { + PrivilegedJob job = new PrivilegedJob("Execute query on " + + currItem) { + + @Override + protected IStatus doRun(IProgressMonitor progressMonitor) { + try { + final ResultSet resultSet = statement.executeQuery(); + getEditorSite().getWorkbenchWindow().getShell() + .getDisplay().syncExec(new Runnable() { + + @Override + public void run() { + viewer.setInput(resultSet); + } + }); + return Status.OK_STATUS; + } catch (SQLException e) { + throw new SlcException("Cannot execute " + currItem, e); + } } - } - }; - job.schedule(); + }; + job.schedule(); + } } - @Override - public void dispose() { + private void silentlyCloseStatement() { try { if (statement != null) { statement.close(); @@ -106,6 +123,11 @@ public class JdbcTestPage extends FormPage implements AkbNames { } } + @Override + public void dispose() { + silentlyCloseStatement(); + } + private class JdbcTestContentProvider implements ILazyContentProvider { private TableViewer viewer; private ResultSet resultSet; 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 index 8c5baca63..7eedf246c 100644 --- 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 @@ -3,6 +3,9 @@ package org.argeo.slc.akb.ui.editors; import org.argeo.slc.akb.AkbNames; import org.argeo.slc.akb.ui.AkbUiPlugin; import org.argeo.slc.akb.ui.AkbUiUtils; +import org.argeo.slc.akb.ui.composites.ActiveItemHeaderComposite; +import org.argeo.slc.akb.ui.utils.Refreshable; +import org.argeo.slc.akb.utils.AkbJcrUtils; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.layout.GridData; @@ -16,30 +19,42 @@ import org.eclipse.ui.forms.IManagedForm; /** * Display and edit a SSH Command Template ITEM */ -public class SshCommandTemplateEditor extends AkbItemTemplateEditor { +public class SshCommandTemplateEditor extends AkbItemTemplateEditor implements + Refreshable { public final static String ID = AkbUiPlugin.PLUGIN_ID + ".sshCommandTemplateEditor"; + private Text outputDisplay; + @Override protected String getEditorId() { return ID; } @Override - protected void populateTestPage(Composite parent) { + protected void populateTestPage(Composite parent, IManagedForm managedForm) { parent.setLayout(AkbUiUtils.gridLayoutNoBorder()); - Text outputDisplay = getToolkit().createText(parent, "", SWT.MULTI); + ActiveItemHeaderComposite header = new ActiveItemHeaderComposite( + parent, SWT.NONE, getToolkit(), managedForm, getEnvNode(), + getAkbNode(), getAkbService()); + header.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false)); + + outputDisplay = getToolkit().createText(parent, "", SWT.MULTI); outputDisplay.setFont(new Font(parent.getDisplay(), "Monospaced", 10, SWT.NONE)); outputDisplay.setEditable(false); outputDisplay .setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + forceRefresh(null); + } + public void forceRefresh(Object object) { String output = getAkbService().executeCommand(getEnvNode(), getAkbNode()); - outputDisplay.setText(output); + if (AkbJcrUtils.checkNotEmptyString(output)) + outputDisplay.setText(output); } @Override 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 index 4877b82f4..bb112b0cb 100644 --- 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 @@ -3,6 +3,9 @@ package org.argeo.slc.akb.ui.editors; import org.argeo.slc.akb.AkbNames; import org.argeo.slc.akb.ui.AkbUiPlugin; import org.argeo.slc.akb.ui.AkbUiUtils; +import org.argeo.slc.akb.ui.composites.ActiveItemHeaderComposite; +import org.argeo.slc.akb.ui.utils.Refreshable; +import org.argeo.slc.akb.utils.AkbJcrUtils; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.layout.GridData; @@ -16,30 +19,43 @@ import org.eclipse.ui.forms.IManagedForm; /** * Display and edit a connection to a file on a distant accessible by SSH server */ -public class SshFileTemplateEditor extends AkbItemTemplateEditor { +public class SshFileTemplateEditor extends AkbItemTemplateEditor implements + Refreshable { public final static String ID = AkbUiPlugin.PLUGIN_ID + ".sshFileTemplateEditor"; + private Text outputDisplay; + @Override protected String getEditorId() { return ID; } @Override - protected void populateTestPage(Composite parent) { + protected void populateTestPage(Composite parent, IManagedForm managedForm) { parent.setLayout(AkbUiUtils.gridLayoutNoBorder()); - Text outputDisplay = getToolkit().createText(parent, "", SWT.MULTI); + ActiveItemHeaderComposite header = new ActiveItemHeaderComposite( + parent, SWT.NONE, getToolkit(), managedForm, getEnvNode(), + getAkbNode(), getAkbService()); + header.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false)); + + outputDisplay = getToolkit().createText(parent, "", SWT.MULTI); outputDisplay.setFont(new Font(parent.getDisplay(), "Monospaced", 10, SWT.NONE)); outputDisplay.setEditable(false); outputDisplay .setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + forceRefresh(null); + } + + public void forceRefresh(Object object) { String output = getAkbService() .retrieveFile(getEnvNode(), getAkbNode()); - outputDisplay.setText(output); + if (AkbJcrUtils.checkNotEmptyString(output)) + outputDisplay.setText(output); } @Override diff --git a/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/providers/ActiveEnvsTreeContentProvider.java b/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/providers/ActiveEnvsTreeContentProvider.java index ecb5c2d58..d15d510d2 100644 --- a/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/providers/ActiveEnvsTreeContentProvider.java +++ b/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/providers/ActiveEnvsTreeContentProvider.java @@ -40,16 +40,35 @@ public class ActiveEnvsTreeContentProvider implements ITreeContentProvider { /** * @param parent - * Pass current user home as parameter + * Pass base parent node as parameter * */ public Object[] getElements(Object parent) { - if (parent instanceof Object[]) - return (Object[]) parent; + if (parent instanceof Node) + return initializeTree((Node) parent); else return null; } + private ActiveTreeItem[] initializeTree(Node activeEnvsParentNode) { + try { + NodeIterator ni = activeEnvsParentNode.getNodes(); + List envs = new ArrayList(); + while (ni.hasNext()) { + Node currNode = ni.nextNode(); + if (currNode.isNodeType(AkbTypes.AKB_ENV)) { + envs.add(new ActiveTreeItem(null, currNode, currNode)); + } + } + ActiveTreeItem[] envArr = envs.toArray(new ActiveTreeItem[envs + .size()]); + return envArr; + } catch (RepositoryException re) { + throw new AkbException("Error while initializing the " + + "tree of active environments.", re); + } + } + public Object getParent(Object child) { return ((ActiveTreeItem) child).getParent(); } diff --git a/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/providers/AkbTreeLabelProvider.java b/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/providers/AkbTreeLabelProvider.java index 167b57611..9489afd61 100644 --- a/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/providers/AkbTreeLabelProvider.java +++ b/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/providers/AkbTreeLabelProvider.java @@ -20,6 +20,9 @@ public class AkbTreeLabelProvider extends LabelProvider { @Override public String getText(Object element) { try { + if (element instanceof ActiveTreeItem) + element = ((ActiveTreeItem) element).getNode(); + if (element instanceof Node) { Node node = (Node) element; if (node.isNodeType(NodeType.MIX_TITLE)) @@ -36,6 +39,9 @@ public class AkbTreeLabelProvider extends LabelProvider { public Image getImage(Object element) { try { + if (element instanceof ActiveTreeItem) + element = ((ActiveTreeItem) element).getNode(); + if (element instanceof Node) { Node node = (Node) element; if (node.isNodeType(AkbTypes.AKB_ITEM_FOLDER)) @@ -61,4 +67,4 @@ public class AkbTreeLabelProvider extends LabelProvider { } return null; } -} +} \ No newline at end of file diff --git a/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/views/AkbActiveEnvsTreeView.java b/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/views/AkbActiveEnvsTreeView.java deleted file mode 100644 index 281f280b3..000000000 --- a/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/views/AkbActiveEnvsTreeView.java +++ /dev/null @@ -1,411 +0,0 @@ -/* - * Copyright (C) 2007-2012 Argeo GmbH - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.argeo.slc.akb.ui.views; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import javax.jcr.Node; -import javax.jcr.NodeIterator; -import javax.jcr.Repository; -import javax.jcr.RepositoryException; -import javax.jcr.Session; -import javax.jcr.observation.Event; - -import org.argeo.eclipse.ui.jcr.AsyncUiEventListener; -import org.argeo.eclipse.ui.utils.CommandUtils; -import org.argeo.jcr.JcrUtils; -import org.argeo.slc.akb.AkbException; -import org.argeo.slc.akb.AkbNames; -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.AkbUiUtils; -import org.argeo.slc.akb.ui.commands.DeleteAkbNodes; -import org.argeo.slc.akb.ui.commands.OpenAkbNodeEditor; -import org.argeo.slc.akb.ui.providers.AkbTreeLabelProvider; -import org.argeo.slc.akb.ui.providers.TemplatesTreeContentProvider; -import org.argeo.slc.akb.ui.utils.Refreshable; -import org.argeo.slc.akb.utils.AkbJcrUtils; -import org.eclipse.jface.action.IContributionItem; -import org.eclipse.jface.action.IMenuListener; -import org.eclipse.jface.action.IMenuManager; -import org.eclipse.jface.action.MenuManager; -import org.eclipse.jface.viewers.DoubleClickEvent; -import org.eclipse.jface.viewers.IDoubleClickListener; -import org.eclipse.jface.viewers.IStructuredSelection; -import org.eclipse.jface.viewers.TreeViewer; -import org.eclipse.swt.SWT; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Menu; -import org.eclipse.ui.IWorkbenchWindow; -import org.eclipse.ui.part.ViewPart; -import org.eclipse.ui.services.IServiceLocator; - -/** AKB Active environment tree view. */ -public class AkbActiveEnvsTreeView extends ViewPart implements Refreshable { - - public final static String ID = AkbUiPlugin.PLUGIN_ID - + ".akbActiveEnvsTreeView"; - - /* DEPENDENCY INJECTION */ - private Session session; - private AkbService akbService; - - // This page widgets - private TreeViewer envTreeViewer; - - // Usefull business objects - private Node activeEnvsParentNode; - - private void initialize() { - try { - activeEnvsParentNode = session - .getNode(AkbNames.AKB_ENVIRONMENTS_BASE_PATH); - } catch (RepositoryException e) { - throw new AkbException("unable to initialize AKB Browser view", e); - } - } - - @Override - public void createPartControl(Composite parent) { - initialize(); - envTreeViewer = createTreeViewer(parent); - envTreeViewer.setInput(initializeTree()); - } - - // The main tree viewer - protected TreeViewer createTreeViewer(Composite parent) { - parent.setLayout(AkbUiUtils.gridLayoutNoBorder()); - int style = SWT.BORDER | SWT.MULTI; - - TreeViewer viewer = new TreeViewer(parent, style); - viewer.getTree().setLayoutData( - new GridData(SWT.FILL, SWT.FILL, true, true)); - - viewer.setContentProvider(new TemplatesTreeContentProvider()); - viewer.setLabelProvider(new AkbTreeLabelProvider()); - viewer.addDoubleClickListener(new ViewDoubleClickListener()); - - getSite().setSelectionProvider(viewer); - - // context menu - MenuManager menuManager = new MenuManager(); - Menu menu = menuManager.createContextMenu(viewer.getTree()); - menuManager.addMenuListener(new IMenuListener() { - public void menuAboutToShow(IMenuManager manager) { - contextMenuAboutToShow(manager); - } - }); - viewer.getTree().setMenu(menu); - menuManager.setRemoveAllWhenShown(true); - getSite().registerContextMenu(menuManager, viewer); - - return viewer; - } - - private Node[] initializeTree() { - try { - NodeIterator ni = activeEnvsParentNode.getNodes(); - List envs = new ArrayList(); - while (ni.hasNext()) { - Node currNode = ni.nextNode(); - if (currNode.isNodeType(AkbTypes.AKB_ENV)) - envs.add(currNode); - } - Node[] envArr = envs.toArray(new Node[envs.size()]); - return envArr; - } catch (RepositoryException re) { - throw new AkbException("Error while initializing the " - + "tree of active environments.", re); - } - } - - ////////////////////// - /// LIFE CYCLE - - @Override - public void forceRefresh(Object object) { - envTreeViewer.setInput(initializeTree()); - } - - @Override - public void setFocus() { - } - - @Override - public void dispose() { - JcrUtils.logoutQuietly(session); - super.dispose(); - } - - // /////////////////////////// - // CONTEXT MENU MANAGEMENT - /** - * Defines the commands that will pop up in the context menu. - **/ - protected void contextMenuAboutToShow(IMenuManager menuManager) { - IWorkbenchWindow window = AkbUiPlugin.getDefault().getWorkbench() - .getActiveWorkbenchWindow(); - try { - // Build conditions - IStructuredSelection selection = (IStructuredSelection) envTreeViewer - .getSelection(); - - Node selected = (Node) selection.getFirstElement(); - Node currEnv = null; - - boolean hasSelection = selected != null; - - if (hasSelection) - currEnv = AkbJcrUtils.getCurrentTemplate(selected); - - boolean isTemplate = hasSelection ? selected - .isNodeType(AkbTypes.AKB_ENV_TEMPLATE) : false; - boolean isParentItemsFolder = hasSelection ? selected - .isNodeType(AkbTypes.AKB_ITEM_FOLDER) : false; - // boolean isParentConnectorsFolder = hasSelection ? selected - // .isNodeType(AkbTypes.AKB_CONNECTOR_FOLDER) : false; - boolean isDeletable = hasSelection ? true : false; - - // Add Connector Alias - Map params = new HashMap(); - if (hasSelection && isTemplate) { - params.put(OpenAkbNodeEditor.PARAM_PARENT_NODE_JCR_ID, - selected.getIdentifier()); - params.put(OpenAkbNodeEditor.PARAM_CURR_ENV_JCR_ID, - currEnv.getIdentifier()); - } - params.put(OpenAkbNodeEditor.PARAM_NODE_TYPE, - AkbTypes.AKB_CONNECTOR_ALIAS); - - // Connector Alias submenu - refreshAliasesSubmenu(menuManager, window, "menu.aliasesSubmenu", - "Add Connector Alias", isTemplate, params); - - // Item Submenu - params = new HashMap(); - if (hasSelection) { - params.put(OpenAkbNodeEditor.PARAM_PARENT_NODE_JCR_ID, - selected.getIdentifier()); - params.put(OpenAkbNodeEditor.PARAM_CURR_ENV_JCR_ID, - currEnv.getIdentifier()); - } - refreshItemsSubmenu(menuManager, window, "menu.itemsSubmenu", - "Add Item", isParentItemsFolder || isTemplate, params); - - // Add Item Folder - params = new HashMap(); - if (hasSelection) { - params.put(OpenAkbNodeEditor.PARAM_PARENT_NODE_JCR_ID, - selected.getIdentifier()); - params.put(OpenAkbNodeEditor.PARAM_CURR_ENV_JCR_ID, - currEnv.getIdentifier()); - } - params.put(OpenAkbNodeEditor.PARAM_NODE_TYPE, - AkbTypes.AKB_ITEM_FOLDER); - - AkbUiUtils.refreshParameterizedCommand(menuManager, window, - "cmd.addItemFolder", OpenAkbNodeEditor.ID, - "Add item folder", null, isParentItemsFolder || isTemplate, - params); - - // Delete Item - params = new HashMap(); - if (hasSelection) - params.put(DeleteAkbNodes.PARAM_NODE_JCR_ID, - selected.getIdentifier()); - AkbUiUtils.refreshParameterizedCommand(menuManager, window, - "cmd.deleteItem", DeleteAkbNodes.ID, - "Delete selected item(s)", null, isDeletable, params); - - // create template - params = new HashMap(); - params.put(OpenAkbNodeEditor.PARAM_PARENT_NODE_JCR_ID, - activeEnvsParentNode.getIdentifier()); - params.put(OpenAkbNodeEditor.PARAM_NODE_TYPE, - AkbTypes.AKB_ENV_TEMPLATE); - AkbUiUtils.refreshParameterizedCommand(menuManager, window, - "cmd.createTemplate", OpenAkbNodeEditor.ID, - "Create new template...", null, - !hasSelection || isTemplate, params); - - } catch (RepositoryException re) { - throw new AkbException("Error while refreshing context menu", re); - } - } - - /** - * - * refreshes submenu with various connector types - * - * @param menuManager - * @param locator - * @param itemId - * @param label - * @param isVisible - * @param params - */ - private void refreshItemsSubmenu(IMenuManager menuManager, - IServiceLocator locator, String itemId, String label, - boolean isVisible, Map params) { - - // clean - IContributionItem ici = menuManager.find(itemId); - if (ici != null) - menuManager.remove(ici); - - MenuManager subMenu = new MenuManager(label, itemId); - - // JDBC Query - Map tmpParams = new HashMap(); - tmpParams.putAll(params); - tmpParams.put(OpenAkbNodeEditor.PARAM_NODE_TYPE, - AkbTypes.AKB_JDBC_QUERY); - String currItemId = "cmd.createJDBCQuery"; - IContributionItem currItem = subMenu.find(currItemId); - if (currItem != null) - subMenu.remove(currItem); - subMenu.add(AkbUiUtils.createContributionItem(menuManager, locator, - currItemId, OpenAkbNodeEditor.ID, "JDBC", null, tmpParams)); - - // SSH COMMAND - tmpParams = new HashMap(); - tmpParams.putAll(params); - tmpParams.put(OpenAkbNodeEditor.PARAM_NODE_TYPE, - AkbTypes.AKB_SSH_COMMAND); - currItemId = "cmd.createSSHCommand"; - currItem = subMenu.find(currItemId); - if (currItem != null) - subMenu.remove(currItem); - subMenu.add(AkbUiUtils.createContributionItem(menuManager, locator, - currItemId, OpenAkbNodeEditor.ID, "SSH Command", null, - tmpParams)); - - // SSH FILE - tmpParams = new HashMap(); - tmpParams.putAll(params); - tmpParams.put(OpenAkbNodeEditor.PARAM_NODE_TYPE, AkbTypes.AKB_SSH_FILE); - currItemId = "cmd.createSSHFile"; - currItem = subMenu.find(currItemId); - if (currItem != null) - subMenu.remove(currItem); - subMenu.add(AkbUiUtils.createContributionItem(menuManager, locator, - currItemId, OpenAkbNodeEditor.ID, "SSH File", null, tmpParams)); - - // refresh - menuManager.add(subMenu); - subMenu.setVisible(isVisible); - } - - /** - * - * refreshes submenu with various connector types - * - * @param menuManager - * @param locator - * @param itemId - * @param label - * @param isVisible - * @param params - */ - private void refreshAliasesSubmenu(IMenuManager menuManager, - IServiceLocator locator, String itemId, String label, - boolean isVisible, Map params) { - - // clean - IContributionItem ici = menuManager.find(itemId); - if (ici != null) - menuManager.remove(ici); - - // TODO use dynamic contribution to dynamically retrieve specific - // connector types - // CompoundContributionItem comConI = new MyCompoundCI(menuManager, - // locator, itemId); - MenuManager subMenu = new MenuManager(label, itemId); - - // JDBC - Map tmpParams = new HashMap(); - tmpParams.putAll(params); - tmpParams.put(OpenAkbNodeEditor.PARAM_NODE_SUBTYPE, - AkbTypes.AKB_JDBC_CONNECTOR); - String currItemId = "cmd.createJDBCAlias"; - IContributionItem currItem = subMenu.find(currItemId); - if (currItem != null) - subMenu.remove(currItem); - subMenu.add(AkbUiUtils.createContributionItem(menuManager, locator, - currItemId, OpenAkbNodeEditor.ID, "JDBC", null, tmpParams)); - - // SSH - tmpParams = new HashMap(); - tmpParams.putAll(params); - tmpParams.put(OpenAkbNodeEditor.PARAM_NODE_SUBTYPE, - AkbTypes.AKB_SSH_CONNECTOR); - currItemId = "cmd.createSSHAlias"; - currItem = subMenu.find(currItemId); - if (currItem != null) - subMenu.remove(currItem); - subMenu.add(AkbUiUtils.createContributionItem(menuManager, locator, - currItemId, OpenAkbNodeEditor.ID, "SSH", null, tmpParams)); - - // refresh - menuManager.add(subMenu); - subMenu.setVisible(isVisible); - } - - /* INNER CLASSES */ - class ViewDoubleClickListener implements IDoubleClickListener { - public void doubleClick(DoubleClickEvent evt) { - Object obj = ((IStructuredSelection) evt.getSelection()) - .getFirstElement(); - try { - if (obj instanceof Node) { - Node node = (Node) obj; - Node currEnv = AkbJcrUtils.getCurrentTemplate(node); - - // Add Connector Alias - Map params = new HashMap(); - params.put(OpenAkbNodeEditor.PARAM_NODE_JCR_ID, - node.getIdentifier()); - params.put(OpenAkbNodeEditor.PARAM_CURR_ENV_JCR_ID, - currEnv.getIdentifier()); - - CommandUtils.callCommand(OpenAkbNodeEditor.ID, params); - } - } catch (RepositoryException e) { - throw new AkbException("Cannot open " + obj, e); - } - } - } - - /* DEPENDENCY INJECTION */ - public void setRepository(Repository repository) { - try { - session = repository.login(); - } catch (RepositoryException e) { - throw new AkbException("unable to log in for " + ID + " view"); - } - } - - public void setAkbService(AkbService akbService) { - this.akbService = akbService; - - } -} \ No newline at end of file diff --git a/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/views/EnvironmentsTreeView.java b/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/views/EnvironmentsTreeView.java new file mode 100644 index 000000000..10812b561 --- /dev/null +++ b/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/views/EnvironmentsTreeView.java @@ -0,0 +1,206 @@ +package org.argeo.slc.akb.ui.views; + +import java.util.HashMap; +import java.util.Map; + +import javax.jcr.Node; +import javax.jcr.Repository; +import javax.jcr.RepositoryException; +import javax.jcr.Session; + +import org.argeo.eclipse.ui.utils.CommandUtils; +import org.argeo.jcr.JcrUtils; +import org.argeo.slc.akb.AkbException; +import org.argeo.slc.akb.AkbNames; +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.AkbUiUtils; +import org.argeo.slc.akb.ui.commands.CreateAkbNode; +import org.argeo.slc.akb.ui.commands.DeleteAkbNodes; +import org.argeo.slc.akb.ui.commands.OpenAkbNodeEditor; +import org.argeo.slc.akb.ui.providers.ActiveEnvsTreeContentProvider; +import org.argeo.slc.akb.ui.providers.ActiveTreeItem; +import org.argeo.slc.akb.ui.providers.AkbTreeLabelProvider; +import org.argeo.slc.akb.ui.utils.Refreshable; +import org.eclipse.jface.action.IMenuListener; +import org.eclipse.jface.action.IMenuManager; +import org.eclipse.jface.action.MenuManager; +import org.eclipse.jface.viewers.DoubleClickEvent; +import org.eclipse.jface.viewers.IDoubleClickListener; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.jface.viewers.TreeViewer; +import org.eclipse.swt.SWT; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Menu; +import org.eclipse.ui.IWorkbenchWindow; +import org.eclipse.ui.part.ViewPart; + +/** AKB Active environment tree view. */ +public class EnvironmentsTreeView extends ViewPart implements Refreshable { + + public final static String ID = AkbUiPlugin.PLUGIN_ID + + ".environmentsTreeView"; + + /* DEPENDENCY INJECTION */ + private Session session; + private AkbService akbService; + + // This page widgets + private TreeViewer envTreeViewer; + + // Usefull business objects + private Node activeEnvsParentNode; + + private void initialize() { + try { + activeEnvsParentNode = session + .getNode(AkbNames.AKB_ENVIRONMENTS_BASE_PATH); + } catch (RepositoryException e) { + throw new AkbException("unable to initialize AKB Browser view", e); + } + } + + @Override + public void createPartControl(Composite parent) { + initialize(); + envTreeViewer = createTreeViewer(parent); + envTreeViewer.setInput(activeEnvsParentNode); + } + + // The main tree viewer + protected TreeViewer createTreeViewer(Composite parent) { + parent.setLayout(AkbUiUtils.gridLayoutNoBorder()); + int style = SWT.BORDER | SWT.MULTI; + + TreeViewer viewer = new TreeViewer(parent, style); + viewer.getTree().setLayoutData( + new GridData(SWT.FILL, SWT.FILL, true, true)); + + viewer.setContentProvider(new ActiveEnvsTreeContentProvider()); + viewer.setLabelProvider(new AkbTreeLabelProvider()); + viewer.addDoubleClickListener(new ViewDoubleClickListener()); + + getSite().setSelectionProvider(viewer); + + // context menu + MenuManager menuManager = new MenuManager(); + Menu menu = menuManager.createContextMenu(viewer.getTree()); + menuManager.addMenuListener(new IMenuListener() { + public void menuAboutToShow(IMenuManager manager) { + contextMenuAboutToShow(manager); + } + }); + viewer.getTree().setMenu(menu); + menuManager.setRemoveAllWhenShown(true); + getSite().registerContextMenu(menuManager, viewer); + + return viewer; + } + + // //////////////////// + // / LIFE CYCLE + + @Override + public void forceRefresh(Object object) { + envTreeViewer.setInput(activeEnvsParentNode); + } + + @Override + public void setFocus() { + } + + @Override + public void dispose() { + JcrUtils.logoutQuietly(session); + super.dispose(); + } + + // /////////////////////////// + // CONTEXT MENU MANAGEMENT + /** + * Defines the commands that will pop up in the context menu. + **/ + protected void contextMenuAboutToShow(IMenuManager menuManager) { + IWorkbenchWindow window = AkbUiPlugin.getDefault().getWorkbench() + .getActiveWorkbenchWindow(); + try { + // Build conditions + IStructuredSelection selection = (IStructuredSelection) envTreeViewer + .getSelection(); + + ActiveTreeItem item = (ActiveTreeItem) selection.getFirstElement(); + + boolean hasSelection = item != null; + Node selected = null, currEnv = null; + + if (hasSelection) { + selected = item.getNode(); + currEnv = item.getEnvironment(); + } + boolean isEnv = hasSelection ? selected + .isNodeType(AkbTypes.AKB_ENV) : false; + boolean isDeletable = hasSelection ? isEnv : false; + Map params = new HashMap(); + + // Delete Item + params = new HashMap(); + if (hasSelection) + params.put(DeleteAkbNodes.PARAM_NODE_JCR_ID, + selected.getIdentifier()); + AkbUiUtils.refreshParameterizedCommand(menuManager, window, + "cmd.deleteItem", DeleteAkbNodes.ID, + "Delete selected active environment", null, isDeletable, + params); + + // create template + params = new HashMap(); + params.put(OpenAkbNodeEditor.PARAM_NODE_TYPE, AkbTypes.AKB_ENV); + AkbUiUtils.refreshParameterizedCommand(menuManager, window, + "cmd.instanciateEnv", CreateAkbNode.ID, + "Create new environment instance", null, !hasSelection + || isEnv, params); + + } catch (RepositoryException re) { + throw new AkbException("Error while refreshing context menu", re); + } + } + + /* INNER CLASSES */ + class ViewDoubleClickListener implements IDoubleClickListener { + public void doubleClick(DoubleClickEvent evt) { + Object obj = ((IStructuredSelection) evt.getSelection()) + .getFirstElement(); + try { + if (obj instanceof ActiveTreeItem) { + ActiveTreeItem currItem = (ActiveTreeItem) obj; + Node node = currItem.getNode(); + Node currEnv = currItem.getEnvironment(); + Map params = new HashMap(); + params.put(OpenAkbNodeEditor.PARAM_NODE_JCR_ID, + node.getIdentifier()); + params.put(OpenAkbNodeEditor.PARAM_CURR_ENV_JCR_ID, + currEnv.getIdentifier()); + CommandUtils.callCommand(OpenAkbNodeEditor.ID, params); + } + } catch (RepositoryException e) { + throw new AkbException("Cannot open " + obj, e); + } + } + } + + /* DEPENDENCY INJECTION */ + public void setRepository(Repository repository) { + try { + session = repository.login(); + } catch (RepositoryException e) { + throw new AkbException("unable to log in for " + ID + " view"); + } + } + + public void setAkbService(AkbService akbService) { + this.akbService = akbService; + + } +} \ No newline at end of file diff --git a/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/wizards/CreateEnvInstanceWizard.java b/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/wizards/CreateEnvInstanceWizard.java new file mode 100644 index 000000000..fc8ee3fed --- /dev/null +++ b/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/wizards/CreateEnvInstanceWizard.java @@ -0,0 +1,161 @@ +package org.argeo.slc.akb.ui.wizards; + +import java.util.List; + +import javax.jcr.Node; +import javax.jcr.Property; +import javax.jcr.RepositoryException; +import javax.jcr.Session; + +import org.argeo.slc.akb.AkbException; +import org.argeo.slc.akb.AkbService; +import org.argeo.slc.akb.utils.AkbJcrUtils; +import org.eclipse.jface.wizard.Wizard; +import org.eclipse.jface.wizard.WizardPage; +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.Button; +import org.eclipse.swt.widgets.Combo; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Text; + +/** Creates a new active instance of an AKB env template */ +public class CreateEnvInstanceWizard extends Wizard { + // private final static Log log = LogFactory + // .getLog(CreateEnvInstanceWizard.class); + + private Session session; + private AkbService akbService; + private Node createdNode; + + // pages + private ChooseTemplatePage chooseTemplatePage; + + public CreateEnvInstanceWizard(AkbService akbService, Session session) { + this.akbService = akbService; + this.session = session; + } + + @Override + public void addPages() { + chooseTemplatePage = new ChooseTemplatePage(); + addPage(chooseTemplatePage); + } + + public Node getCreatedNode() { + return createdNode; + } + + @Override + public boolean performFinish() { + if (!canFinish()) + return false; + try { + createdNode = akbService.createActiveEnv( + chooseTemplatePage.getTemplate(), + chooseTemplatePage.getActiveEnvName(), + chooseTemplatePage.getUseDefaultConnectors()); + + return true; + } catch (RepositoryException re) { + throw new AkbException("Unable to create environment instance", re); + } + } + + public boolean canFinish() { + if (chooseTemplatePage.getActiveEnvName() != null + && chooseTemplatePage.getTemplate() != null) + return true; + else + return false; + } + + // ////////////////////// + // Pages definition + /** + * Displays a combo box that enables user to choose which action to perform + */ + private class ChooseTemplatePage extends WizardPage { + private Text valueTxt; + private Combo chooseTemplateCmb; + private Button useDefaultConnChk; + + public ChooseTemplatePage() { + super("Choose template"); + setTitle("Choose template."); + setDescription("Define the new instance parameters"); + } + + @Override + public void createControl(Composite parent) { + Composite container = new Composite(parent, SWT.NO_FOCUS); + GridLayout gl = new GridLayout(2, false); + container.setLayout(gl); + + new Label(container, NONE).setText("Name"); + valueTxt = new Text(container, SWT.NONE); + valueTxt.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false)); + valueTxt.addModifyListener(new ModifyListener() { + @Override + public void modifyText(ModifyEvent e) { + //TODO implement here name validation. + getWizard().getContainer().updateButtons(); + } + }); + + new Label(container, NONE).setText("Parent template"); + chooseTemplateCmb = new Combo(container, SWT.NO_FOCUS); + chooseTemplateCmb.setItems(getTemplates()); + chooseTemplateCmb.setLayoutData(new GridData(SWT.FILL, SWT.TOP, + true, false)); + + chooseTemplateCmb.addModifyListener(new ModifyListener() { + @Override + public void modifyText(ModifyEvent e) { + getWizard().getContainer().updateButtons(); + } + }); + + new Label(container, SWT.SEPARATOR | SWT.SHADOW_OUT + | SWT.HORIZONTAL).setLayoutData(new GridData(SWT.FILL, + SWT.FILL, false, false, 3, 1)); + + useDefaultConnChk = new Button(container, SWT.CHECK); + useDefaultConnChk.setText("Import default connectors"); + + setControl(container); + } + + private String[] getTemplates() { + List templates = AkbJcrUtils.getDefinedTemplate(session); + String[] values = new String[templates.size()]; + int i = 0; + for (Node node : templates) { + values[i++] = AkbJcrUtils.get(node, Property.JCR_TITLE); + } + return values; + } + + protected String getActiveEnvName() { + return AkbJcrUtils.isEmptyString(valueTxt.getText()) ? null + : valueTxt.getText(); + } + + protected Node getTemplate() { + int index = chooseTemplateCmb.getSelectionIndex(); + if (index >= 0) { + return AkbJcrUtils.getTemplateByName(session, + chooseTemplateCmb.getItem(index)); + } else + return null; + } + + protected boolean getUseDefaultConnectors() { + return useDefaultConnChk.getSelection(); + } + } +} \ No newline at end of file diff --git a/runtime/org.argeo.slc.akb/src/main/java/org/argeo/slc/akb/AkbService.java b/runtime/org.argeo.slc.akb/src/main/java/org/argeo/slc/akb/AkbService.java index 1f5d998c6..d39e3baa3 100644 --- a/runtime/org.argeo.slc.akb/src/main/java/org/argeo/slc/akb/AkbService.java +++ b/runtime/org.argeo.slc.akb/src/main/java/org/argeo/slc/akb/AkbService.java @@ -4,15 +4,23 @@ import java.sql.PreparedStatement; import javax.jcr.Node; import javax.jcr.NodeIterator; +import javax.jcr.Repository; import javax.jcr.RepositoryException; /** Provides method interfaces to manage an AKB repository */ public interface AkbService { + /** Exposes injected Repository */ + public Repository getRepository(); + /** Creates a pre-configured AKB Template */ public Node createAkbTemplate(Node parent, String name) throws RepositoryException; + /** Creates an instance of a template */ + public Node createActiveEnv(Node template, String name, + boolean copyDefaultConnectors) throws RepositoryException; + /** Creates a new pre-configured AKB connector Alias for the given template */ public Node createConnectorAlias(Node templateNode, String name, String connectorType) throws RepositoryException; @@ -27,6 +35,7 @@ public interface AkbService { public NodeIterator getDefinedAliases(Node templateNode, String connectorType) throws RepositoryException; + /** * @param envNode * an environment or a template diff --git a/runtime/org.argeo.slc.akb/src/main/java/org/argeo/slc/akb/core/AkbServiceImpl.java b/runtime/org.argeo.slc.akb/src/main/java/org/argeo/slc/akb/core/AkbServiceImpl.java index b28437028..83de7294c 100644 --- a/runtime/org.argeo.slc.akb/src/main/java/org/argeo/slc/akb/core/AkbServiceImpl.java +++ b/runtime/org.argeo.slc.akb/src/main/java/org/argeo/slc/akb/core/AkbServiceImpl.java @@ -112,20 +112,67 @@ public class AkbServiceImpl implements AkbService, AkbNames { @Override public Node createAkbTemplate(Node parentNode, String name) throws RepositoryException { - String connectorParentName = "Connectors"; - Node newTemplate = parentNode.addNode(name, AkbTypes.AKB_ENV_TEMPLATE); newTemplate.setProperty(Property.JCR_TITLE, name); - Node connectorParent = newTemplate.addNode( - AkbTypes.AKB_CONNECTOR_FOLDER, AkbTypes.AKB_CONNECTOR_FOLDER); - connectorParent.setProperty(Property.JCR_TITLE, connectorParentName); + // Node connectorParent = + newTemplate.addNode(AkbTypes.AKB_CONNECTOR_FOLDER, + AkbTypes.AKB_CONNECTOR_FOLDER); + // connectorParent.setProperty(Property.JCR_TITLE, connectorParentName); return newTemplate; } + // ////////////////////////// + // ENVIRONMENTS + @Override + public Node createActiveEnv(Node template, String name, + boolean copyDefaultConnectors) throws RepositoryException { + + Session session = template.getSession(); + Node parentEnvNode = session.getNode(AKB_ENVIRONMENTS_BASE_PATH); + Node createdEnv = parentEnvNode.addNode(name, AkbTypes.AKB_ENV); + createdEnv.setProperty(AKB_ENV_TEMPLATE_PATH, template.getPath()); + createdEnv.setProperty(Property.JCR_TITLE, name); + + Node connectorParent = createdEnv.addNode( + AkbTypes.AKB_CONNECTOR_FOLDER, AkbTypes.AKB_CONNECTOR_FOLDER); + + NodeIterator ni = template.getNode(AkbTypes.AKB_CONNECTOR_FOLDER) + .getNodes(); + while (ni.hasNext()) { + Node currNode = ni.nextNode(); + if (currNode.isNodeType(AkbTypes.AKB_CONNECTOR_ALIAS)) { + Node newConnector = connectorParent.addNode(currNode.getName(), + AkbTypes.AKB_CONNECTOR); + newConnector.setProperty(AKB_CONNECTOR_ALIAS_PATH, + currNode.getPath()); + if (copyDefaultConnectors + && currNode + .hasNode(AkbNames.AKB_DEFAULT_TEST_CONNECTOR)) { + Node defaultConn = currNode + .getNode(AkbNames.AKB_DEFAULT_TEST_CONNECTOR); + if (defaultConn.hasProperty(AkbNames.AKB_CONNECTOR_URL)) + newConnector + .setProperty( + AkbNames.AKB_CONNECTOR_URL, + defaultConn.getProperty( + AkbNames.AKB_CONNECTOR_URL) + .getString()); + if (defaultConn.hasProperty(AkbNames.AKB_CONNECTOR_USER)) + newConnector.setProperty( + AkbNames.AKB_CONNECTOR_USER, + defaultConn.getProperty( + AkbNames.AKB_CONNECTOR_USER) + .getString()); + } + } + } + return createdEnv; + } + // /////////////////////////////////////// - // / CONNECTORS + // CONNECTORS @Override public Node createConnectorAlias(Node templateNode, String name, @@ -139,7 +186,8 @@ public class AkbServiceImpl implements AkbService, AkbNames { // Node defaultConnector = Node defaultConn = newConnector.addNode( AkbNames.AKB_DEFAULT_TEST_CONNECTOR, connectorType); - defaultConn.setProperty(AkbNames.AKB_CONNECTOR_ALIAS_PATH, newConnector.getPath()); + defaultConn.setProperty(AkbNames.AKB_CONNECTOR_ALIAS_PATH, + newConnector.getPath()); return newConnector; } @@ -294,10 +342,15 @@ public class AkbServiceImpl implements AkbService, AkbNames { String sqlQuery = node.getProperty(AKB_QUERY_TEXT).getString(); - String connectorUrl = connectorNode.getProperty( - AKB_CONNECTOR_URL).getString(); - String connectorUser = connectorNode.getProperty( - AKB_CONNECTOR_USER).getString(); + String connectorUrl = AkbJcrUtils.get(connectorNode, + AKB_CONNECTOR_URL); + String connectorUser = AkbJcrUtils.get(connectorNode, + AKB_CONNECTOR_USER); + + // Sanity check + if (AkbJcrUtils.isEmptyString(connectorUrl) + || AkbJcrUtils.isEmptyString(connectorUser)) + return null; String pwdPath = getPasswordPath(connectorNode); // String pwdPath = connectorNode.getPath() + '/' @@ -337,10 +390,16 @@ public class AkbServiceImpl implements AkbService, AkbNames { String command = node.getProperty(AkbNames.AKB_COMMAND_TEXT) .getString(); - String connectorUrl = connectorNode.getProperty(AKB_CONNECTOR_URL) - .getString(); - String connectorUser = connectorNode - .getProperty(AKB_CONNECTOR_USER).getString(); + String connectorUrl = AkbJcrUtils.get(connectorNode, + AKB_CONNECTOR_URL); + String connectorUser = AkbJcrUtils.get(connectorNode, + AKB_CONNECTOR_USER); + + // Sanity check + if (AkbJcrUtils.isEmptyString(connectorUrl) + || AkbJcrUtils.isEmptyString(connectorUser)) + return null; + String pwdPath = getPasswordPath(connectorNode); char[] pwd = keyring.getAsChars(pwdPath); @@ -396,10 +455,16 @@ public class AkbServiceImpl implements AkbService, AkbNames { connectorAliasStr); // TODO do a proper scp - String connectorUrl = connectorNode.getProperty(AKB_CONNECTOR_URL) - .getString(); - String connectorUser = connectorNode - .getProperty(AKB_CONNECTOR_USER).getString(); + String connectorUrl = AkbJcrUtils.get(connectorNode, + AKB_CONNECTOR_URL); + String connectorUser = AkbJcrUtils.get(connectorNode, + AKB_CONNECTOR_USER); + + // Sanity check + if (AkbJcrUtils.isEmptyString(connectorUrl) + || AkbJcrUtils.isEmptyString(connectorUser)) + return null; + String pwdPath = getPasswordPath(connectorNode); char[] pwd = keyring.getAsChars(pwdPath); @@ -458,10 +523,10 @@ public class AkbServiceImpl implements AkbService, AkbNames { } - // /** Expose injected repository */ - // public Repository getRepository() { - // return repository; - // } + /** Expose injected repository */ + public Repository getRepository() { + return repository; + } /* DEPENDENCY INJECTION */ public void setRepository(Repository repository) { 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 d597dc509..b7d0ba7df 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 @@ -13,16 +13,8 @@ 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.QueryObjectModelConstants; -import javax.jcr.query.qom.QueryObjectModelFactory; -import javax.jcr.query.qom.Selector; import org.argeo.jcr.JcrUtils; import org.argeo.jcr.PropertyDiff; @@ -35,6 +27,51 @@ public class AkbJcrUtils { // ///////////////////////// // SPECIFIC METHOS + /** + * Returns the list of environment templates that are visible for the + * current user. + */ + public static List getDefinedTemplate(Session session) { + try { + if (session.nodeExists(AkbNames.AKB_TEMPLATES_BASE_PATH)) { + NodeIterator ni = session.getNode( + AkbNames.AKB_TEMPLATES_BASE_PATH).getNodes(); + List templates = new ArrayList(); + while (ni.hasNext()) { + Node currN = ni.nextNode(); + if (currN.isNodeType(AkbTypes.AKB_ENV_TEMPLATE)) + templates.add(currN); + } + return templates; + } + return null; + } catch (RepositoryException re) { + throw new AkbException("Unable to list templates", re); + } + } + + /** + * Returns a template given it's name + */ + public static Node getTemplateByName(Session session, String name) { + try { + if (name == null) + return null; + if (session.nodeExists(AkbNames.AKB_TEMPLATES_BASE_PATH)) { + NodeIterator ni = session.getNode( + AkbNames.AKB_TEMPLATES_BASE_PATH).getNodes(); + while (ni.hasNext()) { + Node currN = ni.nextNode(); + if (name.equals(AkbJcrUtils.get(currN, Property.JCR_TITLE))) + return currN; + } + } + return null; + } catch (RepositoryException re) { + throw new AkbException("Unable to list templates", re); + } + } + /** * Return the type of alias that must be used given current item type */ @@ -53,51 +90,6 @@ public class AkbJcrUtils { } } - /** - * Return defined alias in the current environment given current item type - */ - @Deprecated - public static List getDefinedAliasForNode(Node itemTemplate) { - try { - Session session = itemTemplate.getSession(); - QueryManager queryManager = session.getWorkspace() - .getQueryManager(); - QueryObjectModelFactory factory = queryManager.getQOMFactory(); - - Selector source = factory.selector(AkbTypes.AKB_CONNECTOR_ALIAS, - AkbTypes.AKB_CONNECTOR_ALIAS); - String basePath = getCurrentEnvBasePath(itemTemplate); - Constraint defaultC = factory.descendantNode( - source.getSelectorName(), basePath); - - String nodeType = getAliasTypeForNode(itemTemplate); - Constraint connType = factory.comparison(factory.propertyValue( - source.getSelectorName(), AkbNames.AKB_CONNECTOR_TYPE), - QueryObjectModelConstants.JCR_OPERATOR_EQUAL_TO, factory - .literal(session.getValueFactory().createValue( - nodeType))); - - // 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, - factory.and(defaultC, connType), 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 current template depending on the passed node */