/*******************************************************************************
* 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;
import com.google.gwt.user.client.Timer;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import com.google.web.bindery.event.shared.EventBus;
import org.eclipse.che.api.workspace.shared.dto.ProjectConfigDto;
import org.eclipse.che.ide.api.action.ActionManager;
import org.eclipse.che.ide.api.action.DefaultActionGroup;
import org.eclipse.che.ide.api.action.IdeActions;
import org.eclipse.che.ide.api.constraints.Anchor;
import org.eclipse.che.ide.api.constraints.Constraints;
import org.eclipse.che.ide.api.event.project.ProjectReadyEvent;
import org.eclipse.che.ide.api.event.project.ProjectReadyHandler;
import org.eclipse.che.ide.api.extension.Extension;
import org.eclipse.che.ide.api.filetypes.FileType;
import org.eclipse.che.ide.api.filetypes.FileTypeRegistry;
import org.eclipse.che.ide.api.project.node.HasProjectConfig;
import org.eclipse.che.ide.api.project.node.Node;
import org.eclipse.che.ide.api.project.type.wizard.PreSelectedProjectTypeManager;
import org.eclipse.che.ide.ext.java.client.dependenciesupdater.DependenciesUpdater;
import org.eclipse.che.ide.ext.java.client.project.node.JavaNodeManager;
import org.eclipse.che.ide.extension.machine.client.machine.events.MachineStateEvent;
import org.eclipse.che.ide.extension.machine.client.machine.events.MachineStateHandler;
import org.eclipse.che.ide.extension.maven.client.actions.CreateMavenModuleAction;
import org.eclipse.che.ide.extension.maven.client.actions.UpdateDependencyAction;
import org.eclipse.che.ide.extension.maven.shared.MavenAttributes;
import org.eclipse.che.ide.part.explorer.project.ProjectExplorerPresenter;
import org.eclipse.che.ide.project.node.AbstractProjectBasedNode;
import org.eclipse.che.ide.project.node.ModuleNode;
import org.eclipse.che.ide.project.node.ProjectNode;
import org.eclipse.che.ide.ui.smartTree.event.BeforeLoadEvent;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
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 Zatsarynnyi
*/
@Singleton
@Extension(title = "Maven", version = "3.0.0")
public class MavenExtension {
private static List<MavenArchetype> archetypes;
private ProjectConfigDto project;
@Inject
public MavenExtension(PreSelectedProjectTypeManager preSelectedProjectManager) {
preSelectedProjectManager.setProjectTypeIdToPreselect(MavenAttributes.MAVEN_ID, 100);
archetypes =
Arrays.asList(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 List<MavenArchetype> getAvailableArchetypes() {
return archetypes;
}
@Inject
private void bindEvents(final EventBus eventBus,
final DependenciesUpdater dependenciesUpdater,
final ProjectExplorerPresenter projectExplorerPresenter) {
projectExplorerPresenter.addBeforeNodeLoadHandler(new BeforeLoadEvent.BeforeLoadHandler() {
@Override
public void onBeforeLoad(BeforeLoadEvent event) {
Node node = event.getRequestedNode();
if (!projectExplorerPresenter.isLoaded(node) && JavaNodeManager.isJavaProject(node) && isValid(node)) {
dependenciesUpdater.updateDependencies(((HasProjectConfig)node).getProjectConfig());
}
}
});
eventBus.addHandler(ProjectReadyEvent.TYPE, new ProjectReadyHandler() {
@Override
public void onProjectReady(ProjectReadyEvent event) {
project = event.getProjectConfig();
if (isValidForResolveDependencies(project)) {
dependenciesUpdater.updateDependencies(project);
}
}
});
eventBus.addHandler(MachineStateEvent.TYPE, new MachineStateHandler() {
@Override
public void onMachineRunning(MachineStateEvent event) {
if (project != null) {
if (isValidForResolveDependencies(project)) {
new Timer() {
@Override
public void run() {
dependenciesUpdater.updateDependencies(project);
}
}.schedule(5000);
}
}
}
@Override
public void onMachineDestroyed(MachineStateEvent event) {
}
});
}
private boolean isValid(Node node) {
ProjectConfigDto projectConfig = null;
if (node instanceof ModuleNode) {
AbstractProjectBasedNode abstractNode = (AbstractProjectBasedNode)node;
projectConfig = (ProjectConfigDto)abstractNode.getData();
}
if (node instanceof ProjectNode) {
AbstractProjectBasedNode abstractNode = (AbstractProjectBasedNode)node;
projectConfig = (ProjectConfigDto)abstractNode.getData();
}
if (projectConfig == null) {
return false;
}
Map<String, List<String>> attr = projectConfig.getAttributes();
return attr.containsKey(MavenAttributes.PACKAGING) && !"pom".equals(attr.get(MavenAttributes.PACKAGING).get(0));
}
@Inject
private void prepareActions(ActionManager actionManager,
UpdateDependencyAction updateDependencyAction,
CreateMavenModuleAction createMavenModuleAction) {
// register actions
actionManager.registerAction("updateDependency", updateDependencyAction);
actionManager.registerAction("createMavenModule", createMavenModuleAction);
// add actions in main menu
DefaultActionGroup assistantGroup = (DefaultActionGroup)actionManager.getAction(IdeActions.GROUP_ASSISTANT);
assistantGroup.add(updateDependencyAction, Constraints.LAST);
DefaultActionGroup newGroup = (DefaultActionGroup)actionManager.getAction(GROUP_FILE_NEW);
newGroup.add(createMavenModuleAction, new Constraints(Anchor.AFTER, "newJavaPackage"));
// add actions in context menu
DefaultActionGroup buildContextMenuGroup = (DefaultActionGroup)actionManager.getAction(GROUP_BUILD_CONTEXT_MENU);
buildContextMenuGroup.addSeparator();
buildContextMenuGroup.addAction(updateDependencyAction);
}
@Inject
private void registerFileType(FileTypeRegistry fileTypeRegistry, MavenResources mavenResources) {
fileTypeRegistry.registerFileType(new FileType(mavenResources.maven(), "pom.xml"));
}
private boolean isValidForResolveDependencies(ProjectConfigDto project) {
Map<String, List<String>> attr = project.getAttributes();
return !(attr.containsKey(MavenAttributes.PACKAGING) && "pom".equals(attr.get(MavenAttributes.PACKAGING).get(0)));
}
}