--- /dev/null
+package org.argeo.slc.client.ui.dist.wizards;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.jcr.Node;
+import javax.jcr.NodeIterator;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.argeo.cms.ui.workbench.util.PrivilegedJob;
+import org.argeo.eclipse.ui.EclipseJcrMonitor;
+import org.argeo.jcr.JcrMonitor;
+import org.argeo.jcr.JcrUtils;
+import org.argeo.slc.SlcException;
+import org.argeo.slc.SlcTypes;
+import org.argeo.slc.client.ui.dist.DistPlugin;
+import org.argeo.slc.client.ui.dist.utils.ViewerUtils;
+import org.argeo.slc.repo.RepoConstants;
+import org.argeo.slc.repo.RepoService;
+import org.argeo.slc.repo.RepoUtils;
+import org.argeo.slc.repo.maven.GenerateBinaries;
+import org.eclipse.aether.artifact.Artifact;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.dialogs.IMessageProvider;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.ColumnLabelProvider;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.TableViewerColumn;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerComparator;
+import org.eclipse.jface.wizard.IWizardPage;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * Define parameters to asynchronously generate binaries, sources and sdk pom
+ * artifacts for this group using a {@link GenerateBinaries} runnable
+ */
+public class GenerateBinariesWizard extends Wizard {
+ private final static Log log = LogFactory
+ .getLog(GenerateBinariesWizard.class);
+
+ // Business objects
+ private final RepoService repoService;
+ private final String repoNodePath;
+ private String wkspName;
+ private String groupNodePath;
+
+ // The pages
+ private RecapPage recapPage;
+
+ // Controls with parameters
+ private Text versionTxt;
+ private Text latestVersionTxt;
+ private Text highestArtifactVersionTxt;
+
+ public GenerateBinariesWizard(RepoService repoService, String repoNodePath,
+ String wkspName, String groupNodePath) {
+ super();
+ this.repoService = repoService;
+ this.repoNodePath = repoNodePath;
+ this.wkspName = wkspName;
+ this.groupNodePath = groupNodePath;
+ }
+
+ @Override
+ public void dispose() {
+ super.dispose();
+ }
+
+ @Override
+ public void addPages() {
+ try {
+ recapPage = new RecapPage();
+ addPage(recapPage);
+ setWindowTitle("Define Binary Generation Procedure");
+ } catch (Exception e) {
+ throw new SlcException("Cannot add page to wizard ", e);
+ }
+ }
+
+ @Override
+ public boolean performFinish() {
+ if (!canFinish())
+ return false;
+ try {
+ String msg = "Your are about to generate binaries, sources and sdk "
+ + "pom artifacts for this group, "
+ + "do you really want to proceed ?";
+
+ boolean result = MessageDialog.openConfirm(DistPlugin.getDefault()
+ .getWorkbench().getDisplay().getActiveShell(),
+ "Confirm Launch", msg);
+
+ if (result) {
+ GenerateBinaryJob job = new GenerateBinaryJob(repoService,
+ repoNodePath, wkspName, groupNodePath,
+ versionTxt.getText());
+ job.setUser(true);
+ job.schedule();
+ }
+ } catch (Exception e) {
+ throw new SlcException(
+ "Unexpected error while launching the fetch", e);
+ }
+ return true;
+ }
+
+ // ///////////////////////////////
+ // ////// THE PAGES
+ private class RecapPage extends WizardPage {
+ private static final long serialVersionUID = 904196417910874087L;
+ private TableViewer recapViewer;
+
+ public RecapPage() {
+ super("Define parameters and launch");
+ setTitle("Define parameters and launch");
+ }
+
+ @Override
+ public boolean isPageComplete() {
+ return isCurrentPage();
+ }
+
+ public IWizardPage getNextPage() {
+ return null; // always last
+ }
+
+ private void refreshValues() {
+ Session session = null;
+ try {
+ session = repoService.getRemoteSession(repoNodePath, null,
+ wkspName);
+ Node groupNode = session.getNode(groupNodePath);
+ GenerateBinaries gb = GenerateBinaries.preProcessGroupNode(
+ groupNode, null);
+
+ List<Artifact> binaries = new ArrayList<Artifact>();
+ binaries.addAll(gb.getBinaries());
+
+ Artifact highestVersion = gb.getHighestArtifactVersion();
+ if (highestVersion != null)
+ highestArtifactVersionTxt.setText(highestVersion
+ .getBaseVersion());
+
+ if (groupNode.hasNode(RepoConstants.BINARIES_ARTIFACT_ID)) {
+ Node binaryNode = groupNode
+ .getNode(RepoConstants.BINARIES_ARTIFACT_ID);
+ Artifact currHighestVersion = null;
+ for (NodeIterator ni = binaryNode.getNodes(); ni.hasNext();) {
+ Node currN = ni.nextNode();
+ if (currN
+ .isNodeType(SlcTypes.SLC_ARTIFACT_VERSION_BASE)) {
+ Artifact currVersion = RepoUtils.asArtifact(currN);
+
+ if (currHighestVersion == null
+ || currVersion.getBaseVersion()
+ .compareTo(
+ currHighestVersion
+ .getBaseVersion()) > 0)
+ currHighestVersion = currVersion;
+ }
+ }
+ if (currHighestVersion != null)
+ latestVersionTxt.setText(currHighestVersion
+ .getBaseVersion());
+ }
+ recapViewer.setInput(binaries);
+ recapViewer.refresh();
+ } catch (RepositoryException re) {
+ throw new SlcException("Unable to get repositories URIs", re);
+ } finally {
+ JcrUtils.logoutQuietly(session);
+ }
+ }
+
+ public void createControl(Composite parent) {
+ setMessage("Configure Maven Indexing", IMessageProvider.NONE);
+
+ Composite composite = new Composite(parent, SWT.NO_FOCUS);
+ composite.setLayout(new GridLayout(2, false));
+
+ versionTxt = createLT(composite, "Version");
+ versionTxt
+ .setToolTipText("Enter a version for the new Modular Distribution");
+
+ latestVersionTxt = createLT(composite, "Latest version");
+ latestVersionTxt.setEditable(false);
+ latestVersionTxt
+ .setToolTipText("The actual latest version of this modular distribution");
+
+ highestArtifactVersionTxt = createLT(composite,
+ "Highest version in current category");
+ highestArtifactVersionTxt.setEditable(false);
+ highestArtifactVersionTxt
+ .setToolTipText("The highest version among all version of the below listed modules.");
+
+ // Creates the table
+ Table table = new Table(composite, SWT.H_SCROLL | SWT.V_SCROLL
+ | SWT.BORDER);
+ table.setLinesVisible(true);
+ table.setHeaderVisible(true);
+ table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2,
+ 1));
+ recapViewer = new TableViewer(table);
+
+ TableViewerColumn column = ViewerUtils.createTableViewerColumn(
+ recapViewer, "Name", SWT.NONE, 250);
+ column.setLabelProvider(new ColumnLabelProvider() {
+ private static final long serialVersionUID = -9145709097621022043L;
+
+ @Override
+ public String getText(Object element) {
+ return ((Artifact) element).getArtifactId();
+ }
+ });
+
+ column = ViewerUtils.createTableViewerColumn(recapViewer,
+ "Version", SWT.NONE, 250);
+ column.setLabelProvider(new ColumnLabelProvider() {
+ private static final long serialVersionUID = 5524185741667651628L;
+
+ @Override
+ public String getText(Object element) {
+ return ((Artifact) element).getBaseVersion();
+ }
+ });
+
+ recapViewer.setContentProvider(new IStructuredContentProvider() {
+ private static final long serialVersionUID = -4579434453554442858L;
+
+
+ List<Artifact> artifacts;
+
+ @SuppressWarnings("unchecked")
+ public void inputChanged(Viewer viewer, Object oldInput,
+ Object newInput) {
+ artifacts = (List<Artifact>) newInput;
+ if (artifacts != null)
+ recapViewer.refresh();
+ }
+
+ public void dispose() {
+ }
+
+ public Object[] getElements(Object inputElement) {
+ return artifacts == null ? null : artifacts.toArray();
+ }
+ });
+
+ // A basic comparator
+ recapViewer.setComparator(new ViewerComparator());
+ refreshValues();
+ setControl(composite);
+ }
+ }
+
+ /**
+ * Define the privileged job that will be run asynchronously generate
+ * corresponding artifacts
+ */
+ private class GenerateBinaryJob extends PrivilegedJob {
+
+ private final RepoService repoService;
+ private final String repoNodePath;
+ private final String wkspName;
+ private final String groupNodePath;
+ private final String version;
+
+ public GenerateBinaryJob(RepoService repoService, String repoNodePath,
+ String wkspName, String groupNodePath, String version) {
+ super("Fetch");
+ this.version = version;
+ this.repoService = repoService;
+ this.repoNodePath = repoNodePath;
+ this.wkspName = wkspName;
+ this.groupNodePath = groupNodePath;
+ }
+
+ @Override
+ protected IStatus doRun(IProgressMonitor progressMonitor) {
+ Session session = null;
+ try {
+ JcrMonitor monitor = new EclipseJcrMonitor(progressMonitor);
+ session = repoService.getRemoteSession(repoNodePath, null,
+ wkspName);
+ Node groupBaseNode = session.getNode(groupNodePath);
+ GenerateBinaries.processGroupNode(groupBaseNode, version,
+ monitor);
+ } catch (Exception e) {
+ if (log.isDebugEnabled())
+ e.printStackTrace();
+ return new Status(IStatus.ERROR, DistPlugin.PLUGIN_ID,
+ "Cannot normalize group", e);
+ } finally {
+ JcrUtils.logoutQuietly(session);
+ }
+ return Status.OK_STATUS;
+ }
+ }
+
+ // ////////////////////////////
+ // // Helpers
+ /** 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
+ | SWT.NONE);
+ text.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ return text;
+ }
+
+ /** Creates label and check. */
+ protected Button createLC(Composite parent, String label) {
+ new Label(parent, SWT.NONE).setText(label);
+ Button check = new Button(parent, SWT.CHECK);
+ check.setSelection(false);
+ check.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ return check;
+ }
+}
\ No newline at end of file