/core/src/main/java/org/jboss/arquillian/persistence/core/deployment/PersistenceExtensionConfigurationTestArchiveEnricher.java

https://github.com/arquillian/arquillian-extension-persistence · Java · 182 lines · 136 code · 24 blank · 22 comment · 12 complexity · e160ba1bc94d4f801ceee57bc945a2be MD5 · raw file

  1. /*
  2. * JBoss, Home of Professional Open Source
  3. * Copyright 2010, Red Hat Middleware LLC, and individual contributors
  4. * by the @authors tag. See the copyright.txt in the distribution for a
  5. * full listing of individual contributors.
  6. *
  7. * Licensed under the Apache License, Version 2.0 (the "License");
  8. * you may not use this file except in compliance with the License.
  9. * You may obtain a copy of the License at
  10. * http://www.apache.org/licenses/LICENSE-2.0
  11. * Unless required by applicable law or agreed to in writing, software
  12. * distributed under the License is distributed on an "AS IS" BASIS,
  13. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. * See the License for the specific language governing permissions and
  15. * limitations under the License.
  16. */
  17. package org.jboss.arquillian.persistence.core.deployment;
  18. import java.io.ByteArrayOutputStream;
  19. import java.io.InputStream;
  20. import java.util.HashMap;
  21. import java.util.Map;
  22. import java.util.logging.Logger;
  23. import org.jboss.arquillian.config.descriptor.api.ArquillianDescriptor;
  24. import org.jboss.arquillian.config.descriptor.api.ExtensionDef;
  25. import org.jboss.arquillian.container.test.spi.client.deployment.ApplicationArchiveProcessor;
  26. import org.jboss.arquillian.core.api.Instance;
  27. import org.jboss.arquillian.core.api.annotation.Inject;
  28. import org.jboss.arquillian.persistence.core.configuration.ConfigurationExporter;
  29. import org.jboss.arquillian.persistence.core.configuration.PersistenceConfiguration;
  30. import org.jboss.arquillian.persistence.core.configuration.PersistenceDescriptorExtractor;
  31. import org.jboss.arquillian.persistence.core.configuration.PersistenceDescriptorParser;
  32. import org.jboss.arquillian.persistence.core.configuration.PropertiesSerializer;
  33. import org.jboss.arquillian.persistence.core.exception.MultiplePersistenceUnitsException;
  34. import org.jboss.arquillian.persistence.core.metadata.PersistenceExtensionEnabler;
  35. import org.jboss.arquillian.persistence.jpa.cache.JpaCacheEvictionConfiguration;
  36. import org.jboss.arquillian.persistence.script.ScriptLoader;
  37. import org.jboss.arquillian.persistence.script.configuration.ScriptingConfiguration;
  38. import org.jboss.arquillian.test.spi.TestClass;
  39. import org.jboss.shrinkwrap.api.Archive;
  40. import org.jboss.shrinkwrap.api.ShrinkWrap;
  41. import org.jboss.shrinkwrap.api.asset.ByteArrayAsset;
  42. import org.jboss.shrinkwrap.api.spec.JavaArchive;
  43. /**
  44. * Appends all data sets defined for the test class to the test archive.
  45. *
  46. * @author <a href="mailto:bartosz.majsak@gmail.com">Bartosz Majsak</a>
  47. */
  48. public class PersistenceExtensionConfigurationTestArchiveEnricher implements ApplicationArchiveProcessor {
  49. private static final Logger log =
  50. Logger.getLogger(PersistenceExtensionConfigurationTestArchiveEnricher.class.getName());
  51. @Inject
  52. Instance<PersistenceConfiguration> configurationInstance;
  53. @Inject
  54. Instance<ScriptingConfiguration> scriptingConfigurationInstance;
  55. @Inject
  56. Instance<ArquillianDescriptor> arquillianDescriptorInstance;
  57. @Override
  58. public void process(Archive<?> applicationArchive, TestClass testClass) {
  59. final PersistenceExtensionEnabler persistenceExtensionEnabler = new PersistenceExtensionEnabler(testClass);
  60. if (!persistenceExtensionEnabler.shouldPersistenceExtensionBeActivated()) {
  61. return;
  62. }
  63. obtainDataSourceFromPersistenceXml(applicationArchive);
  64. final JavaArchive additionalPersistenceResources =
  65. ShrinkWrap.create(JavaArchive.class, "arquillian-persistence-core-additional-resources.jar");
  66. merge(additionalPersistenceResources,
  67. sqlScriptsAsResource(scriptingConfigurationInstance.get().getScriptsToExecuteAfterTest()),
  68. sqlScriptsAsResource(scriptingConfigurationInstance.get().getScriptsToExecuteBeforeTest()),
  69. persistenceConfigurationSerializedAsProperties(),
  70. scriptingConfigurationSerializedAsProperties(),
  71. jpaCacheEvictionConfigurationSerializedAsProperties());
  72. ResourceAppender.addResources(applicationArchive, additionalPersistenceResources);
  73. }
  74. // Private helper methods
  75. private void obtainDataSourceFromPersistenceXml(final Archive<?> applicationArchive) {
  76. if (configurationInstance.get().isDefaultDataSourceDefined()) {
  77. return; // if defined globally the only way to alter it is on test level using @DataSource annotation
  78. }
  79. final PersistenceDescriptorExtractor persistenceDescriptorArchiveExtractor = new PersistenceDescriptorExtractor();
  80. final InputStream persistenceXmlAsStream = persistenceDescriptorArchiveExtractor.getAsStream(applicationArchive);
  81. if (persistenceXmlAsStream != null) {
  82. final PersistenceDescriptorParser parser = new PersistenceDescriptorParser();
  83. try {
  84. final String dataSourceName = parser.obtainDataSourceName(persistenceXmlAsStream);
  85. configurationInstance.get().setDefaultDataSource(dataSourceName);
  86. } catch (MultiplePersistenceUnitsException e) {
  87. log.info("Unable to deduct data source from test's archive persistence.xml. " + e.getMessage());
  88. }
  89. }
  90. }
  91. private void merge(final JavaArchive target, final JavaArchive... archivesToMerge) {
  92. for (JavaArchive archiveToMerge : archivesToMerge) {
  93. target.merge(archiveToMerge);
  94. }
  95. }
  96. private JavaArchive persistenceConfigurationSerializedAsProperties() {
  97. return ShrinkWrap.create(JavaArchive.class)
  98. .addAsResource(new ByteArrayAsset(exportPersistenceConfigurationAsProperties().toByteArray()),
  99. configurationInstance.get().getPrefix() + "properties");
  100. }
  101. private ByteArrayOutputStream exportPersistenceConfigurationAsProperties() {
  102. final ByteArrayOutputStream output = new ByteArrayOutputStream();
  103. final ConfigurationExporter<PersistenceConfiguration> exporter =
  104. new ConfigurationExporter<PersistenceConfiguration>(configurationInstance.get());
  105. exporter.toProperties(output);
  106. return output;
  107. }
  108. private JavaArchive scriptingConfigurationSerializedAsProperties() {
  109. final ScriptingConfiguration scriptingConfigurationPrototype = new ScriptingConfiguration();
  110. final Map<String, String> extensionProperties = extractExtensionProperties(arquillianDescriptorInstance.get(),
  111. scriptingConfigurationPrototype.getQualifier());
  112. final ByteArrayOutputStream properties =
  113. new PropertiesSerializer(scriptingConfigurationPrototype.getPrefix()).serializeToProperties(
  114. extensionProperties);
  115. return ShrinkWrap.create(JavaArchive.class)
  116. .addAsResource(new ByteArrayAsset(properties.toByteArray()),
  117. new ScriptingConfiguration().getPrefix() + "properties");
  118. }
  119. private JavaArchive jpaCacheEvictionConfigurationSerializedAsProperties() {
  120. final JpaCacheEvictionConfiguration config = new JpaCacheEvictionConfiguration();
  121. final Map<String, String> extensionProperties =
  122. extractExtensionProperties(arquillianDescriptorInstance.get(), config.getQualifier());
  123. final ByteArrayOutputStream output =
  124. new PropertiesSerializer(config.getPrefix()).serializeToProperties(extensionProperties);
  125. return ShrinkWrap.create(JavaArchive.class)
  126. .addAsResource(new ByteArrayAsset(output.toByteArray()),
  127. new JpaCacheEvictionConfiguration().getPrefix() + "properties");
  128. }
  129. private JavaArchive sqlScriptsAsResource(final String... scripts) {
  130. if (scripts == null) {
  131. return ShrinkWrap.create(JavaArchive.class);
  132. }
  133. final JavaArchive sqlScriptsArchive = ShrinkWrap.create(JavaArchive.class);
  134. for (String script : scripts) {
  135. if (ScriptLoader.isSqlScriptFile(script)) {
  136. sqlScriptsArchive.merge(createArchiveWithResources(script));
  137. }
  138. }
  139. return sqlScriptsArchive;
  140. }
  141. private Map<String, String> extractExtensionProperties(ArquillianDescriptor descriptor, String qualifier) {
  142. final Map<String, String> extensionProperties = new HashMap<String, String>();
  143. for (ExtensionDef extension : descriptor.getExtensions()) {
  144. if (extension.getExtensionName().equals(qualifier)) {
  145. extensionProperties.putAll(extension.getExtensionProperties());
  146. break;
  147. }
  148. }
  149. return extensionProperties;
  150. }
  151. private JavaArchive createArchiveWithResources(String... resourcePaths) {
  152. final JavaArchive dataSetsArchive = ShrinkWrap.create(JavaArchive.class);
  153. for (String path : resourcePaths) {
  154. dataSetsArchive.addAsResource(path);
  155. }
  156. return dataSetsArchive;
  157. }
  158. }