/******************************************************************************* * Copyright (c) 2012-2015 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 org.eclipse.che.api.project.gwt.client.ProjectServiceClient; import org.eclipse.che.api.project.shared.dto.BuildersDescriptor; import org.eclipse.che.api.project.shared.dto.GeneratorDescription; import org.eclipse.che.api.project.shared.dto.NewProject; import org.eclipse.che.api.project.shared.dto.ProjectDescriptor; import org.eclipse.che.ide.api.app.CurrentProject; import org.eclipse.che.ide.api.event.RefreshProjectTreeEvent; 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.rest.AsyncRequestCallback; import org.eclipse.che.ide.ui.dialogs.DialogFactory; import org.eclipse.che.ide.util.NameUtils; import org.eclipse.che.ide.util.loging.Log; import com.google.inject.Inject; import com.google.inject.Singleton; import com.google.web.bindery.event.shared.EventBus; import javax.annotation.Nonnull; 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.DEFAULT_SOURCE_FOLDER; import static org.eclipse.che.ide.extension.maven.shared.MavenAttributes.DEFAULT_TEST_SOURCE_FOLDER; 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.SOURCE_FOLDER; import static org.eclipse.che.ide.extension.maven.shared.MavenAttributes.TEST_SOURCE_FOLDER; import static org.eclipse.che.ide.extension.maven.shared.MavenAttributes.VERSION; /** * @author Evgen Vidolob */ @Singleton public class CreateMavenModulePresenter implements CreateMavenModuleView.ActionDelegate { private CreateMavenModuleView view; private ProjectServiceClient projectService; private DtoFactory dtoFactory; private EventBus eventBus; private DialogFactory dialogFactory; private String moduleName; private String artifactId; private CurrentProject parentProject; @Inject public CreateMavenModulePresenter(CreateMavenModuleView view, ProjectServiceClient projectService, DtoFactory dtoFactory, EventBus eventBus, DialogFactory dialogFactory) { this.view = view; this.projectService = projectService; this.dtoFactory = dtoFactory; this.eventBus = eventBus; this.dialogFactory = dialogFactory; view.setDelegate(this); } public void showDialog(@Nonnull 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() { NewProject newProject = dtoFactory.createDto(NewProject.class); newProject.setType(MAVEN_ID); newProject.setVisibility(parentProject.getProjectDescription().getVisibility()); newProject.setBuilders(dtoFactory.createDto(BuildersDescriptor.class).withDefault("maven")); 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))); newProject.setAttributes(attributes); GeneratorDescription generatorDescription; if (view.isGenerateFromArchetypeSelected()) { generatorDescription = getGeneratorDescription(view.getArchetype()); } else { generatorDescription = dtoFactory.createDto(GeneratorDescription.class); if (!"pom".equals(view.getPackaging())) { attributes.put(SOURCE_FOLDER, Arrays.asList(DEFAULT_SOURCE_FOLDER)); attributes.put(TEST_SOURCE_FOLDER, Arrays.asList(DEFAULT_TEST_SOURCE_FOLDER)); } } newProject.setGeneratorDescription(generatorDescription); view.showButtonLoader(true); projectService.createModule(parentProject.getProjectDescription().getPath(), moduleName, newProject, new AsyncRequestCallback<ProjectDescriptor>() { @Override protected void onSuccess(ProjectDescriptor result) { view.close(); view.showButtonLoader(false); eventBus.fireEvent(new RefreshProjectTreeEvent()); } @Override protected void onFailure(Throwable exception) { view.showButtonLoader(false); dialogFactory.createMessageDialog("", exception.getMessage(), null).show(); Log.error(CreateMavenModulePresenter.class, exception); } }); } @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); } }