Index: src/org/jboss/tools/project/examples/model/ProjectExampleUtil.java =================================================================== --- src/org/jboss/tools/project/examples/model/ProjectExampleUtil.java (revision 41287) +++ src/org/jboss/tools/project/examples/model/ProjectExampleUtil.java (working copy) @@ -29,6 +29,11 @@ import java.util.List; import java.util.Set; import java.util.StringTokenizer; +import java.util.concurrent.Callable; +import java.util.concurrent.CompletionService; +import java.util.concurrent.ExecutorCompletionService; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; @@ -302,16 +307,22 @@ public static List getProjects( Set sites, IProgressMonitor monitor) { monitor.setTaskName(Messages.ProjectUtil_Parsing_project_description_files); - List list = new ArrayList(); invalidSites.clear(); ProjectExampleCategory other = ProjectExampleCategory.OTHER; + int threads = Runtime.getRuntime().availableProcessors(); + //threads = 1; + ExecutorService service = Executors.newFixedThreadPool(threads); + CompletionService> pool = new ExecutorCompletionService>(service); try { boolean showExperimentalSites = ProjectExamplesActivator .getDefault() .getPreferenceStore() .getBoolean( ProjectExamplesActivator.SHOW_EXPERIMENTAL_SITES); + + + int count = 0; for (IProjectExampleSite site : sites) { if (!showExperimentalSites && site.isExperimental()) { continue; @@ -320,31 +331,20 @@ invalidSites.add(site); continue; } - File file = getProjectExamplesFile(site.getUrl(), - "projectExamples", ".xml", monitor); //$NON-NLS-1$ //$NON-NLS-2$ - if (monitor.isCanceled()) { + + pool.submit(new FetchProjectExampleDocumentTask(site)); + count++; + } + + for (int k=0; k tuple = pool.take().get(); + IProjectExampleSite site = tuple.key; + Document doc = tuple.value; + if (doc == null) { invalidSites.add(site); continue; } - if (file == null || !file.exists() || !file.isFile()) { - ProjectExamplesActivator.log(NLS.bind( - Messages.ProjectUtil_Invalid_URL, site.getUrl() - .toString())); - invalidSites.add(site); - continue; - } - - Document doc; - try { - DocumentBuilderFactory dbf = DocumentBuilderFactory - .newInstance(); - DocumentBuilder db = dbf.newDocumentBuilder(); - doc = db.parse(file); - } catch (Exception e) { - ProjectExamplesActivator.log(e); - invalidSites.add(site); - continue; - } NodeList projects = doc.getElementsByTagName("project"); //$NON-NLS-1$ int len = projects.getLength(); for (int i = 0; i < len; i++) { @@ -480,6 +480,8 @@ } } catch (Exception e) { ProjectExamplesActivator.log(e); + } finally { + service.shutdown(); } list.add(other); handleCategories(list, monitor); @@ -894,4 +896,45 @@ return selection; } + private static class Tuple { + + X key; + Y value; + + public Tuple(X key) { + this.key = key; + } + + } + + private static class FetchProjectExampleDocumentTask implements Callable> { + + Tuple tuple; + + public FetchProjectExampleDocumentTask(IProjectExampleSite site) { + tuple = new Tuple(site); + } + + @Override + public Tuple call() throws Exception { + URL url = tuple.key.getUrl(); + File file = getProjectExamplesFile(url, "projectExamples", ".xml", new NullProgressMonitor()); + if(file == null || !file.exists() || !file.isFile()) { + ProjectExamplesActivator.log(NLS.bind(Messages.ProjectUtil_Invalid_URL, url.toString())); + return tuple; + } + + try { + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + DocumentBuilder db = dbf.newDocumentBuilder(); + Document doc = db.parse(file); + tuple.value = doc; + + } catch (Exception e) { + ProjectExamplesActivator.log(e); + } + return tuple; + } + + } }