/*************************************************************************************
* Copyright (c) 2013 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.stacks.core.model;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import org.jboss.jdf.stacks.model.Archetype;
import org.jboss.jdf.stacks.model.ArchetypeVersion;
import org.jboss.jdf.stacks.model.Runtime;
import org.jboss.jdf.stacks.model.Stacks;
public class StacksUtil {
private static final Map<String, String> RUNTIMES_MAP;
static {
// TODO this code should eventually be moved out?
Map<String, String> serverIdMap = new HashMap<String, String>();
serverIdMap.put("org.jboss.ide.eclipse.as.runtime.eap.60","jbosseap6runtime"); //$NON-NLS-1$ //$NON-NLS-2$
serverIdMap.put("org.jboss.ide.eclipse.as.runtime.71","jboss-as711runtime"); //$NON-NLS-1$ //$NON-NLS-2$
//serverIdMap.put("org.jboss.ide.eclipse.as.runtime.71","jboss-as710runtime");
serverIdMap.put("org.jboss.ide.eclipse.as.runtime.70","jboss-as702runtime-web"); //$NON-NLS-1$ //$NON-NLS-2$
//serverIdMap.put("org.jboss.ide.eclipse.as.runtime.70","jboss-as702runtime-full");
RUNTIMES_MAP = Collections.unmodifiableMap(serverIdMap);
}
/**
* This string constant is only provisional api and
* may be moved without warning!
*/
public static final String EAP_TYPE = "EAP"; //$NON-NLS-1$
/**
* This string constant is only provisional api and
* may be moved without warning!
*/
public static final String AS_TYPE = "AS"; //$NON-NLS-1$
private StacksUtil() {
// no need for public constructor
}
/**
* Returns the Archetype matching a given stacks archetype id
*/
public static Archetype getArchetype(String archetypeId, Stacks fromStacks) {
if (fromStacks == null || archetypeId == null) {
return null;
}
for (Archetype a : fromStacks.getAvailableArchetypes()) {
if (archetypeId.equals(a.getId())) {
return a;
}
}
return null;
}
public static List<Runtime> getCompatibleRuntimes(Archetype archetype, Stacks fromStacks, String ... runtimeTypes) {
if (fromStacks == null || archetype == null) {
return Collections.emptyList();
}
List<Runtime> runtimes = new ArrayList<Runtime>();
for (Runtime runtime : getRuntimes(fromStacks, runtimeTypes)) {
List<ArchetypeVersion> versions = getCompatibleArchetypeVersions(archetype, runtime);
if (!versions.isEmpty()) {
runtimes.add(runtime);
}
}
return Collections.unmodifiableList(runtimes);
}
public static List<Runtime> getRuntimes(Stacks fromStacks, String ... runtimeTypes) {
if (fromStacks == null) {
return Collections.emptyList();
}
List<Runtime> runtimes = new ArrayList<Runtime>();
List<String> runtimeTypeFilter = null;
if (runtimeTypes != null && runtimeTypes.length > 0) {
runtimeTypeFilter = Arrays.asList(runtimeTypes);
}
for (Runtime runtime : fromStacks.getAvailableRuntimes()) {
if (runtimeTypeFilter != null) {
String runtimeType = getRuntimeType(runtime);
if (!runtimeTypeFilter.contains(runtimeType)) {
continue;
}
}
runtimes.add(runtime);
}
return Collections.unmodifiableList(runtimes);
}
public static Runtime getRuntime(Stacks fromStacks, String runtimeId) {
if (fromStacks == null || runtimeId == null) {
return null;
}
for (Runtime runtime : fromStacks.getAvailableRuntimes()) {
if (runtimeId.equals(runtime.getId())) {
return runtime;
}
}
return null;
}
/**
* @deprecated use {@link #getRuntimeFromWtpId(Stacks, String)}
*/
@Deprecated
public static Runtime getRuntimeFromWtp(Stacks fromStacks, String wtpRuntimeId) {
return getRuntimeFromWtpId(fromStacks, wtpRuntimeId);
}
public static Runtime getRuntimeFromWtpId(Stacks fromStacks, String wtpRuntimeId) {
if (fromStacks == null || wtpRuntimeId == null) {
return null;
}
for (Runtime runtime : fromStacks.getAvailableRuntimes()) {
Properties p = runtime.getLabels();
if (p != null && wtpRuntimeId.equals(p.get("wtp-runtime-id"))) { //$NON-NLS-1$
return runtime;
}
}
//Fall back on hard coded map
String stacksRuntimeId = RUNTIMES_MAP.get(wtpRuntimeId);
return getRuntime(fromStacks, stacksRuntimeId);
}
public static List<Runtime> getCompatibleServerRuntimes(Archetype archetype, Stacks fromStacks) {
return getCompatibleRuntimes(archetype, fromStacks, AS_TYPE, EAP_TYPE);
}
/**
* Returns an unmodifiable {@link List} of compatible {@link ArchetypeVersion} of an {@link Archetype} for a given {@link Runtime}.
* The recommended {@link ArchetypeVersion} is always first in the list.
* @param archetype
* @param runtime
* @return a non-null {@link List} of compatible {@link ArchetypeVersion}.
*/
public static List<ArchetypeVersion> getCompatibleArchetypeVersions(Archetype archetype, Runtime runtime) {
if (archetype == null || runtime == null) {
return Collections.emptyList();
}
List<ArchetypeVersion> compatibleVersions = new ArrayList<ArchetypeVersion>();
List<ArchetypeVersion> versions = runtime.getArchetypes();
if (versions != null && !versions.isEmpty()) {
String bestVersion = archetype.getRecommendedVersion();
for (ArchetypeVersion v : versions) {
if (archetype.equals(v.getArchetype())) {
if (v.getVersion().equals(bestVersion)) {
//Put best version on top
compatibleVersions.add(0, v);
}
else {
compatibleVersions.add(v);
}
}
}
}
return Collections.unmodifiableList(compatibleVersions);
}
public static boolean isRuntimeCompatible(ArchetypeVersion archetypeVersion, Runtime runtime) {
if (archetypeVersion == null || runtime == null) {
return false;
}
List<ArchetypeVersion> versions = runtime.getArchetypes();
return versions != null && versions.contains(archetypeVersion);
}
public static boolean isEnterprise(Runtime runtime) {
return EAP_TYPE.equals(getRuntimeType(runtime));
}
public static String getRuntimeType(Runtime runtime) {
if (runtime == null) {
return null;
}
Properties p = runtime.getLabels();
return (String)p.get("runtime-type"); //$NON-NLS-1$
}
public static ArchetypeVersion getDefaultArchetypeVersion(String archetypeId, Stacks fromStacks) {
if (fromStacks == null || archetypeId == null) {
return null;
}
Archetype targetArchetype = getArchetype(archetypeId, fromStacks);
return getDefaultArchetypeVersion(targetArchetype, fromStacks);
}
public static ArchetypeVersion getDefaultArchetypeVersion(Archetype archetype, Stacks fromStacks) {
if (fromStacks == null || archetype == null) {
return null;
}
List<ArchetypeVersion> versions = fromStacks.getAvailableArchetypeVersions();
for (ArchetypeVersion version : versions) {
if (archetype.equals(version.getArchetype())
&& version.getVersion().equals(archetype.getRecommendedVersion())) {
return version;
}
}
return (versions.isEmpty())?null:versions.get(0);
}
}