/** * Copyright (C) 2012 Christian Brandenstein * * 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 de.adorsys.beanstest.plugin.facet; import java.io.FileNotFoundException; import javax.inject.Inject; import org.jboss.forge.parser.JavaParser; import org.jboss.forge.parser.java.JavaClass; import org.jboss.forge.project.Project; import org.jboss.forge.project.dependencies.Dependency; import org.jboss.forge.project.dependencies.DependencyBuilder; import org.jboss.forge.project.facets.BaseFacet; import org.jboss.forge.project.facets.DependencyFacet; import org.jboss.forge.project.facets.JavaSourceFacet; import org.jboss.forge.project.facets.ResourceFacet; import org.jboss.forge.resources.DirectoryResource; import org.jboss.forge.resources.FileResource; import org.jboss.forge.shell.plugins.Alias; import org.jboss.forge.shell.plugins.RequiresFacet; import org.jboss.forge.spec.javaee.CDIFacet; import org.jboss.shrinkwrap.descriptor.api.DescriptorImporter; import org.jboss.shrinkwrap.descriptor.api.Descriptors; import org.jboss.shrinkwrap.descriptor.api.spec.cdi.beans.BeansDescriptor; import de.adorsys.beanstest.ExtensionsServicesFileResource; import de.adorsys.beanstest.plugin.BeanstestConfiguration; /** * Facet managing the Weld SE and junit dependency, creates beans.xml in test resources and copies SimpleRunner * HideMissingScopes installs the HideMissingScopes CDI extension * * @author Brandenstein */ @Alias("beanstest.CDITestFacet") @RequiresFacet({ DependencyFacet.class, ResourceFacet.class, JavaSourceFacet.class, CDIFacet.class }) public class CDITestFacet extends BaseFacet { //public static final Dependency WELDSEDEFAULT = DependencyBuilder.create("org.jboss.weld.se:weld-se:1.1.10.Final:test"); public static final Dependency WELDSEDEFAULT = DependencyBuilder.create("org.jboss.weld.se:weld-se:2.0.1.Final:test"); public static final Dependency JUNIT = DependencyBuilder.create("junit:junit:4.10:test"); @Inject private BeanstestConfiguration configuration; @Override public boolean install() { // add weld-se dependency DependencyFacet dependencyFacet = project.getFacet(DependencyFacet.class); Dependency dependency = configuration.getWeldseDependency(); dependencyFacet.addDirectDependency(dependency); // add junit dependency dependencyFacet.addDirectDependency(JUNIT); // add beans.xml in src/test/resouces FileResource<?> descriptor = getConfigFile(project); if (!descriptor.createNewFile()) { throw new RuntimeException("Failed to create required [" + descriptor.getFullyQualifiedName() + "]"); } descriptor.setContents(getClass().getResourceAsStream("/de/adorsys/beanstest/beans.xml")); // create SimpleRunner final JavaSourceFacet java = project.getFacet(JavaSourceFacet.class); JavaClass simpleRunner = JavaParser.parse(JavaClass.class, getClass().getResourceAsStream("/de/adorsys/beanstest/SimpleRunner.jv")); simpleRunner.setPackage(java.getBasePackage() + BeanstestConfiguration.PACKAGESUFFIX); try { java.saveTestJavaSource(simpleRunner); } catch (FileNotFoundException e) { throw new RuntimeException("SimpleRunner could not be created", e); } return true; } private FileResource<?> getConfigFile(final Project project) { return (FileResource<?>) project.getFacet(ResourceFacet.class).getTestResourceFolder().getChild("META-INF/beans.xml"); } @Override public boolean isInstalled() { DependencyFacet dependencyFacet = getProject().getFacet(DependencyFacet.class); boolean weldse = dependencyFacet.hasEffectiveDependency(DependencyBuilder.create("org.jboss.weld.se:weld-se")); boolean junit = dependencyFacet.hasEffectiveDependency(DependencyBuilder.create(JUNIT)); final JavaSourceFacet java = project.getFacet(JavaSourceFacet.class); boolean simplerunner = false; try { simplerunner = java.getTestJavaResource((java.getBasePackage() + BeanstestConfiguration.PACKAGESUFFIX).replaceAll("\\.", "/") + "/SimpleRunner.java").exists(); } catch (FileNotFoundException e) {} boolean testbeans = getConfigFile(getProject()).exists(); return weldse && junit && simplerunner && testbeans; } public BeansDescriptor getConfig() { DescriptorImporter<BeansDescriptor> importer = Descriptors.importAs(BeansDescriptor.class); BeansDescriptor descriptor = importer.from(getConfigFile(getProject()).getUnderlyingResourceObject()); return descriptor; } public void mockMissingScopes() { // Create HideMissingScopes extension final JavaSourceFacet java = project.getFacet(JavaSourceFacet.class); JavaClass mockMissingScopesJavaClass = JavaParser.parse(JavaClass.class, getClass().getResourceAsStream("/de/adorsys/beanstest/MockMissingScopesExtension.jv")); mockMissingScopesJavaClass.setPackage(java.getBasePackage() + BeanstestConfiguration.PACKAGESUFFIX); try { java.saveTestJavaSource(mockMissingScopesJavaClass); } catch (FileNotFoundException e) { throw new RuntimeException("MockMissingScopesExtension cannot be created", e); } // Create services folder and CDI extensions file DirectoryResource services = project.getFacet(ResourceFacet.class).getTestResourceFolder().getChildDirectory("META-INF/services"); if (!services.exists()) { services.mkdirs(); } ExtensionsServicesFileResource cdiextensions = (ExtensionsServicesFileResource) services.getChild("javax.enterprise.inject.spi.Extension"); if (cdiextensions.exists()) { // read existing, check for HMSExtension, if not present add if (!cdiextensions.containsExtension(mockMissingScopesJavaClass)) { cdiextensions.addExtension(mockMissingScopesJavaClass); } } else { cdiextensions.createNewFile(); cdiextensions.setContents(mockMissingScopesJavaClass.getQualifiedName()); } } public void saveConfig(BeansDescriptor beansDescriptor) { getConfigFile(project).setContents(beansDescriptor.exportAsString()); } }