/* * JBoss, Home of Professional Open Source * Copyright 2009, Red Hat Middleware LLC, and individual contributors * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * 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.jboss.arquillian.container.weld.se.embedded_1.shrinkwrap; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.net.URLConnection; import java.net.URLStreamHandler; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Map; import org.jboss.shrinkwrap.api.Archive; import org.jboss.shrinkwrap.api.ArchivePath; import org.jboss.shrinkwrap.api.Assignable; import org.jboss.shrinkwrap.api.Filters; import org.jboss.shrinkwrap.api.Node; import org.jboss.shrinkwrap.api.classloader.ShrinkWrapClassLoader; import org.jboss.shrinkwrap.impl.base.Validate; import org.jboss.weld.bootstrap.api.ServiceRegistry; import org.jboss.weld.bootstrap.api.helpers.SimpleServiceRegistry; import org.jboss.weld.bootstrap.spi.BeanDeploymentArchive; import org.jboss.weld.ejb.spi.EjbDescriptor; /** * ShrinkwrapBeanDeploymentArchiveImpl * * @author <a href="mailto:aslak@conduct.no">Aslak Knutsen</a> * @version $Revision: $ */ public class ShrinkwrapBeanDeploymentArchiveImpl implements ShrinkwrapBeanDeploymentArchive, Assignable { private Archive<?> archive; private ServiceRegistry serviceRegistry = new SimpleServiceRegistry(); private ShrinkWrapClassLoader classLoader; public ShrinkwrapBeanDeploymentArchiveImpl(Archive<?> archive) { Validate.notNull(archive, "Archive must be specified"); this.archive = archive; this.classLoader = new ShrinkWrapClassLoader(archive.getClass().getClassLoader(), archive); } protected Archive<?> getArchive() { return archive; } public ShrinkWrapClassLoader getClassLoader() { return classLoader; } public Collection<URL> getBeansXml() { List<URL> beanClasses = new ArrayList<URL>(); Map<ArchivePath, Node> classes = archive.getContent(Filters.include(".*/beans.xml")); for(final Map.Entry<ArchivePath, Node> entry : classes.entrySet()) { try { beanClasses.add( new URL(null, "archive://" + entry.getKey().get(), new URLStreamHandler() { @Override protected java.net.URLConnection openConnection(URL u) throws java.io.IOException { return new URLConnection(u) { @Override public void connect() throws IOException { } @Override public InputStream getInputStream() throws IOException { return entry.getValue().getAsset().openStream(); } }; }; })); } catch (Exception e) { e.printStackTrace(); } } return beanClasses; } public Collection<Class<?>> getBeanClasses() { List<Class<?>> beanClasses = new ArrayList<Class<?>>(); Map<ArchivePath, Node> classes = archive.getContent(Filters.include(".*\\.class")); try { for(Map.Entry<ArchivePath, Node> classEntry : classes.entrySet()) { Class<?> loadedClass = getClassLoader().loadClass( getClassName(classEntry.getKey())); beanClasses.add(loadedClass); } } catch (ClassNotFoundException e) { throw new RuntimeException("Could not load class from archive " + archive.getName(), e); } return beanClasses; } public Collection<BeanDeploymentArchive> getBeanDeploymentArchives() { return Collections.emptySet(); } public Collection<EjbDescriptor<?>> getEjbs() { return Collections.emptySet(); } public String getId() { return archive.getName(); } public ServiceRegistry getServices() { return serviceRegistry; } /* * input: /org/MyClass.class * output: org.MyClass */ public String getClassName(ArchivePath path) { String className = path.get(); if(className.charAt(0) == '/') { className = className.substring(1); } className = className.replaceAll("\\.class", ""); className = className.replaceAll("/", "."); return className; } /* (non-Javadoc) * @see org.jboss.shrinkwrap.api.Assignable#as(java.lang.Class) */ public <TYPE extends Assignable> TYPE as(Class<TYPE> clazz) { return getArchive().as(clazz); } }