blob: 1e08df17eab16e5038476d7aac9f8763e022164e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 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
*******************************************************************************/
package org.eclipse.wst.server.ui.internal.extension;
import java.io.InputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
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.jface.window.Window;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.update.configuration.IConfiguredSite;
import org.eclipse.update.configuration.ILocalSite;
import org.eclipse.update.core.IFeature;
import org.eclipse.update.core.IFeatureReference;
import org.eclipse.update.core.ISite;
import org.eclipse.update.core.IURLEntry;
import org.eclipse.update.core.IVerificationListener;
import org.eclipse.update.core.IVerificationResult;
import org.eclipse.update.core.SiteManager;
import org.eclipse.update.core.VersionedIdentifier;
import org.eclipse.wst.server.core.internal.IInstallableServer;
import org.eclipse.wst.server.core.internal.IMemento;
import org.eclipse.wst.server.core.internal.InstallableServer;
import org.eclipse.wst.server.core.internal.ServerPlugin;
import org.eclipse.wst.server.core.internal.XMLMemento;
import org.eclipse.wst.server.ui.internal.Messages;
import org.eclipse.wst.server.ui.internal.ProgressUtil;
import org.eclipse.wst.server.ui.internal.ServerUIPlugin;
import org.eclipse.wst.server.ui.internal.Trace;
import org.eclipse.wst.server.ui.internal.wizard.ExtensionWizard;
public class ExtensionUtility {
public static boolean launchExtensionWizard(Shell shell, String title, String message) {
ExtensionWizard wizard2 = new ExtensionWizard(title, message);
WizardDialog dialog = new WizardDialog(shell, wizard2);
if (dialog.open() != Window.CANCEL)
return true;
return false;
}
public static ExtensionSite[] getExtensionItems(URL url) throws CoreException {
InputStream in = null;
try {
in = url.openStream();
} catch (Exception e) {
Trace.trace(Trace.SEVERE, "Could not load URL " + url);
}
if (in == null)
throw new CoreException(new Status(IStatus.ERROR, ServerUIPlugin.PLUGIN_ID, 0, "Could not load extensions", null));
try {
IMemento memento = XMLMemento.loadMemento(in);
IMemento children[] = memento.getChildren("site");
int size = children.length;
List list = new ArrayList(size);
for (int i = 0; i < size; i++) {
ExtensionSite item = new ExtensionSite(children[i]);
list.add(item);
}
ExtensionSite[] items = new ExtensionSite[list.size()];
list.toArray(items);
return items;
} catch (Exception e) {
throw new CoreException(new Status(IStatus.ERROR, ServerUIPlugin.PLUGIN_ID, 0, e.getMessage(), e));
}
}
/**
* Returns an array of all known extension items.
* <p>
* A new array is returned on each call, so clients may store or modify the result.
* </p>
*
* @return the array of extensions items {@link ExtensionSite}
*/
public static ExtensionSite[] getExtensionItems() {
URL url = ServerUIPlugin.getInstance().getBundle().getEntry("serverAdapterSites.xml");
try {
return getExtensionItems(url);
} catch (CoreException ce) {
Trace.trace(Trace.SEVERE, "Could not get extension items");
return null;
}
}
public static void addFeature(List list, List existing, IFeature newFeature, FeatureListener listener) {
if (existing.contains(newFeature))
return;
VersionedIdentifier newVi = newFeature.getVersionedIdentifier();
IFeature remove = null;
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
IFeature feature = (IFeature) iterator.next();
VersionedIdentifier vi = feature.getVersionedIdentifier();
if (vi.getIdentifier().equals(newVi.getIdentifier())) {
//Version nextCand = new Version(features[i].getVersionedIdentifier().getVersion().toString());
if (newVi.getVersion().isGreaterOrEqualTo(vi.getVersion())) {
remove = feature;
} else // new feature is older
return;
}
}
if (remove != null) {
list.remove(remove);
listener.featureRemoved(remove);
}
list.add(newFeature);
listener.featureFound(newFeature);
try {
Thread.sleep(800);
} catch (Exception s) {
//
}
}
public static void addFeatures(List list, List existing, List newFeatures, FeatureListener listener) {
Iterator iterator = newFeatures.iterator();
while (iterator.hasNext()) {
addFeature(list, existing, (IFeature) iterator.next(), listener);
}
}
public interface FeatureListener {
public void featureFound(IFeature feature);
public void featureRemoved(IFeature feature);
public void siteFailure(ISite site, CoreException ce);
}
protected static List getExistingFeatures(IProgressMonitor monitor) throws CoreException {
monitor.beginTask(Messages.installableServerLocal, 100);
ILocalSite site = SiteManager.getLocalSite();
IConfiguredSite[] sites = site.getCurrentConfiguration().getConfiguredSites();
int size = sites.length;
List list = new ArrayList(200);
for (int i = 0; i < size; i++) {
IFeatureReference[] refs = sites[i].getFeatureReferences();
int size2 = refs.length;
for (int j = 0; j < size2; j++) {
IFeature f = refs[j].getFeature(ProgressUtil.getSubMonitorFor(monitor, 5));
if (!list.contains(f))
list.add(f);
}
}
monitor.done();
return list;
}
public static IFeature[] getAllFeatures(String id, FeatureListener listener, IProgressMonitor monitor) throws CoreException {
monitor = ProgressUtil.getMonitorFor(monitor);
monitor.beginTask("", 1100);
monitor.subTask(Messages.installableServerLocal);
List existing = getExistingFeatures(ProgressUtil.getSubMonitorFor(monitor, 100));
ExtensionSite[] items = ExtensionUtility.getExtensionItems();
IInstallableServer[] servers = ServerPlugin.getInstallableServers();
int x = 1000 / (items.length + servers.length);
monitor.worked(50);
List list = new ArrayList();
int size = items.length;
for (int i = 0; i < size; i++) {
try {
if (monitor.isCanceled())
return null;
monitor.subTask(NLS.bind(Messages.installableServerSearching, items[i].getUrl()));
List list2 = items[i].getFeatures(id, ProgressUtil.getSubMonitorFor(monitor, x));
addFeatures(list, existing, list2, listener);
} catch (CoreException ce) {
ce.printStackTrace();
}
}
// add installable servers
size = servers.length;
for (int i = 0; i < size; i++) {
if (monitor.isCanceled())
return null;
InstallableServer is = (InstallableServer) servers[i];
monitor.subTask(NLS.bind(Messages.installableServerSearching, is.getFromSite()));
IFeature feature = is.getFeature(ProgressUtil.getSubMonitorFor(monitor, x));
if (feature != null)
addFeature(list, existing, feature, listener);
}
IFeature[] ef = new IFeature[list.size()];
list.toArray(ef);
monitor.done();
return ef;
}
public static String getLicense(IFeature feature) {
IURLEntry license = feature.getLicense();
if (license != null)
return license.getAnnotation();
return null;
}
public static String getDescription(IFeature feature) {
IURLEntry license = feature.getDescription();
if (license != null)
return license.getAnnotation();
return null;
}
/*
* @see IInstallableServer#install(IProgressMonitor)
*/
public static void install(IFeature feature, IProgressMonitor monitor) throws CoreException {
try {
IVerificationListener verificationListener = new IVerificationListener() {
public int prompt(IVerificationResult result) {
return CHOICE_INSTALL_TRUST_ONCE;
}
};
SiteManager.getLocalSite().getCurrentConfiguration().getConfiguredSites()[0].install(feature, verificationListener, monitor);
} catch (CoreException ce) {
ce.printStackTrace();
}
try {
Thread.sleep(1000);
} catch (Exception e) {
// ignore
}
}
}