blob: d0e45eff03d94bc227409e82611b2661adf280b7 [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.util.Arrays;
import org.apache.maven.artifact.versioning.ComparableVersion;
import org.apache.maven.project.MavenProject;
import org.netbeans.modules.maven.api.NbMavenProject;
import org.netbeans.modules.maven.api.execute.PrerequisitesChecker;
import org.netbeans.modules.maven.api.execute.RunConfig;
import org.netbeans.modules.maven.model.ModelOperation;
import org.netbeans.modules.maven.model.Utilities;
import org.netbeans.modules.maven.model.pom.POMComponentFactory;
import org.netbeans.modules.maven.model.pom.POMModel;
import org.netbeans.modules.maven.model.pom.Project;
import org.netbeans.modules.maven.model.pom.Properties;
import org.netbeans.spi.project.LookupProvider.Registration.ProjectType;
import org.netbeans.spi.project.ProjectServiceProvider;
import org.openide.DialogDisplayer;
import org.openide.NotifyDescriptor;
import org.openide.NotifyDescriptor.Confirmation;
import org.openide.filesystems.FileUtil;
import org.openide.util.NbBundle.Messages;
import static org.netbeans.modules.maven.apisupport.Bundle.*;
import org.netbeans.modules.maven.model.pom.Build;
import org.netbeans.modules.maven.model.pom.Plugin;
/**
* Ensures that {@code netbeans.run.params.ide} will be interpolated into {@code netbeans.run.params}.
*/
@ProjectServiceProvider(service=PrerequisitesChecker.class, projectTypes={
@ProjectType(id="org-netbeans-modules-maven/" + NbMavenProject.TYPE_NBM_APPLICATION), // cf. platformActionMappings.xml
@ProjectType(id="org-netbeans-modules-maven/" + NbMavenProject.TYPE_NBM) // cf. ideActionMappings.xml
})
public class NetBeansRunParamsIDEChecker implements PrerequisitesChecker {
private static final String MASTER_PROPERTY = "netbeans.run.params"; // NOI18N
static final String OLD_PROPERTY = "netbeans.run.params.ide"; // NOI18N
static final String PROPERTY = "netbeans.run.params.debug"; // NOI18N - since nbm-maven-plugin 3.11.1
public @Override boolean checkRunConfig(RunConfig config) {
String val = config.getProperties().get(OLD_PROPERTY);
MavenProject prj = config.getMavenProject();
boolean usingNew = usingNbmPlugin311(prj);
if (usingNew) {
if (val == null) {
return true;
}
//modified nbactions.xml file? just adjust to new property
config.setProperty(PROPERTY, val);
config.setProperty(OLD_PROPERTY, null);
return true;
}
if (val == null) { //!usingNew
val = config.getProperties().get(PROPERTY);
if (val == null) {
//using old version of nbm plugin but also not using the old or new property, so it should be save to continue.
return true;
}
config.setProperty(OLD_PROPERTY, val);
}
//offer upgrade to new version.
return removeInterpolation(prj.getFile());
}
@Messages({
"# {0} - property name", "# {1} - pom.xml file",
"NetBeansRunParamsIDEChecker.msg_confirm=<html>New version of nbm-maven-plugin is available that doesn''t require pom.xml modification to debug or profile your project.<br>Upgrade to the new version of nbm-maven-plugin and remove the netbeans.run.params.ide property?",
"NetBeansRunParamsIDEChecker.title_confirm=Upgrade nbm-maven-plugin to newer version",
"NetBeansRunParamsIDEChecker.upgradeButton=Upgrade nbm-maven-plugin"
})
private static boolean removeInterpolation(File pom) {
Object upgrade = NetBeansRunParamsIDEChecker_upgradeButton();
Confirmation dd = new Confirmation(NetBeansRunParamsIDEChecker_msg_confirm(OLD_PROPERTY, pom), NetBeansRunParamsIDEChecker_title_confirm());
dd.setOptions(new Object[] {upgrade, NotifyDescriptor.CANCEL_OPTION} );
Object ret = DialogDisplayer.getDefault().notify(dd);
if (ret != upgrade) {
return true;
}
if (ret == upgrade) {
Utilities.performPOMModelOperations(FileUtil.toFileObject(pom),
Arrays.<ModelOperation<POMModel>>asList(new ModelOperation[] { createUpgradePluginOperation(), createRemoveIdePropertyOperation()}));
return false;
}
return false;
}
private static ModelOperation<POMModel> createUpgradePluginOperation() {
return new ModelOperation<POMModel>() {
public @Override
void performOperation(POMModel model) {
POMComponentFactory factory = model.getFactory();
Project project = model.getProject();
Build bld = project.getBuild();
if (bld == null) {
bld = factory.createBuild();
project.setBuild(bld);
}
Plugin plg = PluginBackwardPropertyUtils.findPluginFromBuild(bld);
if (plg == null) {
plg = factory.createPlugin();
plg.setGroupId(MavenNbModuleImpl.GROUPID_APACHE);
plg.setArtifactId(MavenNbModuleImpl.NBM_PLUGIN);
plg.setExtensions(Boolean.TRUE);
bld.addPlugin(plg);
}
plg.setVersion(MavenNbModuleImpl.getLatestNbmPluginVersion()); //
}
};
}
private static ModelOperation<POMModel> createRemoveIdePropertyOperation() {
return new ModelOperation<POMModel>() {
public @Override void performOperation(POMModel model) {
Project project = model.getProject();
Properties properties = project.getProperties();
if (properties != null) {
if (properties.getProperty(OLD_PROPERTY) != null) {
properties.setProperty(OLD_PROPERTY, null);
}
String args = properties.getProperty(MASTER_PROPERTY);
if (args != null) {
String ref = "${" + OLD_PROPERTY + "}"; // NOI18N
if (args.contains(ref)) {
args = args.replace(ref, "");
if (args.trim().length() == 0) {
args = null;
}
properties.setProperty(MASTER_PROPERTY, args);
}
}
}
}
};
}
static boolean usingNbmPlugin311(MavenProject prj) {
String v = PluginBackwardPropertyUtils.getPluginVersion(prj);
return v != null && new ComparableVersion(v).compareTo(new ComparableVersion("3.11.1")) >= 0;
}
}