blob: 8c8883dac9d4a64ff85e34cae4dc6d777baee793 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2003, 2020 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - Initial API and implementation
*******************************************************************************/
package org.eclipse.jst.server.tomcat.core.internal;
import java.io.File;
import java.io.FileFilter;
import org.eclipse.core.runtime.*;
import org.eclipse.jdt.launching.JavaRuntime;
import org.eclipse.wst.server.core.IRuntimeType;
import org.eclipse.wst.server.core.IRuntimeWorkingCopy;
import org.eclipse.wst.server.core.ServerCore;
import org.eclipse.wst.server.core.model.RuntimeLocatorDelegate;
/**
*
*/
public class TomcatRuntimeLocator extends RuntimeLocatorDelegate {
protected static final String[] runtimeTypes = new String[] {
"org.eclipse.jst.server.tomcat.runtime.32",
"org.eclipse.jst.server.tomcat.runtime.40",
"org.eclipse.jst.server.tomcat.runtime.41",
"org.eclipse.jst.server.tomcat.runtime.50",
"org.eclipse.jst.server.tomcat.runtime.55",
"org.eclipse.jst.server.tomcat.runtime.60",
"org.eclipse.jst.server.tomcat.runtime.70",
"org.eclipse.jst.server.tomcat.runtime.80",
"org.eclipse.jst.server.tomcat.runtime.85",
"org.eclipse.jst.server.tomcat.runtime.90",
"org.eclipse.jst.server.tomcat.runtime.100"};
/* (non-Javadoc)
* @see org.eclipse.wst.server.core.model.IRuntimeFactoryDelegate#getKnownRuntimes()
*/
public void searchForRuntimes(IPath path, IRuntimeSearchListener listener, IProgressMonitor monitor) {
searchForRuntimes2(path, listener, monitor);
}
protected static void searchForRuntimes2(IPath path, IRuntimeSearchListener listener, IProgressMonitor monitor) {
File[] files = null;
if (path != null) {
File f = path.toFile();
if (f.exists())
files = f.listFiles();
else
return;
} else
files = File.listRoots();
if (files != null) {
int size = files.length;
int work = 100 / size;
int workLeft = 100 - (work * size);
for (int i = 0; i < size; i++) {
if (monitor.isCanceled())
return;
if (files[i] != null && files[i].isDirectory())
searchDir(listener, files[i], 4, monitor);
monitor.worked(work);
}
monitor.worked(workLeft);
} else
monitor.worked(100);
}
protected static void searchDir(IRuntimeSearchListener listener, File dir, int depth, IProgressMonitor monitor) {
if ("conf".equals(dir.getName())) {
IRuntimeWorkingCopy runtime = getRuntimeFromDir(dir.getParentFile(), monitor);
if (runtime != null) {
listener.runtimeFound(runtime);
return;
}
}
if (depth == 0)
return;
File[] files = dir.listFiles(new FileFilter() {
public boolean accept(File file) {
return file.isDirectory();
}
});
if (files != null) {
int size = files.length;
for (int i = 0; i < size; i++) {
if (monitor.isCanceled())
return;
searchDir(listener, files[i], depth - 1, monitor);
}
}
}
protected static IRuntimeWorkingCopy getRuntimeFromDir(File dir, IProgressMonitor monitor) {
for (int i = 0; i < runtimeTypes.length; i++) {
try {
IRuntimeType runtimeType = ServerCore.findRuntimeType(runtimeTypes[i]);
String absolutePath = dir.getAbsolutePath();
String id = absolutePath.replace(File.separatorChar,'_').replace(':','-');
IRuntimeWorkingCopy runtime = runtimeType.createRuntime(id, monitor);
runtime.setName(dir.getName());
runtime.setLocation(new Path(absolutePath));
ITomcatRuntimeWorkingCopy wc = (ITomcatRuntimeWorkingCopy) runtime.loadAdapter(ITomcatRuntimeWorkingCopy.class, null);
wc.setVMInstall(JavaRuntime.getDefaultVMInstall());
IStatus status = runtime.validate(monitor);
if (status == null || status.getSeverity() != IStatus.ERROR)
return runtime;
Trace.trace(Trace.FINER, "False runtime found at " + dir.getAbsolutePath() + ": " + status.getMessage());
} catch (Exception e) {
Trace.trace(Trace.SEVERE, "Could not find runtime", e);
}
}
return null;
}
}