blob: d10183fc5fe860316a65614187e34d7e84a34381 [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.apache.geronimo.st.v30.core;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.Properties;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import org.apache.geronimo.st.v30.core.internal.Messages;
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.core.runtime.Status;
import org.eclipse.jdt.launching.IVMInstall;
import org.eclipse.jdt.launching.IVMInstallType;
import org.eclipse.jdt.launching.JavaRuntime;
import org.eclipse.osgi.util.NLS;
import org.eclipse.wst.server.core.model.RuntimeDelegate;
/**
* @version $Rev$ $Date$
*/
public class GeronimoRuntimeDelegate extends RuntimeDelegate implements IGeronimoRuntime {
private static final String PROP_VM_INSTALL_TYPE_ID = "vm-install-type-id";
private static final String PROP_VM_INSTALL_ID = "vm-install-id";
public static final String RUNTIME_SOURCE= "runtime.source";
public static final int NO_IMAGE = 0;
public static final int INCORRECT_VERSION = 1;
public static final int PARTIAL_IMAGE = 2;
/*
* (non-Javadoc)
*
* @see org.eclipse.jst.server.core.IJavaRuntime#getVMInstall()
*/
public IVMInstall getVMInstall() {
if (getVMInstallTypeId() == null)
return JavaRuntime.getDefaultVMInstall();
try {
IVMInstallType vmInstallType = JavaRuntime.getVMInstallType(getVMInstallTypeId());
IVMInstall[] vmInstalls = vmInstallType.getVMInstalls();
int size = vmInstalls.length;
String id = getVMInstallId();
for (int i = 0; i < size; i++) {
if (id.equals(vmInstalls[i].getId()))
return vmInstalls[i];
}
}
catch (Exception e) {
// ignore
}
return null;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.wst.server.core.model.RuntimeDelegate#validate()
*/
public IStatus validate() {
IStatus status = super.validate();
if (!status.isOK()) {
return status;
}
if (getVMInstall() == null) {
return new Status(IStatus.ERROR, Activator.PLUGIN_ID, 0, Messages.errorJRE, null);
}
IPath runtimeLoc = getRuntime().getLocation();
// check for server file structure
int limit = 2;
int count = 0;
if (runtimeLoc.append("lib").toFile().exists()) {
count++;
}
if (runtimeLoc.append("repository").toFile().exists()) {
count++;
}
if (count == 0) {
return new Status(IStatus.ERROR, Activator.PLUGIN_ID, NO_IMAGE, "", null);
}
if (count < limit) {
// part of a server image was found, don't let install happen
return new Status(IStatus.ERROR, Activator.PLUGIN_ID,
PARTIAL_IMAGE, Messages.bind(Messages.missingContent,
getRuntime().getName()), null);
}
String detectedVersion = detectVersion();
if (detectedVersion == null) {
return new Status(IStatus.WARNING, Activator.PLUGIN_ID,
INCORRECT_VERSION, Messages.bind(Messages.noVersion,
getRuntime().getName()), null);
}
if (!detectedVersion.startsWith(getRuntime().getRuntimeType().getVersion())) {
String runtimeVersion = getRuntime().getRuntimeType().getVersion();
String message = NLS.bind(Messages.incorrectVersion,
new String[] { getRuntime().getName(),
runtimeVersion,
detectedVersion });
// GD332 allow version > if it's a SNAPSHOT
int severity = IStatus.ERROR;
if (detectedVersion.endsWith("-SNAPSHOT")
&& detectedVersion.compareTo(runtimeVersion) >= 0) {
severity = IStatus.WARNING;
}
return new Status(severity, Activator.PLUGIN_ID, INCORRECT_VERSION,
message, null);
}
return Status.OK_STATUS;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.wst.server.core.model.RuntimeDelegate#setDefaults(org.eclipse.core.runtime.IProgressMonitor)
*/
public void setDefaults(IProgressMonitor monitor) {
IVMInstall vmInstall = JavaRuntime.getDefaultVMInstall();
setVMInstall(vmInstall.getVMInstallType().getId(), vmInstall.getId());
}
/* (non-Javadoc)
* @see org.apache.geronimo.st.v30.core.IGeronimoRuntime#getRuntimeSourceLocation()
*/
public IPath getRuntimeSourceLocation() {
String source = getAttribute(RUNTIME_SOURCE, (String) null);
return (source != null) ? new Path(source) : null;
}
public void setRuntimeSourceLocation(String path) {
setAttribute(RUNTIME_SOURCE, path);
}
/**
* @return
*/
public String detectVersion() {
URL systemjarURL = null;
//
// Check lib directory first
//
File libDir = getRuntime().getLocation().append("lib").toFile();
if (libDir.exists()) {
File[] libs = libDir.listFiles();
for (int i = 0; i < libs.length; i++) {
if (libs[i].getName().startsWith("geronimo-system")) {
try {
systemjarURL = libs[i].toURL();
break;
}
catch (MalformedURLException e) {
e.printStackTrace();
}
}
}
}
//
// Check pre-2.1 repository if necessary
//
if (systemjarURL == null) {
File systemDir = getRuntime().getLocation().append("repository/org/apache/geronimo/modules/geronimo-system").toFile();
if (systemDir.exists() && systemDir.isDirectory() && systemDir.canRead()) {
List<File> dirFiles = scanDirectory(systemDir);
for (File jarFile : dirFiles) {
if (jarFile.getName().startsWith("geronimo-system") && jarFile.getName().endsWith("jar")) {
try {
systemjarURL = jarFile.toURL();
break;
}
catch (MalformedURLException e) {
e.printStackTrace();
}
}
}
}
}
//
// Check 2.1 repository if necessary
//
if (systemjarURL == null) {
File systemDir = getRuntime().getLocation().append("repository/org/apache/geronimo/framework/geronimo-system").toFile();
if (systemDir.exists() && systemDir.isDirectory() && systemDir.canRead()) {
List<File> dirFiles = scanDirectory(systemDir);
for (File jarFile : dirFiles) {
if (jarFile.getName().startsWith("geronimo-system") && jarFile.getName().endsWith("jar")) {
try {
systemjarURL = jarFile.toURL();
break;
}
catch (MalformedURLException e) {
e.printStackTrace();
}
}
}
}
}
if (systemjarURL != null) {
try {
String version = null;
JarFile jar = new JarFile(systemjarURL.getFile());
Enumeration<JarEntry> entries = jar.entries();
while(entries.hasMoreElements()){
JarEntry entry = entries.nextElement();
if (entry.getName().indexOf("geronimo-version.properties")!=-1 ||
entry.getName().indexOf("server-version.properties")!=-1 ){
InputStream is = jar.getInputStream(entry);
Properties properties = new Properties();
properties.load(is);
version = properties.getProperty("version");
is.close();
}
}
jar.close();
return version;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return null;
}
/**
* @return
*/
public String getInstallableTomcatRuntimeId() {
return "org.apache.geronimo.runtime.tomcat." + getRuntime().getRuntimeType().getVersion().replaceAll("\\.", "");
}
/**
* @return
*/
public String getInstallableJettyRuntimeId() {
return "org.apache.geronimo.runtime.jetty." + getRuntime().getRuntimeType().getVersion().replaceAll("\\.", "");
}
/**
* @param vmInstall
*/
public void setVMInstall(IVMInstall vmInstall) {
if (vmInstall == null) {
setVMInstall(null, null);
}
else
setVMInstall(vmInstall.getVMInstallType().getId(), vmInstall.getId());
}
/**
* @param typeId
* @param id
*/
public void setVMInstall(String typeId, String id) {
if (typeId == null)
setAttribute(PROP_VM_INSTALL_TYPE_ID, (String) null);
else
setAttribute(PROP_VM_INSTALL_TYPE_ID, typeId);
if (id == null)
setAttribute(PROP_VM_INSTALL_ID, (String) null);
else
setAttribute(PROP_VM_INSTALL_ID, id);
}
/**
* @return
*/
public String getVMInstallTypeId() {
return getAttribute(PROP_VM_INSTALL_TYPE_ID, (String) null);
}
/**
* @return
*/
public String getVMInstallId() {
return getAttribute(PROP_VM_INSTALL_ID, (String) null);
}
/**
* @return
*/
public boolean isUsingDefaultJRE() {
return getVMInstallTypeId() == null;
}
private static List<File> scanDirectory(File dir) {
List<File> dirFiles = new ArrayList<File>();
scanDirectory(dir, dirFiles);
return dirFiles;
}
private static void scanDirectory(File dir, List<File> dirFiles) {
File[] files = dir.listFiles();
for (int ii = 0; ii < files.length; ii++) {
if (files[ii].isDirectory()) {
scanDirectory(files[ii], dirFiles);
}
else {
dirFiles.add(files[ii]);
}
}
}
}