blob: b1aee484e0caed7282568fa1246b1d901d0f2931 [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.j2ee.clientproject;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import org.netbeans.api.debugger.DebuggerManager;
import org.netbeans.api.debugger.Session;
import org.netbeans.api.debugger.jpda.AttachingDICookie;
import org.netbeans.api.java.project.JavaProjectConstants;
import org.netbeans.modules.j2ee.api.ejbjar.EjbProjectConstants;
import org.netbeans.modules.j2ee.clientproject.ui.customizer.AppClientProjectProperties;
import org.netbeans.modules.javaee.project.api.ant.ui.J2EEProjectProperties;
import org.netbeans.modules.j2ee.deployment.devmodules.api.J2eeModule;
import org.netbeans.modules.j2ee.deployment.devmodules.spi.J2eeModuleProvider;
import org.netbeans.modules.j2ee.deployment.plugins.api.InstanceProperties;
import org.netbeans.modules.j2ee.deployment.plugins.api.ServerDebugInfo;
import org.netbeans.modules.java.api.common.ant.UpdateHelper;
import org.netbeans.modules.java.api.common.project.BaseActionProvider;
import org.netbeans.spi.project.SingleMethod;
import org.openide.util.Lookup;
/**
* Action provider of the Application Client project.
*/
class AppClientActionProvider extends BaseActionProvider {
private static final String COMMAND_VERIFY = "verify"; //NOI18N
// Commands available from Application Client project
private static final String[] supportedActions = {
COMMAND_BUILD,
COMMAND_CLEAN,
COMMAND_REBUILD,
COMMAND_COMPILE_SINGLE,
COMMAND_RUN,
COMMAND_RUN_SINGLE,
COMMAND_DEBUG,
COMMAND_DEBUG_SINGLE,
EjbProjectConstants.COMMAND_REDEPLOY,
JavaProjectConstants.COMMAND_JAVADOC,
COMMAND_TEST,
COMMAND_TEST_SINGLE,
COMMAND_DEBUG_TEST_SINGLE,
SingleMethod.COMMAND_RUN_SINGLE_METHOD,
SingleMethod.COMMAND_DEBUG_SINGLE_METHOD,
JavaProjectConstants.COMMAND_DEBUG_FIX,
COMMAND_DEBUG_STEP_INTO,
COMMAND_VERIFY,
COMMAND_DELETE,
COMMAND_COPY,
COMMAND_MOVE,
COMMAND_RENAME,
};
private static final String[] platformSensitiveActions = {
COMMAND_BUILD,
COMMAND_REBUILD,
COMMAND_COMPILE_SINGLE,
COMMAND_RUN,
COMMAND_RUN_SINGLE,
COMMAND_DEBUG,
COMMAND_DEBUG_SINGLE,
JavaProjectConstants.COMMAND_JAVADOC,
COMMAND_TEST,
COMMAND_TEST_SINGLE,
COMMAND_DEBUG_TEST_SINGLE,
JavaProjectConstants.COMMAND_DEBUG_FIX,
COMMAND_DEBUG_STEP_INTO,
SingleMethod.COMMAND_RUN_SINGLE_METHOD,
SingleMethod.COMMAND_DEBUG_SINGLE_METHOD,
};
/**Set of commands which are affected by background scanning*/
private Set<String> bkgScanSensitiveActions;
/**Set of commands which need java model up to date*/
private Set<String> needJavaModelActions;
private static final String[] actionsDisabledForQuickRun = {
COMMAND_COMPILE_SINGLE,
JavaProjectConstants.COMMAND_DEBUG_FIX,
};
/** Map from commands to ant targets */
Map<String,String[]> commands;
public AppClientActionProvider( AppClientProject project, UpdateHelper updateHelper ) {
super(project, updateHelper, project.evaluator(), project.getSourceRoots(),
project.getTestSourceRoots(), project.getAntProjectHelper(),
new BaseActionProvider.CallbackImpl(project.getClassPathProvider()));
commands = new HashMap<String, String[]>();
commands.put(COMMAND_BUILD, new String[] {"dist"}); // NOI18N
commands.put(COMMAND_CLEAN, new String[] {"clean"}); // NOI18N
commands.put(COMMAND_REBUILD, new String[] {"clean", "dist"}); // NOI18N
commands.put(COMMAND_COMPILE_SINGLE, new String[] {"compile-single"}); // NOI18N
commands.put(COMMAND_RUN, new String[] {"run"}); // NOI18N
commands.put(COMMAND_RUN_SINGLE, new String[] {"run-single"}); // NOI18N
commands.put(EjbProjectConstants.COMMAND_REDEPLOY, new String[] {"run-deploy"}); // NOI18N
commands.put(COMMAND_DEBUG, new String[] {"debug"}); // NOI18N
commands.put(COMMAND_DEBUG_SINGLE, new String[] {"debug-single"}); // NOI18N
commands.put(JavaProjectConstants.COMMAND_JAVADOC, new String[] {"javadoc"}); // NOI18N
commands.put(COMMAND_TEST, new String[] {"test"}); // NOI18N
commands.put(COMMAND_TEST_SINGLE, new String[] {"test-single"}); // NOI18N
commands.put(COMMAND_DEBUG_TEST_SINGLE, new String[] {"debug-test"}); // NOI18N
commands.put(JavaProjectConstants.COMMAND_DEBUG_FIX, new String[] {"debug-fix"}); // NOI18N
commands.put(COMMAND_DEBUG_STEP_INTO, new String[] {"debug-stepinto"}); // NOI18N
commands.put(COMMAND_VERIFY, new String[] {"verify"}); // NOI18N
commands.put(COMMAND_DEBUG_SINGLE, new String[] {"debug-single"}); // NOI18N
commands.put(SingleMethod.COMMAND_RUN_SINGLE_METHOD, new String[] {"test-single-method"}); // NOI18N
commands.put(SingleMethod.COMMAND_DEBUG_SINGLE_METHOD, new String[] {"debug-single-method"}); // NOI18N
this.needJavaModelActions = new HashSet<String>(Arrays.asList(
JavaProjectConstants.COMMAND_DEBUG_FIX
));
this.bkgScanSensitiveActions = new HashSet<String>(Arrays.asList(new String[] {
COMMAND_RUN,
COMMAND_RUN_SINGLE,
COMMAND_DEBUG,
COMMAND_DEBUG_SINGLE,
COMMAND_DEBUG_STEP_INTO,
SingleMethod.COMMAND_RUN_SINGLE_METHOD,
SingleMethod.COMMAND_DEBUG_SINGLE_METHOD
}));
}
@Override
protected String[] getPlatformSensitiveActions() {
return platformSensitiveActions;
}
@Override
protected String[] getActionsDisabledForQuickRun() {
return actionsDisabledForQuickRun;
}
@Override
public Map<String, String[]> getCommands() {
return commands;
}
@Override
protected Set<String> getScanSensitiveActions() {
return bkgScanSensitiveActions;
}
@Override
protected Set<String> getJavaModelActions() {
return needJavaModelActions;
}
@Override
protected boolean isCompileOnSaveEnabled() {
return false; // CoS not implemented for AppClient
}
@Override
public String[] getSupportedActions() {
return supportedActions;
}
@Override
public String[] getTargetNames(String command, Lookup context, Properties p, boolean doJavaChecks) throws IllegalArgumentException {
if (command.equals(COMMAND_RUN) || command.equals(EjbProjectConstants.COMMAND_REDEPLOY) ||
command.equals(COMMAND_DEBUG) || command.equals(COMMAND_DEBUG_SINGLE) || command.equals(COMMAND_RUN_SINGLE)) {
if (!checkSelectedServer(command.equals(COMMAND_DEBUG) || command.equals(COMMAND_DEBUG_SINGLE), false, false)) {
return null;
}
if (isDebugged()) {
p.setProperty("is.debugged", "true");
}
if (command.equals(EjbProjectConstants.COMMAND_REDEPLOY)) {
p.setProperty("forceRedeploy", "true"); //NOI18N
} else {
p.setProperty("forceRedeploy", "false"); //NOI18N
}
}
return super.getTargetNames(command, context, p, doJavaChecks);
}
@Override
public boolean isActionEnabled( String command, Lookup context ) {
boolean res = super.isActionEnabled(command, context);
if (res && command.equals(COMMAND_VERIFY)) {
return ((AppClientProject)getProject()).getCarModule().hasVerifierSupport();
}
if (command.equals(COMMAND_RUN) || command.equals(COMMAND_DEBUG)) {
//see issue #92895
//XXX - replace this method with a call to API as soon as issue 109895 will be fixed
return res && checkSelectedServer(command.equals(COMMAND_DEBUG), false, true) && !isTargetServerRemote();
}
return res;
}
private boolean checkSelectedServer(boolean checkDebug, boolean checkProfile, boolean noMessages) {
return J2EEProjectProperties.checkSelectedServer(getProject(), getAntProjectHelper(),
((AppClientProject) getProject()).getAPICar().getJ2eeProfile(), J2eeModule.Type.CAR, new J2EEProjectProperties.SetServerInstanceCallback() {
@Override
public void setServerInstance(String serverInstanceId) {
AppClientActionProvider.this.setServerInstance(serverInstanceId);
}
}, checkDebug, checkProfile, false);
}
private void setServerInstance(final String serverInstanceId) {
AppClientProjectProperties.setServerInstance((AppClientProject)getProject(), getAntProjectHelper(), serverInstanceId);
}
private boolean isDebugged() {
J2eeModuleProvider jmp = getProject().getLookup().lookup(J2eeModuleProvider.class);
ServerDebugInfo sdi = jmp.getServerDebugInfo();
if (sdi == null) {
return false;
}
Session[] sessions = DebuggerManager.getDebuggerManager().getSessions();
for (int i=0; i < sessions.length; i++) {
Session s = sessions[i];
if (s != null) {
Object o = s.lookupFirst(null, AttachingDICookie.class);
if (o != null) {
AttachingDICookie attCookie = (AttachingDICookie)o;
if (sdi.getTransport().equals(ServerDebugInfo.TRANSPORT_SHMEM)) {
if (attCookie.getSharedMemoryName().equalsIgnoreCase(sdi.getShmemName())) {
return true;
}
} else {
if (attCookie.getHostName().equalsIgnoreCase(sdi.getHost()) &&
attCookie.getPortNumber() == sdi.getPort()) {
return true;
}
}
}
}
}
return false;
}
private boolean isTargetServerRemote() {
J2eeModuleProvider module = getProject().getLookup().lookup(J2eeModuleProvider.class);
InstanceProperties props = module.getInstanceProperties();
String domain = props.getProperty("DOMAIN"); //NOI18N
String location = props.getProperty("LOCATION"); //NOI18N
return "".equals(domain) && "".equals(location); //NOI18N
}
}