blob: bcf7cd72e21b6fd9a4bef9e8048c015f406dae4e [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.netbeans.modules.maven.apisupport;
import java.io.File;
import java.io.InputStream;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import javax.swing.Action;
import org.apache.maven.model.Build;
import org.apache.maven.project.MavenProject;
import org.netbeans.api.annotations.common.StaticResource;
import org.netbeans.api.project.Project;
import org.netbeans.modules.apisupport.project.spi.NbModuleProvider;
import org.netbeans.modules.maven.api.FileUtilities;
import org.netbeans.modules.maven.api.NbMavenProject;
import org.netbeans.modules.maven.api.execute.RunConfig;
import org.netbeans.modules.maven.api.execute.RunUtils;
import static org.netbeans.modules.maven.apisupport.Bundle.*;
import org.netbeans.modules.maven.execute.model.NetbeansActionMapping;
import org.netbeans.modules.maven.spi.actions.AbstractMavenActionsProvider;
import org.netbeans.modules.maven.spi.actions.MavenActionsProvider;
import org.netbeans.spi.project.ActionProvider;
import org.netbeans.spi.project.LookupProvider.Registration.ProjectType;
import org.netbeans.spi.project.ProjectServiceProvider;
import org.netbeans.spi.project.ui.support.ProjectSensitiveActions;
import org.openide.DialogDisplayer;
import org.openide.NotifyDescriptor;
import org.openide.awt.ActionID;
import org.openide.awt.ActionReference;
import org.openide.awt.ActionRegistration;
import org.openide.awt.DynamicMenuContent;
import org.openide.filesystems.FileUtil;
import org.openide.util.Lookup;
import org.openide.util.NbBundle.Messages;
/**
*
* @author mkleint
*/
@ProjectServiceProvider(service=MavenActionsProvider.class, projectTypes={
@ProjectType(id="org-netbeans-modules-maven/" + NbMavenProject.TYPE_NBM),
@ProjectType(id="org-netbeans-modules-maven/" + NbMavenProject.TYPE_NBM_APPLICATION)
})
public class NbmActionGoalProvider implements MavenActionsProvider {
static final String NBMRELOAD = "nbmreload";
private static final String RELOAD_TARGET = "reload-target"; // #190469
@StaticResource private static final String PLATFORM_MAPPINGS = "org/netbeans/modules/maven/apisupport/platformActionMappings.xml";
@StaticResource private static final String IDE_MAPPINGS = "org/netbeans/modules/maven/apisupport/ideActionMappings.xml";
private AbstractMavenActionsProvider platformDelegate = new AbstractMavenActionsProvider() {
protected @Override InputStream getActionDefinitionStream() {
return NbmActionGoalProvider.class.getClassLoader().getResourceAsStream(PLATFORM_MAPPINGS);
}
};
private AbstractMavenActionsProvider ideDelegate = new AbstractMavenActionsProvider() {
protected @Override InputStream getActionDefinitionStream() {
return NbmActionGoalProvider.class.getClassLoader().getResourceAsStream(IDE_MAPPINGS);
}
};
public @Override Set<String> getSupportedDefaultActions() {
return new HashSet<String>(Arrays.asList(NBMRELOAD, RELOAD_TARGET));
}
@ActionID(id = "org.netbeans.modules.maven.apisupport.NBMReload", category = "Project")
@ActionRegistration(displayName = "#ACT_NBM_Reload", lazy=false)
@ActionReference(position = 1250, path = "Projects/org-netbeans-modules-maven/Actions")
@Messages("ACT_NBM_Reload=Install/Reload in Development IDE")
public static Action createReloadAction() {
Action a = ProjectSensitiveActions.projectCommandAction(NBMRELOAD, ACT_NBM_Reload(), null);
a.putValue(DynamicMenuContent.HIDE_WHEN_DISABLED, true);
return a;
}
@ActionID(id = "org.netbeans.modules.maven.apisupport.NBMReloadTarget", category = "Project")
@ActionRegistration(displayName = "#ACT_NBM_Reload_Target", lazy=false)
@ActionReference(position = 1225, path = "Projects/org-netbeans-modules-maven/Actions")
@Messages("ACT_NBM_Reload_Target=Reload in Target Platform")
public static Action createReloadTargetAction() {
Action a = ProjectSensitiveActions.projectCommandAction(RELOAD_TARGET, ACT_NBM_Reload_Target(), null);
a.putValue(DynamicMenuContent.HIDE_WHEN_DISABLED, true);
return a;
}
public @Override synchronized boolean isActionEnable(String action, Project project, Lookup lookup) {
if (RELOAD_TARGET.equals(action) || NBMRELOAD.equals(action)) {
return hasNbm(project);
}
if (ActionProvider.COMMAND_RUN.equals(action) || ActionProvider.COMMAND_DEBUG.equals(action) || ActionProvider.COMMAND_PROFILE.equals(action)) {
return hasNbm(project) || isPlatformApp(project);
}
if (ActionProvider.COMMAND_TEST.equals(action)) {
return isPlatformApp(project);
}
return false;
}
@Messages({
"NbmActionGoalProvider.target_platform_not_running=You can only reload a module while running the application.",
"NbmActionGoalProvider.no_app_found=No single open nbm-application project found with a dependency on this module."
})
public @Override RunConfig createConfigForDefaultAction(String actionName,
Project project,
Lookup lookup) {
if (RELOAD_TARGET.equals(actionName) && hasNbm(project)) {
// Cf. ModuleActions.createReloadAction.
Project app = MavenNbModuleImpl.findAppProject(project);
if (app != null) {
if (!FileUtilities.resolveFilePath(FileUtil.toFile(app.getProjectDirectory()), "target/userdir/lock").isFile()) {
DialogDisplayer.getDefault().notify(new NotifyDescriptor.Message(NbmActionGoalProvider_target_platform_not_running(), NotifyDescriptor.WARNING_MESSAGE));
return null;
}
RunConfig rc = platformDelegate.createConfigForDefaultAction(actionName, app, lookup);
assert rc != null;
rc.setPreExecution(RunUtils.createRunConfig(FileUtil.toFile(project.getProjectDirectory()), project, rc.getTaskDisplayName(), Collections.singletonList("package")));
MavenProject prj = project.getLookup().lookup(NbMavenProject.class).getMavenProject();
String nbmBuildDir = PluginBackwardPropertyUtils.getPluginProperty(project, "nbmBuildDir", "nbm", null);
if (nbmBuildDir == null) {
Build build = prj.getBuild();
String directory = build != null ? build.getDirectory() : null;
nbmBuildDir = (directory != null ? directory : "target") + "/nbm";
}
String cluster = PluginBackwardPropertyUtils.getPluginProperty(project, "cluster", "nbm", null);
if (cluster == null) {
cluster = "extra";
}
String codeNameBase = project.getLookup().lookup(NbModuleProvider.class).getCodeNameBase();
File module = FileUtilities.resolveFilePath(FileUtil.toFile(project.getProjectDirectory()), nbmBuildDir + "/netbeans/" + cluster + "/modules/" + codeNameBase.replace('.', '-') + ".jar");
rc.setProperty("module", "'" + module + "'"); // NOI18N
return rc;
} else {
DialogDisplayer.getDefault().notify(new NotifyDescriptor.Message(NbmActionGoalProvider_no_app_found(), NotifyDescriptor.WARNING_MESSAGE));
return null;
}
}
if (!ActionProvider.COMMAND_RUN.equals(actionName) &&
!ActionProvider.COMMAND_DEBUG.equals(actionName) &&
!ActionProvider.COMMAND_PROFILE.equals(actionName) &&
!ActionProvider.COMMAND_TEST.equals(actionName) &&
!NBMRELOAD.equals(actionName)) {
return null;
}
if (isPlatformApp(project)) {
return platformDelegate.createConfigForDefaultAction(actionName, project, lookup);
}
if (hasNbm(project)) {
return ideDelegate.createConfigForDefaultAction(actionName, project, lookup);
}
return null;
}
public @Override NetbeansActionMapping getMappingForAction(String actionName,
Project project) {
if (RELOAD_TARGET.equals(actionName) && hasNbm(project)) {
Project app = MavenNbModuleImpl.findAppProject(project);
if (app != null) {
return platformDelegate.getMappingForAction(actionName, app);
}
}
if (!ActionProvider.COMMAND_RUN.equals(actionName) &&
!ActionProvider.COMMAND_DEBUG.equals(actionName) &&
!ActionProvider.COMMAND_PROFILE.equals(actionName) &&
!ActionProvider.COMMAND_TEST.equals(actionName) &&
!NBMRELOAD.equals(actionName)) {
return null;
}
if (isPlatformApp(project)) {
return platformDelegate.getMappingForAction(actionName, project);
}
if (hasNbm(project)) {
return ideDelegate.getMappingForAction(actionName, project);
}
return null;
}
private boolean hasNbm(Project project) {
NbMavenProject watch = project.getLookup().lookup(NbMavenProject.class);
String pack = watch.getPackagingType();
// boolean isPom = NbMavenProject.TYPE_POM.equals(pack);
boolean hasNbm = NbMavenProject.TYPE_NBM.equals(pack);
//#139279 opening a pom project with a log ot submodules cases this to be
// a heavy perfomance burden.
// we handle platform app and single nbm files automatically, the multimodule ide projects have to be setup
// manually unfortunately.
// if (isPom) {
// SubprojectProvider prov = project.getLookup().lookup(SubprojectProvider.class);
// for (Project prj : prov.getSubprojects()) {
// NbMavenProject w2 = prj.getLookup().lookup(NbMavenProject.class);
// if (NbMavenProject.TYPE_NBM.equals(w2.getPackagingType())) {
// hasNbm = true;
// break;
// }
// }
// }
return hasNbm;
}
private boolean isPlatformApp(Project p) {
NbMavenProject watch = p.getLookup().lookup(NbMavenProject.class);
String pack = watch.getPackagingType();
if (NbMavenProject.TYPE_NBM_APPLICATION.equals(pack)) {
return true;
}
return false;
}
}