package org.jboss.tools.runtime.seam.detector;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.jboss.jdf.stacks.model.Stacks;
import org.jboss.tools.runtime.core.model.DownloadRuntime;
import org.jboss.tools.runtime.core.model.IDownloadRuntimesProvider;
import org.jboss.tools.stacks.core.model.StacksManager;
public class DownloadRuntimesSeamProvider implements IDownloadRuntimesProvider {
private static final String LABEL_FILE_SIZE = "runtime-size";
private static final String LABEL_CATEGORY = "runtime-category";
private static final String LABEL_TYPE = "runtime-type";
private static final String CATEGORY_PROJECT = "PROJECT";
private static final String TYPE_SEAM = "SEAM";
public DownloadRuntimesSeamProvider() {
}
private Stacks[] getStacks(IProgressMonitor monitor) {
return new StacksManager().getStacks("Loading Downloadable Runtimes", monitor, StacksManager.StacksType.PRESTACKS_TYPE);
}
private ArrayList<DownloadRuntime> downloads = null;
@Override
public DownloadRuntime[] getDownloadableRuntimes(String requestType, IProgressMonitor monitor) {
if( downloads == null )
loadDownloadableRuntimes(monitor);
return (DownloadRuntime[]) downloads.toArray(new DownloadRuntime[downloads.size()]);
}
private synchronized void loadDownloadableRuntimes(IProgressMonitor monitor) {
monitor.beginTask("Load Remote Runtimes", 200);
Stacks[] stacksArr = getStacks(new SubProgressMonitor(monitor, 100));
ArrayList<DownloadRuntime> all = new ArrayList<DownloadRuntime>();
monitor.beginTask("Create Download Runtimes", stacksArr.length * 100);
for( int i = 0; i < stacksArr.length; i++ ) {
IProgressMonitor inner = new SubProgressMonitor(monitor, 100);
if( stacksArr[i] != null ) {
traverseStacks(stacksArr[i], all, inner);
}
}
monitor.done();
downloads = all;
}
private void traverseStacks(Stacks stacks, ArrayList<DownloadRuntime> list, IProgressMonitor monitor) {
List<org.jboss.jdf.stacks.model.Runtime> runtimes = stacks.getAvailableRuntimes();
Iterator<org.jboss.jdf.stacks.model.Runtime> i = runtimes.iterator();
org.jboss.jdf.stacks.model.Runtime workingRT = null;
monitor.beginTask("Create Download Runtimes", runtimes.size() * 100);
while(i.hasNext()) {
workingRT = i.next();
boolean isSeam = isSeam(workingRT);
String url = workingRT.getDownloadUrl();
if( isSeam && url != null && !"".equals(url)) {
// We can make a DL out of this
String fileSize = workingRT.getLabels().getProperty(LABEL_FILE_SIZE);
String license = workingRT.getLicense();
String id = workingRT.getId();
String legacyId = getLegacyId(id);
String effectiveId = legacyId == null ? id : legacyId;
String name = workingRT.getName();
String version = workingRT.getVersion();
DownloadRuntime dr = new DownloadRuntime(effectiveId, name, version, url);
dr.setLicenseURL(license);
dr.setSize(fileSize);
if( legacyId != null )
dr.setProperty(DownloadRuntime.PROPERTY_ALTERNATE_ID, id);
list.add(dr);
}
monitor.worked(100);
}
monitor.done();
}
private boolean isSeam(org.jboss.jdf.stacks.model.Runtime rt) {
if(CATEGORY_PROJECT.equals(rt.getLabels().get(LABEL_CATEGORY)) && TYPE_SEAM.equals(rt.getLabels().get(LABEL_TYPE)))
return true;
return false;
}
private HashMap<String, String> LEGACY_HASHMAP = null;
// Given a stacks.yaml runtime id, get the legacy downloadRuntimes id that's required
private synchronized String getLegacyId(String id) {
if( LEGACY_HASHMAP == null )
loadLegacy();
return LEGACY_HASHMAP.get(id);
}
private synchronized void loadLegacy() {
LEGACY_HASHMAP = new HashMap<String, String>();
LEGACY_HASHMAP.put("seam202runtime", "org.jboss.tools.runtime.core.seam.202" );
LEGACY_HASHMAP.put("seam222runtime", "org.jboss.tools.runtime.core.seam.222" );
}
}