X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=plugins%2Forg.argeo.slc.client.ui.dist%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fslc%2Fclient%2Fui%2Fdist%2Fcommands%2FCreateWorkspace.java;h=681e0fed79dd586dd9075d99108ab4e5b34556ca;hb=460cb0f2be7a8fa92ee6f22564b42a25aac5de4b;hp=2091d57120d91796e04b1719d2dabcbaca774826;hpb=3e2293b11242a1960217a278cfb3409508eb5a5d;p=gpl%2Fargeo-slc.git diff --git a/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/commands/CreateWorkspace.java b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/commands/CreateWorkspace.java index 2091d5712..681e0fed7 100644 --- a/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/commands/CreateWorkspace.java +++ b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/commands/CreateWorkspace.java @@ -16,104 +16,134 @@ package org.argeo.slc.client.ui.dist.commands; import javax.jcr.Credentials; +import javax.jcr.Node; import javax.jcr.Repository; import javax.jcr.RepositoryException; +import javax.jcr.RepositoryFactory; import javax.jcr.Session; import javax.jcr.security.Privilege; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.argeo.ArgeoException; +import org.argeo.eclipse.ui.ErrorFeedback; import org.argeo.jcr.JcrUtils; +import org.argeo.slc.SlcConstants; import org.argeo.slc.client.ui.dist.DistPlugin; import org.argeo.slc.client.ui.dist.utils.CommandHelpers; -import org.argeo.slc.client.ui.dist.views.DistributionsView; -import org.argeo.slc.client.ui.dist.views.DistributionsView.DistributionViewSelectedElement; +import org.argeo.slc.repo.RepoUtils; +import org.argeo.util.security.Keyring; import org.eclipse.core.commands.AbstractHandler; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.InputDialog; -import org.eclipse.ui.IWorkbenchPart; -import org.eclipse.ui.IWorkbenchWindow; +import org.eclipse.jface.resource.ImageDescriptor; +import org.eclipse.ui.handlers.HandlerUtil; /** * Create a new empty workspace in the current repository. */ - public class CreateWorkspace extends AbstractHandler { private static final Log log = LogFactory.getLog(CreateWorkspace.class); + + // Exposes commands meta-info public final static String ID = DistPlugin.ID + ".createWorkspace"; - public final static String DEFAULT_LABEL = "Create new workspace..."; - public final static String DEFAULT_ICON_PATH = "icons/addItem.gif"; + public final static String DEFAULT_LABEL = "Create workspace..."; + public final static ImageDescriptor DEFAULT_ICON = DistPlugin + .getImageDescriptor("icons/addItem.gif"); - private String slcRole = "ROLE_SLC"; + // Parameters + public final static String PARAM_TARGET_REPO_PATH = "targetRepoPath"; + public final static String PARAM_WORKSPACE_PREFIX = "workspacePrefix"; - private Repository repository; - private Credentials credentials; + // DEPENDENCY INJECTION + private RepositoryFactory repositoryFactory; + private Keyring keyring; + private Repository nodeRepository; public Object execute(ExecutionEvent event) throws ExecutionException { - IWorkbenchWindow iww = DistPlugin.getDefault().getWorkbench() - .getActiveWorkbenchWindow(); - String prefix = ""; - - IWorkbenchPart view = iww.getActivePage().getActivePart(); - if (view instanceof DistributionsView) { - DistributionViewSelectedElement dvse = ((DistributionsView) view) - .getSelectedElement(); - if (dvse != null && (dvse.isRepository || dvse.isWorkspaceGroup)) { - repository = dvse.repository; - credentials = dvse.credentials; - prefix = dvse.wkspPrefix; - } - } - if (repository != null) { + String targetRepoPath = event.getParameter(PARAM_TARGET_REPO_PATH); + String prefix = event.getParameter(PARAM_WORKSPACE_PREFIX); + + Session nodeSession = null; + Session session = null; + try { + nodeSession = nodeRepository.login(); + Node repoNode = nodeSession.getNode(targetRepoPath); + Repository repository = RepoUtils.getRepository(repositoryFactory, + keyring, repoNode); + Credentials credentials = RepoUtils.getRepositoryCredentials( + keyring, repoNode); + // TODO : add an input validator - InputDialog inputDialog = new InputDialog(iww.getShell(), + InputDialog inputDialog = new InputDialog(HandlerUtil + .getActiveWorkbenchWindow(event).getShell(), "Workspace name?", - "Choose a name for the workspace to create", prefix + "-", - null); + "Choose a name for the workspace to create", + prefix == null ? "" : prefix + "_", null); int result = inputDialog.open(); - String workspaceName = inputDialog.getValue(); + String enteredName = inputDialog.getValue(); + + final String legalChars = "ABCDEFGHIJKLMNOPQRSTUVWXZY0123456789_"; + char[] arr = enteredName.toUpperCase().toCharArray(); + int count = 0; + for (int i = 0; i < arr.length; i++) { + if (legalChars.indexOf(arr[i]) == -1) + count = count + 7; + else + count++; + } + + if (log.isDebugEnabled()) + log.debug("Count " + count); + + if (count > 60) { + ErrorFeedback.show("Workspace name '" + enteredName + + "' is too long or contains" + + " too many special characters such as '.' or '-'."); + return null; + } + + String workspaceName = enteredName; // Canceled by user if (result == Dialog.CANCEL || workspaceName == null || "".equals(workspaceName.trim())) return null; - Session session = null; - try { - session = repository.login(credentials); - session.getWorkspace().createWorkspace(workspaceName); - JcrUtils.logoutQuietly(session); - // init new workspace - session = repository.login(workspaceName); - JcrUtils.addPrivilege(session, "/", slcRole, Privilege.JCR_ALL); - CommandHelpers.callCommand(RefreshDistributionsView.ID); - } catch (RepositoryException re) { - throw new ArgeoException( - "Unexpected error while creating the new workspace.", - re); - } finally { - JcrUtils.logoutQuietly(session); - } + session = repository.login(credentials); + session.getWorkspace().createWorkspace(workspaceName); + JcrUtils.logoutQuietly(session); + // init new workspace + session = repository.login(credentials, workspaceName); + JcrUtils.addPrivilege(session, "/", SlcConstants.ROLE_SLC, + Privilege.JCR_ALL); + CommandHelpers.callCommand(RefreshDistributionsView.ID); if (log.isTraceEnabled()) log.trace("WORKSPACE " + workspaceName + " CREATED"); + + } catch (RepositoryException re) { + ErrorFeedback.show( + "Unexpected error while creating the new workspace.", re); + } finally { + JcrUtils.logoutQuietly(session); + JcrUtils.logoutQuietly(nodeSession); } return null; } - public void setRepository(Repository repository) { - this.repository = repository; + /* DEPENDENCY INJECTION */ + public void setNodeRepository(Repository nodeRepository) { + this.nodeRepository = nodeRepository; } - public void setCredentials(Credentials credentials) { - this.credentials = credentials; + public void setRepositoryFactory(RepositoryFactory repositoryFactory) { + this.repositoryFactory = repositoryFactory; } - public void setSlcRole(String slcRole) { - this.slcRole = slcRole; + public void setKeyring(Keyring keyring) { + this.keyring = keyring; } } \ No newline at end of file