blob: a5a930031cb9e1be33618973df8bd4e838f16cbb [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.ant;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Task;
import org.netbeans.modules.j2ee.deployment.impl.ServerException;
import org.openide.util.Lookup;
import org.netbeans.modules.j2ee.deployment.devmodules.api.*;
import org.netbeans.api.project.FileOwnerQuery;
import org.openide.filesystems.*;
import org.netbeans.modules.j2ee.deployment.devmodules.spi.J2eeModuleProvider;
import org.netbeans.modules.j2ee.deployment.plugins.api.ServerDebugInfo;
import org.netbeans.modules.j2ee.deployment.impl.ServerRegistry;
import org.netbeans.modules.j2ee.deployment.impl.ServerInstance;
import org.netbeans.modules.j2ee.deployment.impl.ui.ProgressUI;
import org.openide.util.NbBundle;
/**
* Ant task that starts the server if needed
* @author
*/
public class StartServer extends Task implements Deployment.Logger {
// default profiling timeout
private static final long DEFAULT_TIMEOUT = 300000; // in millis
/**
* Holds value of property debugmode.
*/
private boolean debugmode = false;
/**
* Holds value of property profilemode.
*/
private boolean profilemode = false;
public void execute() throws BuildException {
ClassLoader originalLoader = null;
try {
// see issue #62448
ClassLoader current = (ClassLoader) Lookup.getDefault().lookup(
ClassLoader.class);
if (current == null) {
current = ClassLoader.getSystemClassLoader();
}
if (current != null) {
originalLoader = Thread.currentThread().getContextClassLoader();
Thread.currentThread().setContextClassLoader(current);
}
J2eeModuleProvider jmp = null;
try {
FileObject fob = FileUtil.toFileObject(getProject().getBaseDir());
fob.refresh(); // without this the "build" directory is not found in filesystems
jmp = (J2eeModuleProvider) FileOwnerQuery.getOwner(fob).getLookup().lookup(
J2eeModuleProvider.class);
} catch (Exception e) {
throw new BuildException(e);
}
// get server instance
ServerInstance si = ServerRegistry.getInstance().getServerInstance(
jmp.getServerInstanceID());
String title = NbBundle.getMessage(ServerInstance.class,
"LBL_StartServerProgressMonitor", si.getDisplayName());
ProgressUI ui = new ProgressUI(title, false, this);
ui.start();
ServerDebugInfo sdi = null;
// Start server instance if it has not yet been started.
try {
if (debugmode) {
si.startDebug(ui);
} else if (profilemode) {
si.startProfile(false, ui);
// TODO whole this thing would deserve a better solution
long start = System.nanoTime();
while (!si.isReallyRunning()
&& DEFAULT_TIMEOUT > ((System.nanoTime() - start) / 1000000)) {
try {
Thread.sleep(100);
} catch (InterruptedException ex) {
Thread.currentThread().interrupt();
// proceed to exit
}
}
} else {
si.start(ui);
}
// set the debug info
sdi = jmp.getServerDebugInfo();
if (sdi != null) {
String h = sdi.getHost();
String transport = sdi.getTransport();
String address = ""; //NOI18N
if (transport.equals(ServerDebugInfo.TRANSPORT_SHMEM)) {
address = sdi.getShmemName();
} else {
address = Integer.toString(sdi.getPort());
}
getProject().setProperty("name", jmp.getDeploymentName());
getProject().setProperty("jpda.transport", transport);
getProject().setProperty("jpda.host", h);
getProject().setProperty("jpda.address", address);
}
} catch (ServerException ex) {
if (null != ex.getCause()) {
// send the message and the exception to the ant output
throw new BuildException(ex.getMessage(), ex);
} else {
// just send the message to the ant output
throw new BuildException(ex.getMessage());
}
} catch (Exception ex) {
throw new BuildException(ex);
} finally {
ui.finish();
}
} finally {
if (originalLoader != null) {
Thread.currentThread().setContextClassLoader(originalLoader);
}
}
}
/**
* Getter for property debugmode.
* @return Value of property debugmode.
*/
public boolean getDebugmode() {
return this.debugmode;
}
/**
* Getter for property profilemode.
* @return Value of property profilemode.
*/
public boolean getProfilemode() {
return this.profilemode;
}
/**
* Setter for property debugmode.
* @param debugmode New value of property debugmode.
*/
public void setDebugmode(boolean debugmode) {
this.debugmode = debugmode;
}
/**
* Setter for property profilemode.
* @param profilemode New value of property profilemode.
*/
public void setProfilemode(boolean profilemode) {
this.profilemode = profilemode;
}
}