/** * Copyright (C) 2013 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 de.adorsys.beanstest.ExtensionsServicesFileResource; import de.adorsys.beanstest.plugin.BeanstestConfiguration; /** * Setup hsqldb, and enable @PersistenceContext in Weld SE * * @author Brandenstein */ @Alias("beanstest.PersistenceTestFacet") @RequiresFacet({ DependencyFacet.class, ResourceFacet.class, JavaSourceFacet.class, CDITestFacet.class }) //, PersistenceFacet.class }) public class PersistenceTestFacet extends BaseFacet { public static final Dependency HSQLDB = DependencyBuilder.create("org.hsqldb:hsqldb:2.2.9:test"); public static final Dependency HIBERNATE_CORE = DependencyBuilder.create("org.hibernate:hibernate-core:4.1.9.Final:test"); public static final Dependency HIBERNATE_ENTITYMANAGER = DependencyBuilder.create("org.hibernate:hibernate-entitymanager:4.1.9.Final:test"); public static final Dependency JPA = DependencyBuilder.create("org.hibernate.javax.persistence:hibernate-jpa-2.0-api:1.0.1.Final:provided"); @Inject private BeanstestConfiguration beanstestConfiguration; @Override public boolean install() { // add dependencies: hibernate and hsqldb DependencyFacet dependencyFacet = project.getFacet(DependencyFacet.class); dependencyFacet.addDirectDependency(HSQLDB); dependencyFacet.addDirectDependency(HIBERNATE_CORE); dependencyFacet.addDirectDependency(HIBERNATE_ENTITYMANAGER); // prevent compile error, since hibernate is in test scope dependencyFacet.addDirectDependency(JPA); //Create PersistenceExtension Dependency weldse = dependencyFacet.getDirectDependency(DependencyBuilder.create("org.jboss.weld.se:weld-se")); beanstestConfiguration.setWeldseDependency(weldse); //TODO improve JavaClass persistenceExtension = createClassFromTemplate(beanstestConfiguration.persistenceExtensionTemplate()); createServiceEntry(persistenceExtension); //Create MockJpaInjectionServices createClassFromTemplate(beanstestConfiguration.mockJpaInjectionServicesTemplate()); //Copy persistence.xml FileResource<?> descriptor = getPersistenceFile(project); if (!descriptor.createNewFile()) { throw new RuntimeException("Failed to create required [" + descriptor.getFullyQualifiedName() + "]"); } descriptor.setContents(getClass().getResourceAsStream("/de/adorsys/beanstest/persistence.xml")); return true; } private FileResource<?> getPersistenceFile(final Project project) { return (FileResource<?>) project.getFacet(ResourceFacet.class).getTestResourceFolder().getChild("META-INF/persistence.xml"); } /** * Creates a JavaClass from a template * * @param templatepath * @return created class */ private JavaClass createClassFromTemplate(String templatepath) { final JavaSourceFacet java = project.getFacet(JavaSourceFacet.class); JavaClass javaClass = JavaParser.parse(JavaClass.class, getClass().getResourceAsStream(templatepath)); javaClass.setPackage(java.getBasePackage() + BeanstestConfiguration.PACKAGESUFFIX); try { java.saveTestJavaSource(javaClass); } catch (FileNotFoundException e) { throw new RuntimeException("Javaclass " + templatepath +" could not be created", e); } return javaClass; } //TODO eventually use for both extensions private void createServiceEntry(JavaClass extensionJavaClass) { // Create services folder and CDI extensions file DirectoryResource services = project.getFacet(ResourceFacet.class).getTestResourceFolder().getChildDirectory("META-INF/services"); if (!services.exists()) { services.mkdirs(); } ExtensionsServicesFileResource extensions = (ExtensionsServicesFileResource) services.getChild("javax.enterprise.inject.spi.Extension"); if (extensions.exists()) { // read existing, check for PersistenceExtension, if not present add if (!extensions.containsExtension(extensionJavaClass)) { extensions.addExtension(extensionJavaClass); } } else { extensions.createNewFile(); extensions.setContents(extensionJavaClass.getQualifiedName()); } } @Override public boolean isInstalled() { DependencyFacet dependencyFacet = getProject().getFacet(DependencyFacet.class); boolean hsqldb = dependencyFacet.hasEffectiveDependency(DependencyBuilder.create(HSQLDB)); boolean hibcore = dependencyFacet.hasEffectiveDependency(DependencyBuilder.create(HIBERNATE_CORE)); boolean hibentmgr = dependencyFacet.hasEffectiveDependency(DependencyBuilder.create(HIBERNATE_ENTITYMANAGER)); final JavaSourceFacet java = project.getFacet(JavaSourceFacet.class); boolean extension = false; try { extension = java.getTestJavaResource((java.getBasePackage() + BeanstestConfiguration.PACKAGESUFFIX).replaceAll("\\.", "/") + "/PersistenceExtension.java").exists(); } catch (FileNotFoundException e) {} boolean injectionservice = false; try { injectionservice = java.getTestJavaResource((java.getBasePackage() + BeanstestConfiguration.PACKAGESUFFIX).replaceAll("\\.", "/") + "/MockJpaInjectionServices.java").exists(); } catch (FileNotFoundException e) {} return hsqldb && hibcore && hibentmgr && extension && injectionservice; } }