/* * Copyright 2014 Red Hat, Inc. and/or its affiliates. * * Licensed under the Eclipse Public License version 1.0, available at * http://www.eclipse.org/legal/epl-v10.html */ package org.jboss.forge.furnace.container.cdi.weld; import java.net.URL; import java.util.Collection; import java.util.Enumeration; import java.util.HashSet; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import org.jboss.forge.furnace.addons.Addon; import org.jboss.weld.resources.spi.ResourceLoader; import org.jboss.weld.resources.spi.ResourceLoadingException; /** * A {@link ResourceLoader} that can load classes from an {@link Addon} * * @author <a href="mailto:lincolnbaxter@gmail.com">Lincoln Baxter, III</a> */ public class AddonResourceLoader implements ResourceLoader { private final Map<String, Class<?>> classes; private final Addon addon; public AddonResourceLoader(Addon addon) { this.classes = new ConcurrentHashMap<>(); this.addon = addon; } @Override public String toString() { return addon.getId().toCoordinates(); } @Override public Class<?> classForName(String name) { try { Class<?> clazz = classes.get(name); if (clazz == null) { clazz = addon.getClassLoader().loadClass(name); classes.put(name, clazz); } return clazz; } catch (NoClassDefFoundError e) { throw new ResourceLoadingException(e); } catch (ClassNotFoundException e) { throw new ResourceLoadingException(e); } catch (LinkageError e) { throw new ResourceLoadingException(e); } } public void addAdditionalClass(Class<?> clazz) { this.classes.put(clazz.getName(), clazz); } @Override public URL getResource(String name) { try { return addon.getClassLoader().getResource(name); } catch (Exception e) { throw new ResourceLoadingException(e); } } @Override public Collection<URL> getResources(String name) { try { final HashSet<URL> resources = new HashSet<>(); Enumeration<URL> urls = addon.getClassLoader().getResources(name); while (urls.hasMoreElements()) { resources.add(urls.nextElement()); } return resources; } catch (Exception e) { throw new ResourceLoadingException(e); } } @Override public void cleanup() { classes.clear(); } }