All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.codearte.accurest.stubrunner.StubRunnerExecutor.groovy Maven / Gradle / Ivy

package io.codearte.accurest.stubrunner

import groovy.transform.CompileStatic
import groovy.util.logging.Slf4j
import io.codearte.accurest.dsl.GroovyDsl
import io.codearte.accurest.messaging.AccurestMessage
import io.codearte.accurest.messaging.AccurestMessaging
import io.codearte.accurest.messaging.noop.NoOpAccurestMessaging

/**
 * Runs stubs for a particular {@link StubServer}
 */
@CompileStatic
@Slf4j
class StubRunnerExecutor implements StubFinder {

	private final AvailablePortScanner portScanner
	private final AccurestMessaging accurestMessaging
	private StubServer stubServer

	StubRunnerExecutor(AvailablePortScanner portScanner, AccurestMessaging accurestMessaging) {
		this.portScanner = portScanner
		this.accurestMessaging = accurestMessaging
	}

	StubRunnerExecutor(AvailablePortScanner portScanner) {
		this.portScanner = portScanner
		this.accurestMessaging = new NoOpAccurestMessaging()
	}

	RunningStubs runStubs(StubRunnerOptions stubRunnerOptions, StubRepository repository, StubConfiguration stubConfiguration) {
		startStubServers(stubRunnerOptions, stubConfiguration, repository)
		RunningStubs runningCollaborators =
				new RunningStubs([(stubServer.stubConfiguration): stubServer.port])
		log.info("All stubs are now running [${runningCollaborators.toString()}")
		return runningCollaborators
	}

	void shutdown() {
		stubServer?.stop()
	}

	@Override
	URL findStubUrl(String groupId, String artifactId) {
		if (!groupId) {
			return returnStubUrlIfMatches(stubServer.stubConfiguration.artifactId == artifactId)
		}
		return returnStubUrlIfMatches(stubServer.stubConfiguration.artifactId == artifactId &&
				stubServer.stubConfiguration.groupId == groupId)
	}

	@Override
	URL findStubUrl(String ivyNotation) {
		String[] splitString = ivyNotation.split(":")
		if (splitString.length == 1) {
			throw new IllegalArgumentException("$ivyNotation is invalid")
		}
		return findStubUrl(splitString[0], splitString[1])
	}

	@Override
	RunningStubs findAllRunningStubs() {
		return new RunningStubs([(stubServer.stubConfiguration) : stubServer.port])
	}

	@Override
	Map> getAccurestContracts() {
		return [(stubServer.stubConfiguration): stubServer.contracts]
	}

	@Override
	boolean trigger(String ivyNotationAsString, String labelName) {
		Collection matchingContracts = getAccurestContracts().findAll {
			it.key.groupIdAndArtifactMatches(ivyNotationAsString)
		}.values().flatten() as Collection
		return triggerForDsls(matchingContracts, labelName)
	}

	@Override
	boolean trigger(String labelName) {
		return triggerForDsls(getAccurestContracts().values().flatten() as Collection, labelName)
	}

	private boolean triggerForDsls(Collection dsls, String labelName) {
		Collection matchingDsls = dsls.findAll { it.label == labelName }
		if (matchingDsls.empty) {
			return false
		}
		matchingDsls.each {
			sendMessageIfApplicable(it)
		}
		return true
	}

	@Override
	boolean trigger() {
		(getAccurestContracts().values().flatten() as Collection).each { GroovyDsl groovyDsl ->
			sendMessageIfApplicable(groovyDsl)
		}
		return true
	}

	@Override
	Map> labels() {
		return getAccurestContracts().collectEntries {
			[(it.key.toColonSeparatedDependencyNotation()) : it.value.collect { it.label }]
		} as Map>
	}

	private void sendMessageIfApplicable(GroovyDsl groovyDsl) {
		if (!groovyDsl.outputMessage) {
			return
		}
		AccurestMessage message = accurestMessaging.create(groovyDsl.outputMessage?.body?.clientValue,
				groovyDsl.outputMessage?.headers?.asStubSideMap())
		accurestMessaging.send(message, groovyDsl.outputMessage.sentTo.clientValue)
	}

	private URL returnStubUrlIfMatches(boolean condition) {
		return condition ? stubServer.stubUrl : null
	}

	private void startStubServers(StubRunnerOptions stubRunnerOptions, StubConfiguration stubConfiguration, StubRepository repository) {
		List mappings = repository.getProjectDescriptors()
		Collection contracts = repository.accurestContracts
		Integer port = stubRunnerOptions.port(stubConfiguration)
		if (port) {
			stubServer = new StubServer(port, stubConfiguration, mappings, contracts).start()
		} else {
			stubServer =  portScanner.tryToExecuteWithFreePort { int availablePort ->
				return new StubServer(availablePort, stubConfiguration, mappings, contracts).start()
			}
		}
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy