/*
* 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.embedded.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.Filters;
import org.jboss.shrinkwrap.api.Node;
import org.jboss.shrinkwrap.api.classloader.ShrinkWrapClassLoader;
import org.jboss.shrinkwrap.impl.base.AssignableBase;
import org.jboss.shrinkwrap.impl.base.Validate;
import org.jboss.weld.bootstrap.api.Bootstrap;
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.bootstrap.spi.BeansXml;
import org.jboss.weld.ejb.spi.EjbDescriptor;
import org.jboss.weld.resources.spi.ResourceLoader;
import org.jboss.weld.resources.spi.ResourceLoadingException;
/**
* ShrinkwrapBeanDeploymentArchiveImpl
*
* @author <a href="mailto:aslak@conduct.no">Aslak Knutsen</a>
* @version $Revision: $
*/
public class ShrinkwrapBeanDeploymentArchiveImpl extends AssignableBase<Archive<?>> implements ShrinkwrapBeanDeploymentArchive
{
private ServiceRegistry serviceRegistry = new SimpleServiceRegistry();
private ShrinkWrapClassLoader classLoader;
private Bootstrap bootstrap;
public ShrinkwrapBeanDeploymentArchiveImpl(Archive<?> archive)
{
super(archive);
Validate.notNull(archive, "Archive must be specified");
this.classLoader = new ShrinkWrapClassLoader(archive.getClass().getClassLoader(), archive);
serviceRegistry.add(ResourceLoader.class, new ResourceLoader()
{
public void cleanup() { }
public Collection<URL> getResources(String name)
{
try
{
return Collections.list(classLoader.getResources(name));
}
catch (Exception e)
{
throw new ResourceLoadingException(e);
}
}
public URL getResource(String name)
{
return classLoader.getResource(name);
}
public Class<?> classForName(String name)
{
try
{
return classLoader.loadClass(name);
}
catch (Exception e)
{
throw new ResourceLoadingException(e);
}
}
});
}
public ShrinkWrapClassLoader getClassLoader()
{
return classLoader;
}
public BeansXml getBeansXml()
{
if(bootstrap == null)
{
throw new RuntimeException("setBootstrap must be set. Needed to parse Beans XML");
}
List<URL> beansXmls = new ArrayList<URL>();
Map<ArchivePath, Node> classes = getArchive().getContent(Filters.include(".*/beans.xml"));
for(final Map.Entry<ArchivePath, Node> entry : classes.entrySet())
{
try
{
beansXmls.add(
new URL(null, "archive://" + entry.getKey().get(), new URLStreamHandler()
{
@Override
protected URLConnection openConnection(URL u) throws 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 bootstrap.parse(beansXmls);
}
public Collection<String> getBeanClasses()
{
Map<ArchivePath, Node> markerFiles = getArchive().getContent(Filters.include(".*/beans.xml"));
if (markerFiles.isEmpty())
{
return Collections.<String> emptySet();
}
List<String> beanClasses = new ArrayList<String>();
Map<ArchivePath, Node> classes = getArchive().getContent(Filters.include(".*\\.class"));
for(Map.Entry<ArchivePath, Node> classEntry : classes.entrySet())
{
beanClasses.add(getClassName(classEntry.getKey()));
}
return beanClasses;
}
public Collection<BeanDeploymentArchive> getBeanDeploymentArchives()
{
return Collections.emptySet();
}
public Collection<EjbDescriptor<?>> getEjbs()
{
return Collections.emptySet();
}
public String getId()
{
return getArchive().getName();
}
public ServiceRegistry getServices()
{
return serviceRegistry;
}
/* (non-Javadoc)
* @see org.jboss.arquillian.container.weld.se.embedded_1.shrinkwrap.ShrinkwrapBeanDeploymentArchive#setBootstrap(org.jboss.weld.bootstrap.api.Bootstrap)
*/
public void setBootstrap(Bootstrap bootstrap)
{
this.bootstrap = bootstrap;
}
/*
* 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;
}
}