Skip to content

Commit

Permalink
feat(arquillian#159): Creates SPI to resolve placeholders in configur…
Browse files Browse the repository at this point in the history
…ation files
  • Loading branch information
lordofthejars committed Feb 8, 2018
1 parent ddb52fa commit 0464ffb
Show file tree
Hide file tree
Showing 15 changed files with 574 additions and 127 deletions.
24 changes: 23 additions & 1 deletion config/impl-base/pom.xml
Expand Up @@ -35,6 +35,11 @@
<artifactId>arquillian-config-api</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.jboss.arquillian.config</groupId>
<artifactId>arquillian-config-spi</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.jboss.arquillian.core</groupId>
<artifactId>arquillian-core-api</artifactId>
Expand Down Expand Up @@ -65,12 +70,29 @@
<version>${project.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jboss.arquillian.test</groupId>
<artifactId>arquillian-test-spi</artifactId>
<version>${project.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jboss.arquillian.test</groupId>
<artifactId>arquillian-test-impl-base</artifactId>
<version>${project.version}</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<scope>test</scope>
</dependency>

</dependencies>
</project>
</project>
@@ -0,0 +1,20 @@
package org.jboss.arquillian.config.impl.extension;

import org.jboss.arquillian.config.descriptor.api.ArquillianDescriptor;
import org.jboss.arquillian.config.spi.ConfigurationPlaceholderResolver;
import org.jboss.shrinkwrap.descriptor.api.Descriptors;

class ClasspathConfigurationPlaceholderResolver implements ConfigurationPlaceholderResolver {

public ArquillianDescriptor resolve(ArquillianDescriptor descriptor) {

final String descriptorAsString = descriptor.exportAsString();
return Descriptors.importAs(ArquillianDescriptor.class)
.fromString(StringPropertyReplacer.replaceClasspath(descriptorAsString));

}

public int precedence() {
return 0;
}
}
Expand Up @@ -17,6 +17,7 @@
*/
package org.jboss.arquillian.config.impl.extension;

import org.jboss.arquillian.config.spi.ConfigurationPlaceholderResolver;
import org.jboss.arquillian.core.spi.LoadableExtension;

/**
Expand All @@ -29,5 +30,8 @@ public class ConfigExtension implements LoadableExtension {
@Override
public void register(ExtensionBuilder builder) {
builder.observer(ConfigurationRegistrar.class);

builder.service(ConfigurationPlaceholderResolver.class, ConfigurationSysPropResolver.class);
builder.service(ConfigurationPlaceholderResolver.class, ClasspathConfigurationPlaceholderResolver.class);
}
}
Expand Up @@ -16,20 +16,26 @@
*/
package org.jboss.arquillian.config.impl.extension;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import org.jboss.arquillian.config.descriptor.api.ArquillianDescriptor;
import org.jboss.arquillian.config.spi.ConfigurationPlaceholderResolver;
import org.jboss.arquillian.core.api.Instance;
import org.jboss.arquillian.core.api.InstanceProducer;
import org.jboss.arquillian.core.api.annotation.ApplicationScoped;
import org.jboss.arquillian.core.api.annotation.Inject;
import org.jboss.arquillian.core.api.annotation.Observes;
import org.jboss.arquillian.core.api.event.ManagerStarted;
import org.jboss.arquillian.core.spi.ServiceLoader;
import org.jboss.shrinkwrap.descriptor.api.Descriptors;

import java.io.InputStream;
import java.util.Map;
import java.util.Properties;

import static org.jboss.arquillian.config.impl.extension.ConfigurationSysPropResolver.resolveSystemProperties;

/**
* Configurator
*
Expand All @@ -49,6 +55,9 @@ public class ConfigurationRegistrar {
@ApplicationScoped
private InstanceProducer<ArquillianDescriptor> descriptorInst;

@Inject
private Instance<ServiceLoader> serviceLoaderInstance;

public void loadConfiguration(@Observes ManagerStarted event) {
final InputStream input = FileUtils.loadArquillianXml(ARQUILLIAN_XML_PROPERTY, ARQUILLIAN_XML_DEFAULT);

Expand All @@ -67,7 +76,22 @@ public void loadConfiguration(@Observes ManagerStarted event) {
propertiesParser.addProperties(descriptor, envProperties);

//Placeholder resolver
final ArquillianDescriptor resolvedDesc = resolveSystemProperties(descriptor);
ArquillianDescriptor resolvedDesc = descriptor;

final List<ConfigurationPlaceholderResolver> configurationPlaceholderResolvers =
new ArrayList<ConfigurationPlaceholderResolver>(serviceLoaderInstance.get().all(ConfigurationPlaceholderResolver.class));

Collections.sort(configurationPlaceholderResolvers, new Comparator<ConfigurationPlaceholderResolver>() {
public int compare(ConfigurationPlaceholderResolver o1, ConfigurationPlaceholderResolver o2) {
Integer a = o1.precedence();
Integer b = o2.precedence();
return b.compareTo(a);
}
});

for (ConfigurationPlaceholderResolver configurationPlaceholderResolver : configurationPlaceholderResolvers) {
resolvedDesc = configurationPlaceholderResolver.resolve(resolvedDesc);
}

descriptorInst.set(resolvedDesc);
}
Expand Down
Expand Up @@ -17,6 +17,7 @@
package org.jboss.arquillian.config.impl.extension;

import org.jboss.arquillian.config.descriptor.api.ArquillianDescriptor;
import org.jboss.arquillian.config.spi.ConfigurationPlaceholderResolver;
import org.jboss.shrinkwrap.descriptor.api.Descriptors;

/**
Expand All @@ -30,13 +31,7 @@
*
* @author <a href="mailto:alr@jboss.org">Andrew Lee Rubinger</a>
*/
class ConfigurationSysPropResolver {
/**
* Internal ctor, not to be called
*/
private ConfigurationSysPropResolver() {
throw new UnsupportedOperationException("No instances permitted");
}
class ConfigurationSysPropResolver implements ConfigurationPlaceholderResolver {

/**
* Returns a new instance of {@link ArquillianDescriptor} by resolving any
Expand All @@ -48,10 +43,18 @@ private ConfigurationSysPropResolver() {
*
* @throws IllegalArgumentException
*/
static ArquillianDescriptor resolveSystemProperties(final ArquillianDescriptor descriptor)
private ArquillianDescriptor resolveSystemProperties(final ArquillianDescriptor descriptor)
throws IllegalArgumentException {
final String descriptorAsString = descriptor.exportAsString();
return Descriptors.importAs(ArquillianDescriptor.class)
.fromString(StringPropertyReplacer.replaceProperties(descriptorAsString));
}

public ArquillianDescriptor resolve(ArquillianDescriptor arquillianDescriptor) {
return resolveSystemProperties(arquillianDescriptor);
}

public int precedence() {
return 0;
}
}

0 comments on commit 0464ffb

Please sign in to comment.