/* * Copyright (C) 2010 Red Hat, Inc. and/or its affiliates. * * 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.errai.bus.tests; import java.io.File; import java.net.URL; import java.util.ArrayList; import java.util.List; import java.util.Set; import junit.framework.TestCase; import org.apache.commons.io.FileUtils; import org.jboss.errai.bus.client.api.Local; import org.jboss.errai.bus.client.tests.support.FunAnnotatedClientClass; import org.jboss.errai.bus.client.tests.support.FunAnnotatedClientClass2; import org.jboss.errai.bus.server.annotations.Service; import org.jboss.errai.common.metadata.MetaDataScanner; import org.jboss.shrinkwrap.api.ShrinkWrap; import org.jboss.shrinkwrap.api.exporter.ExplodedExporter; import org.jboss.shrinkwrap.api.exporter.ZipExporter; import org.jboss.shrinkwrap.api.spec.EnterpriseArchive; import org.jboss.shrinkwrap.api.spec.JavaArchive; import org.jboss.shrinkwrap.api.spec.WebArchive; import com.google.common.io.Files; /** * Test the VFS extensions for Reflections and verify it can read from ear files. * * @author: Heiko Braun <hbraun@redhat.com> * @author Mike Brock * @author Jonathan Fuerth <jfuerth@redhat.com>> * @author Christian Sadilek <csadilek@redhat.com>> * @date: Aug 5, 2010 */ public class PackageScanTest extends TestCase { public void testEarScan() throws Exception { File ear = File.createTempFile("helloworld", ".ear"); JavaArchive jarArchive = ShrinkWrap.create(JavaArchive.class, "my-lib-1.0.jar") .addClass(FunAnnotatedClientClass2.class); WebArchive warArchive = ShrinkWrap.create(WebArchive.class, "helloworld.war") .addClasses(FunAnnotatedClientClass.class) .addAsLibrary(jarArchive); EnterpriseArchive earArchive = ShrinkWrap.create(EnterpriseArchive.class) .addAsModule(warArchive); earArchive.as(ZipExporter.class).exportTo(ear, true); URL earUrl = new URL(ear.toURI() + "/helloworld.war!/WEB-INF/classes"); URL libUrl = new URL(ear.toURI() + "/helloworld.war!/WEB-INF/lib/my-lib-1.0.jar"); List<URL> urlList = new ArrayList<URL>(); urlList.add(earUrl); urlList.add(libUrl); MetaDataScanner scanner = createScanner(urlList); // nested in ear/war/WEB-INF/classes assertTrue("Didn't find @Local annotated class FunAnnotatedClientClass in ear-war nesting", scanner.getStore().getTypesAnnotatedWith(Local.class.getName()) .contains("org.jboss.errai.bus.client.tests.support.FunAnnotatedClientClass")); // nested in ear/war/WEB-INF/lib assertTrue("Didn't find @Service annotated class FunAnnotatedClientClass2 in ear-war-jar nesting", scanner.getStore().getTypesAnnotatedWith(Service.class.getName()) .contains("org.jboss.errai.bus.client.tests.support.FunAnnotatedClientClass2")); } public void testWarScan() throws Exception { final File war = File.createTempFile("test", ".war"); WebArchive archive = ShrinkWrap.create(WebArchive.class) .addClasses(FunAnnotatedClientClass.class); archive.as(ZipExporter.class).exportTo(war, true); assertTrue(war.exists()); URL warUrl = war.toURI().toURL(); List<URL> urlList = new ArrayList<URL>(); urlList.add(warUrl); MetaDataScanner scanner = createScanner(urlList); String annotationToSearchFor = Local.class.getName(); Set<String> annotated = scanner.getStore().getTypesAnnotatedWith(annotationToSearchFor); assertFalse("Cannot find " + annotationToSearchFor + " in " + war, annotated.isEmpty()); war.delete(); } public void testExplodedWarScan() throws Exception { final File warParentDir = Files.createTempDir(); assertTrue(warParentDir.isDirectory()); WebArchive archive = ShrinkWrap.create(WebArchive.class, "explode-me") .addClasses(FunAnnotatedClientClass.class); archive.as(ExplodedExporter.class).exportExploded(warParentDir); File warBaseDir = new File(warParentDir, "explode-me"); assertTrue("Missing exploded war at " + warBaseDir, new File(warBaseDir, "WEB-INF").isDirectory()); URL warUrl = new URL(warBaseDir.toURI().toURL() + "/WEB-INF/classes"); List<URL> urlList = new ArrayList<URL>(); urlList.add(warUrl); MetaDataScanner scanner = createScanner(urlList); String annotationToSearchFor = Local.class.getName(); Set<String> annotated = scanner.getStore().getTypesAnnotatedWith(annotationToSearchFor); assertFalse("Cannot find " + annotationToSearchFor + " in " + warBaseDir, annotated.isEmpty()); FileUtils.deleteDirectory(warParentDir); warParentDir.delete(); } private MetaDataScanner createScanner(List<URL> urlList) { long s0 = System.currentTimeMillis(); MetaDataScanner scanner = MetaDataScanner.createInstance(urlList, null); System.out.println("Scan time: " + (System.currentTimeMillis() - s0)); return scanner; } }