/*************************************************************************************
* Copyright (c) 2008-2011 Red Hat, Inc. 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:
* JBoss by Red Hat - Initial implementation.
************************************************************************************/
package org.jboss.tools.runtime.core.model;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.util.Arrays;
import java.util.HashMap;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.SubMonitor;
import org.eclipse.osgi.util.NLS;
import org.jboss.tools.runtime.core.Messages;
import org.jboss.tools.runtime.core.RuntimeCoreActivator;
import org.jboss.tools.runtime.core.model.internal.ExtractionRuntimeInstaller;
/**
* An object that represents a downloadable runtime.
* It must have several key settings, as well as some optional.
* It also allows the setting of arbitrary properties for filtering
* at later points.
*
* DownloadRuntime objects are most often instantiated by an {@link IDownloadRuntimesProvider},
* which is in charge of exposing the known runtimes to the framework.
*
* @author snjeza
*
*/
public class DownloadRuntime {
/**
* A property setting which indicates this runtime may be found
* under an alternate id. Suitable values are either
* String or String[]
*/
public static final String PROPERTY_ALTERNATE_ID = "PROPERTY_ALTERNATE_ID"; //$NON-NLS-1$
/**
* This property will indicate that the given url requires credentials
*/
public static final String PROPERTY_REQUIRES_CREDENTIALS = "requiresCredentials"; //$NON-NLS-1$
/**
* This property will indicate how to install the given DownloadRuntime
*/
public static final String PROPERTY_INSTALLATION_METHOD = "installationMethod"; //$NON-NLS-1$
private byte[] BUFFER = null;
private String name;
private String id;
private String version;
private String url;
private String licenseURL;
private String humanUrl;
private String size = "?"; //$NON-NLS-1$
private boolean disclaimer = true;
private HashMap<String, Object> properties;
private String installationMethod = ExtractionRuntimeInstaller.ID;
public DownloadRuntime(String id, String name, String version, String url) {
super();
this.id = id;
this.name = name;
this.version = version;
this.url = url;
this.properties = new HashMap<String, Object>();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getVersion() {
return version;
}
public void setVersion(String version) {
this.version = version;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
DownloadRuntime other = (DownloadRuntime) obj;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
return true;
}
public boolean isDisclaimer() {
return disclaimer;
}
public void setDisclaimer(boolean disclaimer) {
this.disclaimer = disclaimer;
}
public void setLicenseURL(String url) {
this.licenseURL = url;
}
public String getLicenceURL() {
return licenseURL;
}
/*
* @see IInstallableRuntime#getLicense(IProgressMonitor)
*/
public String getLicense(IProgressMonitor monitor) throws CoreException {
URL url = null;
ByteArrayOutputStream out = null;
try {
if (licenseURL == null)
return null;
url = new URL(licenseURL);
InputStream in = url.openStream();
out = new ByteArrayOutputStream();
copyWithSize(in, out, null, 0);
return new String(out.toByteArray());
} catch (Exception e) {
throw new CoreException(new Status(IStatus.ERROR,
RuntimeCoreActivator.PLUGIN_ID, 0,
NLS.bind(Messages.DownloadRuntime_Unable_to_fetch_license, e.getLocalizedMessage()), e));
} finally {
try {
if (out != null)
out.close();
} catch (IOException e) {
// ignore
}
}
}
private void copyWithSize(InputStream in, OutputStream out, IProgressMonitor monitor, int size) throws IOException {
if (BUFFER == null)
BUFFER = new byte[8192];
SubMonitor progress = SubMonitor.convert(monitor, size);
int r = in.read(BUFFER);
while (r >= 0) {
out.write(BUFFER, 0, r);
progress.worked(r);
r = in.read(BUFFER);
}
}
public String getHumanUrl() {
return humanUrl;
}
public void setHumanUrl(String humanUrl) {
this.humanUrl = humanUrl;
}
public String getSize() {
return size;
}
public void setSize(String size) {
this.size = size;
}
public void setProperty(String key, Object value) {
properties.put(key, value);
}
public Object getProperty(String key) {
return properties.get(key);
}
/**
* Get the installation method to use on this archive once the given url is downloaded.
* Should be one of the constants in {@link IRuntimeInstaller}, such as
* {@link IRuntimeInstaller}.EXTRACT_INSTALLER or {@link IRuntimeInstaller}.JAR_INSTALLER
*
* @return The selected installation method, or IRuntimeInstaller.EXTRACT_INSTALLER if none
*/
public String getInstallationMethod() {
return installationMethod == null ? IRuntimeInstaller.EXTRACT_INSTALLER : installationMethod;
}
/**
* Set the installation method to use on this archive once the given url is downloaded.
* Should be one of the constants in {@link IRuntimeInstaller}, such as
* {@link IRuntimeInstaller}.EXTRACT_INSTALLER or {@link IRuntimeInstaller}.JAR_INSTALLER
*/
public void setInstallationMethod(String installationMethod) {
this.installationMethod = installationMethod;
}
@Override
public String toString() {
return "DownloadRuntime [BUFFER=" + Arrays.toString(BUFFER) + ", name=" //$NON-NLS-1$ //$NON-NLS-2$
+ name + ", id=" + id + ", version=" + version + ", url=" + url //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ ", licenseURL=" + licenseURL + ", humanUrl=" + humanUrl //$NON-NLS-1$ //$NON-NLS-2$
+ ", size=" + size + ", disclaimer=" + disclaimer + "]"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
}