/******************************************************************************* * Copyright (c) 2012-2016 Codenvy, S.A. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Codenvy, S.A. - initial API and implementation *******************************************************************************/ package org.eclipse.che.ide.extension.maven.client.module; import com.google.inject.Inject; import com.google.inject.Singleton; import org.eclipse.che.api.project.gwt.client.ProjectServiceClient; import org.eclipse.che.api.project.shared.dto.GeneratorDescription; import org.eclipse.che.api.workspace.shared.dto.ProjectConfigDto; import org.eclipse.che.ide.api.app.AppContext; import org.eclipse.che.ide.api.app.CurrentProject; import org.eclipse.che.ide.api.project.node.HasStorablePath; import org.eclipse.che.ide.api.selection.Selection; import org.eclipse.che.ide.api.selection.SelectionAgent; import org.eclipse.che.ide.dto.DtoFactory; import org.eclipse.che.ide.extension.maven.client.MavenArchetype; import org.eclipse.che.ide.extension.maven.client.MavenExtension; import org.eclipse.che.ide.extension.maven.client.MavenLocalizationConstant; import org.eclipse.che.ide.part.explorer.project.ProjectExplorerPresenter; import org.eclipse.che.ide.project.node.ModuleNode; import org.eclipse.che.ide.project.node.ProjectNode; import org.eclipse.che.ide.rest.AsyncRequestCallback; import org.eclipse.che.ide.rest.DtoUnmarshallerFactory; import org.eclipse.che.ide.ui.dialogs.DialogFactory; import org.eclipse.che.ide.util.NameUtils; import org.eclipse.che.ide.util.loging.Log; import javax.validation.constraints.NotNull; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import static org.eclipse.che.ide.extension.maven.shared.MavenAttributes.ARCHETYPE_GENERATION_STRATEGY; import static org.eclipse.che.ide.extension.maven.shared.MavenAttributes.ARTIFACT_ID; import static org.eclipse.che.ide.extension.maven.shared.MavenAttributes.GROUP_ID; import static org.eclipse.che.ide.extension.maven.shared.MavenAttributes.MAVEN_ID; import static org.eclipse.che.ide.extension.maven.shared.MavenAttributes.PACKAGING; import static org.eclipse.che.ide.extension.maven.shared.MavenAttributes.PARENT_ARTIFACT_ID; import static org.eclipse.che.ide.extension.maven.shared.MavenAttributes.PARENT_GROUP_ID; import static org.eclipse.che.ide.extension.maven.shared.MavenAttributes.PARENT_VERSION; import static org.eclipse.che.ide.extension.maven.shared.MavenAttributes.VERSION; /** * @author Evgen Vidolob * @author Dmitry Shnurenko */ @Singleton public class CreateMavenModulePresenter implements CreateMavenModuleView.ActionDelegate { private final AppContext appContext; private final CreateMavenModuleView view; private final ProjectServiceClient projectService; private final DtoFactory dtoFactory; private final DialogFactory dialogFactory; private final ProjectExplorerPresenter projectExplorer; private final MavenLocalizationConstant locale; private final SelectionAgent selectionAgent; private final DtoUnmarshallerFactory unmarshallerFactory; private String moduleName; private String artifactId; private CurrentProject parentProject; @Inject public CreateMavenModulePresenter(AppContext appContext, CreateMavenModuleView view, ProjectServiceClient projectServiceClient, DtoFactory dtoFactory, DialogFactory dialogFactory, ProjectExplorerPresenter projectExplorer, MavenLocalizationConstant locale, SelectionAgent selectionAgent, DtoUnmarshallerFactory unmarshallerFactory) { this.view = view; this.view.setDelegate(this); this.appContext = appContext; this.projectService = projectServiceClient; this.dtoFactory = dtoFactory; this.dialogFactory = dialogFactory; this.projectExplorer = projectExplorer; this.locale = locale; this.selectionAgent = selectionAgent; this.unmarshallerFactory = unmarshallerFactory; } public void showDialog(@NotNull CurrentProject project) { parentProject = project; view.setParentArtifactId(project.getAttributeValue(ARTIFACT_ID)); view.setGroupId(project.getAttributeValue(GROUP_ID)); view.setVersion(project.getAttributeValue(VERSION)); view.reset(); view.show(); updateViewState(); } @Override public void onClose() { } @Override public void create() { ProjectConfigDto projectConfig = dtoFactory.createDto(ProjectConfigDto.class); projectConfig.setType(MAVEN_ID); Map<String, List<String>> attributes = new HashMap<>(); attributes.put(ARTIFACT_ID, Arrays.asList(artifactId)); attributes.put(GROUP_ID, Arrays.asList(view.getGroupId())); attributes.put(VERSION, Arrays.asList(view.getVersion())); attributes.put(PACKAGING, Arrays.asList(view.getPackaging())); attributes.put(PARENT_ARTIFACT_ID, Arrays.asList(parentProject.getAttributeValue(ARTIFACT_ID))); attributes.put(PARENT_GROUP_ID, Arrays.asList(parentProject.getAttributeValue(GROUP_ID))); attributes.put(PARENT_VERSION, Arrays.asList(parentProject.getAttributeValue(VERSION))); projectConfig.setAttributes(attributes); projectConfig.setName(view.getName()); view.showButtonLoader(true); String pathToSelectedNode = getPathToSelectedNode(); if (pathToSelectedNode.isEmpty()) { showErrorDialog(locale.mavenCreateModuleMultySelectionError()); return; } projectService.createModule(appContext.getWorkspace().getId(), pathToSelectedNode, projectConfig, new AsyncRequestCallback<ProjectConfigDto>( unmarshallerFactory.newUnmarshaller(ProjectConfigDto.class)) { @Override protected void onSuccess(ProjectConfigDto addedModule) { view.close(); view.showButtonLoader(false); Selection<?> selection = selectionAgent.getSelection(); HasStorablePath parentFolder = (HasStorablePath)selection.getHeadElement(); boolean isModule = parentFolder instanceof ModuleNode; boolean isProject = parentFolder instanceof ProjectNode; ProjectConfigDto projectConfigDto = appContext.getCurrentProject().getProjectConfig(); ProjectConfigDto parentConfig = projectConfigDto.findModule(parentFolder.getStorablePath()); if (parentConfig == null) { throw new IllegalArgumentException("Parent folder not found for " + addedModule.getPath()); } parentConfig.getModules().add(addedModule); if (isModule) { projectExplorer.reloadChildren((ModuleNode)parentFolder); } if (isProject) { projectExplorer.reloadChildren((ProjectNode)parentFolder); } } @Override protected void onFailure(Throwable exception) { showErrorDialog(exception.getMessage()); } }); } private String getPathToSelectedNode() { Selection<?> selection = projectExplorer.getSelection(); if (selection.isMultiSelection() || selection.isEmpty()) { return ""; } Object selectedElement = selection.getHeadElement(); if (selectedElement instanceof HasStorablePath) { return ((HasStorablePath)selectedElement).getStorablePath(); } return ""; } private void showErrorDialog(String error) { view.showButtonLoader(false); dialogFactory.createMessageDialog("", error, null).show(); Log.error(CreateMavenModulePresenter.class, error); } @Override public void projectNameChanged(String name) { if (NameUtils.checkProjectName(name)) { moduleName = name; } else { moduleName = null; } updateViewState(); } private void updateViewState() { if (moduleName == null) { view.setNameError(true); view.setCreateButtonEnabled(false); } else { view.setNameError(false); if (artifactId == null) { view.setArtifactIdError(true); view.setCreateButtonEnabled(false); } else { view.setArtifactIdError(false); view.setCreateButtonEnabled(true); } } view.enableArchetypes(view.isGenerateFromArchetypeSelected()); view.setPackagingVisibility(!view.isGenerateFromArchetypeSelected()); } @Override public void artifactIdChanged(String artifactId) { if (NameUtils.checkProjectName(artifactId)) { this.artifactId = artifactId; } else { this.artifactId = null; } updateViewState(); } @Override public void generateFromArchetypeChanged(boolean isGenerateFromArchetype) { updateViewState(); if (!isGenerateFromArchetype) { view.clearArchetypes(); } else { view.setArchetypes(MavenExtension.getAvailableArchetypes()); } } private GeneratorDescription getGeneratorDescription(MavenArchetype archetype) { HashMap<String, String> options = new HashMap<>(); options.put("type", ARCHETYPE_GENERATION_STRATEGY); options.put("archetypeGroupId", archetype.getGroupId()); options.put("archetypeArtifactId", archetype.getArtifactId()); options.put("archetypeVersion", archetype.getVersion()); if (archetype.getRepository() != null) { options.put("archetypeRepository", archetype.getRepository()); } return dtoFactory.createDto(GeneratorDescription.class).withOptions(options); } }