package org.eclipse.jdt.internal.launching;/******************************************************************************* * Copyright (c) 2001, 2002 International Business Machines Corp. and others. * All rights reserved. This program and the accompanying materials  * are made available under the terms of the Common Public License v0.5  * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/cpl-v05.html *  * Contributors: *     IBM Corporation - initial API and implementation ******************************************************************************/import java.io.File;import org.eclipse.core.runtime.IPath;import org.eclipse.core.runtime.Path;import org.eclipse.jdt.launching.IVMInstall;/** * A VM install type for VMs the conform to the 1.1.x standard * JDK installion layout, and command line options. */public class Standard11xVMType extends StandardVMType {	protected boolean canDetectExecutable(File javaHome) {		if (getDefaultSystemLibrary(javaHome) != null) {			return super.canDetectExecutable(javaHome) ;		}		return false;	}			protected IPath getDefaultSystemLibrary(File installLocation) {		IPath jreLibPath= new Path(installLocation.getPath()).append("lib").append("classes.zip"); //$NON-NLS-2$ //$NON-NLS-1$		if (jreLibPath.toFile().isFile()) {			return jreLibPath;		}		return null;	}	protected IVMInstall doCreateVMInstall(String id) {		return new Standard11xVM(this, id);	}		protected IPath getDefaultSystemLibrarySource(File installLocation) {		setDefaultRootPath(""); //$NON-NLS-1$		return Path.EMPTY;	}		/**	 * @see IVMInstallType#getName()	 */	public String getName() {		return LaunchingMessages.getString("Standard11xVMType.Standard_1.1.x_VM_1"); //$NON-NLS-1$	}	}