/******************************************************************************* | |
* Copyright (c) 2003, 2007 IBM Corporation and others. | |
* All rights reserved. This program and the accompanying materials | |
* are made available under the terms of the Eclipse Public License v1.0 | |
* which accompanies this distribution, and is available at | |
* http://www.eclipse.org/legal/epl-v10.html | |
* | |
* Contributors: | |
* IBM Corporation - Initial API and implementation | |
* Angelo Zerr <angelo.zerr@gmail.com> - Jetty packages | |
*******************************************************************************/ | |
package org.eclipse.jst.server.jetty.core.internal; | |
import java.io.File; | |
import java.io.FileFilter; | |
import java.util.Collection; | |
import org.eclipse.core.runtime.IPath; | |
import org.eclipse.core.runtime.IProgressMonitor; | |
import org.eclipse.core.runtime.IStatus; | |
import org.eclipse.core.runtime.Path; | |
import org.eclipse.jdt.launching.JavaRuntime; | |
import org.eclipse.jst.server.jetty.core.IJettyRuntimeWorkingCopy; | |
import org.eclipse.jst.server.jetty.core.JettyPlugin; | |
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 JettyRuntimeLocator extends RuntimeLocatorDelegate { | |
@Override | |
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) { | |
Collection<String> runtimeTypes = JettyPlugin.getRuntimeTypes(); | |
for (String runtimeTypeName : runtimeTypes) { | |
try { | |
IRuntimeType runtimeType = ServerCore | |
.findRuntimeType(runtimeTypeName); | |
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)); | |
IJettyRuntimeWorkingCopy wc = (IJettyRuntimeWorkingCopy) runtime | |
.loadAdapter(IJettyRuntimeWorkingCopy.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; | |
} | |
} |