/* * Copyright 2015 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * * 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.kie.eclipse.runtime; import java.util.ArrayList; import java.util.Collection; import java.util.Hashtable; import java.util.List; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.Platform; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.swt.widgets.Display; public abstract class AbstractRuntimeInstaller implements IRuntimeInstaller { static Hashtable<String, AbstractRuntimeInstaller> installers; static Hashtable<String, ArtifactList> artifacts; public final static String KIE_RUNTIME_INSTALLER = "org.kie.eclipse.runtimeInstaller"; public static AbstractRuntimeInstaller.Factory FACTORY = new AbstractRuntimeInstaller.Factory(); /** * Represents a "repository" definition in the KIE Runtime Installer extension point. */ public static class Repository { protected String url; protected String type; protected String source; protected String target; protected String artifactsId; public String getUrl() { return url; } public String getType() { return type; } public String getSource() { return source; } public String getTarget() { return target; } public ArtifactList getArtifactList() { FACTORY.createInstallers(); return artifacts.get(artifactsId); } public List<Artifact> getArtifacts() { ArtifactList al = getArtifactList(); return al.getArtifacts(); } } /** * Represents an "artifact" definition in the KIE Runtime Installer extension point. */ public static class Artifact { String type; String name; String source; String target; public String getType() { return type; } public String getName() { return name; } public String getSource() { return source; } public String getTarget() { return target; } } /** * Represents an "artifacts" definition in the KIE Runtime Installer extension point. */ @SuppressWarnings("serial") public static class ArtifactList extends ArrayList<Artifact> { String id; String name; List<Artifact> artifacts = new ArrayList<Artifact>(); public String getId() { return id; } public String getName() { return name; } public List<Artifact> getArtifacts() { return artifacts; } } /** * Factory class for creating Runtime Installers */ public static class Factory { protected Factory() { } public AbstractRuntimeInstaller getInstaller(String runtimeId) { createInstallers(); return installers.get(runtimeId); } public Collection<? extends IRuntimeInstaller> createInstallers() { if (installers==null) { installers = new Hashtable<String, AbstractRuntimeInstaller>(); try { IConfigurationElement[] config = Platform.getExtensionRegistry() .getConfigurationElementsFor(DefaultRuntimeInstaller.KIE_RUNTIME_INSTALLER); for (IConfigurationElement e : config) { if ("installer".equals(e.getName())) { Object o = e.createExecutableExtension("class"); if (o instanceof AbstractRuntimeInstaller) { AbstractRuntimeInstaller installer = (AbstractRuntimeInstaller) o; installer.id = e.getAttribute("id"); installer.product = e.getAttribute("product"); installer.version = e.getAttribute("version"); installer.runtimeName = e.getAttribute("runtimeName"); for (IConfigurationElement r : e.getChildren("repository")) { Repository repository = new Repository(); repository.url = r.getAttribute("url"); repository.type = r.getAttribute("type"); repository.source = r.getAttribute("source"); repository.target = r.getAttribute("target"); repository.artifactsId = r.getAttribute("artifacts"); installer.getRepositories().add(repository); } try { installer.priority = Integer.getInteger(e.getAttribute("priority")); } catch (Exception ex) { installer.priority = 1; } // replace lower priority installers with higher priority AbstractRuntimeInstaller oldInstaller = installers.get(installer.version); if (oldInstaller==null || installer.priority>oldInstaller.priority) installers.put(installer.version, installer); } } else if ("artifacts".equals(e.getName())) { ArtifactList artifactList = new ArtifactList(); artifactList.id = e.getAttribute("id"); artifactList.name = e.getAttribute("name"); for (IConfigurationElement a : e.getChildren("artifact")) { Artifact artifact = new Artifact(); artifact.type = a.getAttribute("type"); artifact.name = a.getAttribute("name"); artifact.source = a.getAttribute("source"); artifact.target = a.getAttribute("target"); artifactList.artifacts.add(artifact); } if (artifacts==null) artifacts = new Hashtable<String, ArtifactList>(); artifacts.put(artifactList.id, artifactList); } } } catch (Exception ex) { MessageDialog.openError( Display.getDefault().getActiveShell(), "Error", ex.getMessage()); } } return installers.values(); } } protected String id; protected String product; protected String version; protected String runtimeName; protected int priority; protected List<Repository> repositories; public abstract String install(String runtimeId, String location, IProgressMonitor monitor); public String getId() { return id; } public void setId(String id) { this.id = id; } public String getProduct() { return product; } public void setProduct(String product) { this.product = product; } public String getVersion() { return version; } public void setVersion(String version) { this.version = version; } public String getRuntimeName() { return runtimeName; } public void setRuntimeName(String runtimeName) { this.runtimeName = runtimeName; } public List<Repository> getRepositories() { if (repositories==null) { repositories = new ArrayList<Repository>(); } return repositories; } }