/******************************************************************************* * 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; 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.ProjectDescriptor; import org.eclipse.che.ide.api.action.ActionManager; import org.eclipse.che.ide.api.action.DefaultActionGroup; import org.eclipse.che.ide.api.constraints.Anchor; import org.eclipse.che.ide.api.constraints.Constraints; import org.eclipse.che.ide.api.event.FileEvent; import org.eclipse.che.ide.api.event.FileEventHandler; import org.eclipse.che.ide.api.event.ProjectActionEvent; import org.eclipse.che.ide.api.event.ProjectActionHandler; import org.eclipse.che.ide.api.event.RefreshProjectTreeEvent; import org.eclipse.che.ide.api.extension.Extension; import org.eclipse.che.ide.api.icon.Icon; import org.eclipse.che.ide.api.icon.IconRegistry; import org.eclipse.che.ide.api.project.tree.TreeStructureProviderRegistry; import org.eclipse.che.ide.api.project.tree.generic.ProjectNode; import org.eclipse.che.ide.api.project.type.wizard.PreSelectedProjectTypeManager; import org.eclipse.che.ide.collections.Array; import org.eclipse.che.ide.collections.Collections; import org.eclipse.che.ide.ext.java.client.dependenciesupdater.DependenciesUpdater; import org.eclipse.che.ide.extension.maven.client.actions.CreateMavenModuleAction; import org.eclipse.che.ide.extension.maven.client.actions.CustomBuildAction; import org.eclipse.che.ide.extension.maven.client.actions.UpdateDependencyAction; import org.eclipse.che.ide.extension.maven.client.event.BeforeModuleOpenEvent; import org.eclipse.che.ide.extension.maven.client.event.BeforeModuleOpenHandler; import org.eclipse.che.ide.extension.maven.client.projecttree.MavenProjectTreeStructureProvider; import org.eclipse.che.ide.extension.maven.shared.MavenAttributes; import org.eclipse.che.ide.rest.AsyncRequestCallback; import org.eclipse.che.ide.rest.DtoUnmarshallerFactory; import org.eclipse.che.ide.rest.Unmarshallable; 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 java.util.List; import java.util.Map; import static org.eclipse.che.ide.api.action.IdeActions.GROUP_BUILD; import static org.eclipse.che.ide.api.action.IdeActions.GROUP_BUILD_CONTEXT_MENU; import static org.eclipse.che.ide.api.action.IdeActions.GROUP_FILE_NEW; /** * Maven extension entry point. * * @author Artem Zatsarynnyy */ @Singleton @Extension(title = "Maven", version = "3.0.0") public class MavenExtension { private static Array<MavenArchetype> archetypes; @Inject public MavenExtension(TreeStructureProviderRegistry treeStructureProviderRegistry, PreSelectedProjectTypeManager preSelectedProjectManager) { treeStructureProviderRegistry.associateProjectTypeToTreeProvider(MavenAttributes.MAVEN_ID, MavenProjectTreeStructureProvider.ID); preSelectedProjectManager.setProjectTypeIdToPreselect(MavenAttributes.MAVEN_ID, 100); archetypes = Collections.createArray(new MavenArchetype("org.apache.maven.archetypes", "maven-archetype-quickstart", "RELEASE", null), new MavenArchetype("org.apache.maven.archetypes", "maven-archetype-webapp", "RELEASE", null), new MavenArchetype("org.apache.openejb.maven", "tomee-webapp-archetype", "1.7.1", null)); } public static Array<MavenArchetype> getAvailableArchetypes() { return archetypes; } @Inject private void bindEvents(final EventBus eventBus, final DependenciesUpdater dependenciesUpdater, final ProjectServiceClient projectServiceClient, final DtoUnmarshallerFactory dtoUnmarshallerFactory) { eventBus.addHandler(BeforeModuleOpenEvent.TYPE, new BeforeModuleOpenHandler() { @Override public void onBeforeModuleOpen(BeforeModuleOpenEvent event) { if (isValidForResolveDependencies(event.getModule().getProject().getData())) { dependenciesUpdater.updateDependencies(event.getModule().getData(), false); } } }); eventBus.addHandler(FileEvent.TYPE, new FileEventHandler() { @Override public void onFileOperation(final FileEvent event) { if (event.getOperationType() == FileEvent.FileOperation.SAVE && "pom.xml".equals(event.getFile().getName()) && isValidForResolveDependencies(event.getFile().getProject().getData())) { final ProjectNode project = event.getFile().getProject(); dependenciesUpdater.updateDependencies(project.getData(), true); final Unmarshallable<ProjectDescriptor> unmarshaller = dtoUnmarshallerFactory.newUnmarshaller(ProjectDescriptor.class); projectServiceClient.getProject( project.getData().getPath(), new AsyncRequestCallback<ProjectDescriptor>(unmarshaller) { @Override protected void onSuccess(ProjectDescriptor result) { if (!result.getAttributes().equals(project.getData().getAttributes())) { project.setData(result); eventBus.fireEvent(new RefreshProjectTreeEvent(project)); } } @Override protected void onFailure(Throwable exception) { Log.info(getClass(), "Unable to get the project.", exception); } }); } } }); eventBus.addHandler(ProjectActionEvent.TYPE, new ProjectActionHandler() { @Override public void onProjectOpened(ProjectActionEvent event) { ProjectDescriptor project = event.getProject(); if (isValidForResolveDependencies(project)) { dependenciesUpdater.updateDependencies(project, false); } } @Override public void onProjectClosed(ProjectActionEvent event) { } }); } @Inject private void prepareActions(ActionManager actionManager, CustomBuildAction customBuildAction, UpdateDependencyAction updateDependencyAction, MavenLocalizationConstant mavenLocalizationConstants, CreateMavenModuleAction createMavenModuleAction) { // register actions actionManager.registerAction(mavenLocalizationConstants.buildProjectControlId(), customBuildAction); actionManager.registerAction("updateDependency", updateDependencyAction); actionManager.registerAction("createMavenModule", createMavenModuleAction); // add actions in main menu DefaultActionGroup buildMenuActionGroup = (DefaultActionGroup)actionManager.getAction(GROUP_BUILD); buildMenuActionGroup.add(customBuildAction); buildMenuActionGroup.add(updateDependencyAction); DefaultActionGroup newGroup = (DefaultActionGroup)actionManager.getAction(GROUP_FILE_NEW); newGroup.add(createMavenModuleAction, new Constraints(Anchor.AFTER, "newProject")); // add actions in context menu DefaultActionGroup buildContextMenuGroup = (DefaultActionGroup)actionManager.getAction(GROUP_BUILD_CONTEXT_MENU); buildContextMenuGroup.addSeparator(); buildContextMenuGroup.addAction(updateDependencyAction); } @Inject private void registerIcons(IconRegistry iconRegistry, MavenResources mavenResources) { iconRegistry.registerIcon(new Icon("maven.module", mavenResources.module())); // icons for file names iconRegistry.registerIcon(new Icon("maven/pom.xml.file.small.icon", mavenResources.maven())); } private boolean isValidForResolveDependencies(ProjectDescriptor project) { Map<String, List<String>> attr = project.getAttributes(); BuildersDescriptor builders = project.getBuilders(); return builders != null && "maven".equals(builders.getDefault()) && !(attr.containsKey(MavenAttributes.PACKAGING) && "pom".equals(attr.get(MavenAttributes.PACKAGING).get(0))); } }